国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

mysql實現本地keyvalue數據庫緩存示例

2024-07-24 12:47:50
字體:
來源:轉載
供稿:網友

Key-Value緩存有很多,用的較多的是memcache、redis,他們都是以獨立服務的形式運行,在工作中有時需要嵌入一個本地的key-value緩存,當然已經有LevelDb等,但感覺還是太重量級了。

本文實現了一種超級輕量的緩存,

1、實現代碼僅僅需要400行;

2、性能高效,value長度在1K時測試速度在每秒200萬左右

3、緩存是映射到文件中的,所以沒有malloc、free的開銷,以及帶來的內存泄露、內存碎片等;

4、如果服務掛掉了,重啟后緩存內容繼續存在;

5、如果把緩存映射到磁盤文件就算機器掛了,緩存中內容還是會存在,當然有可能會出現數據損壞的情況;

6、一定程度上實現了LRU淘汰算法,實現的LRU不是全局的只是一條鏈上的,所以只能說在一定程序上實現了;

7、穩定,已經在多個項目中運用,線上部署的機器有幾十臺,運行了大半年了沒出過問題;

8、普通的緩存key、value都是字符串的形式,此緩存的key、value都可以是class、struct對象結構使用更方便;

 老規矩直接上代碼:

 

復制代碼 代碼如下:

 template<typename K, typename V>
class HashTable
{
public:
    HashTable(const char *tablename, uint32_t tableLen, uint32_t nodeTotal);
    virtual ~HashTable();

    bool Add(K &key, V &value)
    {
        AutoLock autoLock(m_MutexLock);

        //check is exist
        uint32_t nodeId = GetIdByKey(key);
        if(nodeId != m_InvalidId) return false;

        nodeId = GetFreeNode();
        if(nodeId == m_InvalidId) return false;

        uint32_t hashCode = key.HashCode();
        Entry *tmpNode = m_EntryAddr + nodeId;
        tmpNode->m_Key = key;
        tmpNode->m_Code = hashCode;
        tmpNode->m_Value = value;

        uint32_t index = hashCode % m_HeadAddr->m_TableLen;
        AddNodeToHead(index, nodeId);

        return true;
    }

    bool Del(K &key)
    {
        AutoLock autoLock(m_MutexLock);

        uint32_t nodeId = GetIdByKey(key);
        if(nodeId == m_InvalidId) return false;

        uint32_t index = key.HashCode() % m_HeadAddr->m_TableLen;
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巩义市| 凤庆县| 和平区| 沂源县| 佛冈县| 略阳县| 赤水市| 龙门县| 连城县| 阳高县| 平安县| 玉环县| 汶川县| 体育| 临汾市| 蒲城县| 肃北| 东乌珠穆沁旗| 江达县| 宣化县| 海淀区| 呼和浩特市| 雷山县| 胶南市| 喀喇沁旗| 中阳县| 乌鲁木齐县| 朝阳县| 连州市| 固安县| 山东省| 汉源县| 高密市| 银川市| 林甸县| 绥阳县| 胶州市| 西盟| 康定县| 东辽县| 五指山市|