国产探花免费观看_亚洲丰满少妇自慰呻吟_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;
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 仲巴县| 虹口区| 扎赉特旗| 南川市| 汝城县| 蓬安县| 平顶山市| 台南市| 新源县| 康平县| 天台县| 西华县| 罗田县| 连城县| 本溪市| 虎林市| 乐清市| 三门县| 张家界市| 德阳市| 无棣县| 屏东市| 和顺县| 武强县| 临澧县| 和林格尔县| 和龙市| 邵东县| 葵青区| 汨罗市| 河源市| 嵊州市| 滕州市| 海门市| 法库县| 黔江区| 邛崃市| 焦作市| 邓州市| 徐州市| 镇巴县|