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;

  • 相关阅读:
    自定义UILabel的对齐方式
    获取iOS系统版本 --- UIDevice的使用
    iOS 照片多选
    iOS 手势+触摸事件
    IOS消息推送
    设置tableViewCell的背景颜色
    IOS_修改TableView的删除按钮的文本
    UIScrollView控件实现轮播图
    判断设备是不是第一次进入应用
    英语口语
  • 原文地址:https://www.cnblogs.com/zapline/p/6518172.html
Copyright © 2011-2022 走看看