zoukankan      html  css  js  c++  java
  • 后端程序员之路 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;

  • 相关阅读:
    数据结构——自学笔记一
    Xmind软件——xmind 8 pro下载激活推荐!!
    Java学习笔记之面向对象、static关键字
    解决“var/log/sysstat/sa21: 没有那个文件或目录 请检查是否允许数据收集”
    c++.net学习笔记
    Android Studio学习-连接真机测试教学
    Servlet总结二(文件路径)
    Servlet总结一
    多线程的使用
    Lock
  • 原文地址:https://www.cnblogs.com/zapline/p/6518172.html
Copyright © 2011-2022 走看看