• 后端程序员之路 8、一种内存kv数据库的实现


    键值(Key-Value)存储数据库,这是一种NoSQL(非关系型数据库)模型,其数据按照键值对的形式进行组织、索引和存储。KV存储非常适合不涉及过多数据关系业务关系的业务数据,同时能有效减少读写磁盘的次数,比SQL数据库存储拥有更好的读写性能。
    kv数据库有leveldb、redis、rocksdb等一大堆应用广泛又很可靠的开源实现,然而这里还是有一份自己的超简单实现。

    1、对外接口,基本跟redis常用接口一致
    get、put、del、save、size

    2、提供db_manager
    负责解析配置文件,得到多个db的db_name、db_file、max_size和expire_time
    提供get_db、save和terminate方法

    3、db_mem_impl有两个锁,用于不同场景
    pthread_rwlock_t _rwlock;
    用于接口的读写操作
    pthread_mutex_t _dumplock;
    用于save、_restore,以及特殊的stats需求

    4、save和_restore时的操作
    save先写临时文件再重命名
    只读写未超时的node

    5、put时的操作
    如果key存在,更新node,并更新_memdb_list
    如果超出size,或者_memdb_list里的尾部数据超时了,则_memdb_list的尾部数据从_memdb_map去除

    6、一些结构的定义
    struct cfb_key_t {
        uint64_t ukey;
        uint64_t dkey;
        cfb_key_t(uint64_t user_key, uint64_t doc_key): ukey(user_key), dkey(doc_key) {};
        cfb_key_t(): ukey(0), dkey(0) {};
    };
    struct cfb_key_hash_t
    {
        std::size_t operator()(const cfb_key_t& key) const{
            return std::hash<uint64_t>()(key.ukey) ^
                   (std::hash<uint64_t>()(key.dkey) << 1);
        }
    };
    typedef std::unordered_map< cfb_key_t, cfb_value_t, cfb_key_hash_t,cfb_key_equal_t > cfb_dictionary;

    struct memdb_value_t {
            cfb_key_t key;
            cfb_value_t val;
            uint32_t expire_ts;
        };
    struct key_hasher_t {
        std::size_t operator()(const cfb_key_t& k) const {
            return (k.ukey << 32 | k.ukey >> 32) ^ k.dkey;
        }   
    };
    typedef xxx::dlist_t<memdb_value_t> memdb_list_t;
    typedef std::unordered_map<cfb_key_t, memdb_list_t::node_t*, key_hasher_t, key_equaler_t> memdb_map_t;

  • 相关阅读:
    Oracle: 一个很让人纠结的sql问题,给自己长个记性
    TextInfo list of CultureInfo
    一个简单的面试题称粮食
    C++ 中什么是内联函数(zhuan)
    C/C++ 到 shellcode 过程
    常量指针与指针常量的区别(转帖)
    分清函数指针和指针函数
    如何编写自己的缓冲区溢出利用程序? (zz)
    动态获取API函数地址对抗win7 aslr安全机制(转)
    暴力搜索内存空间获得 Api 的线性地址
  • 原文地址:https://www.cnblogs.com/zapline/p/6518172.html
Copyright © 2020-2023  润新知