键值(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;

后端程序员之路 8、一种内存kv数据库的实现的更多相关文章

  1. 后端程序员之路 4、一种monitor的做法

    record_t包含_sum._count._time_stamp._max._min最基础的一条记录,可以用来记录最大值.最小值.计数.总和metric_t含有RECORD_NUM(6)份recor ...

  2. 后端程序员之路 16、信息熵 、决策树、ID3

    信息论的熵 - guisu,程序人生. 逆水行舟,不进则退. - 博客频道 - CSDN.NEThttp://blog.csdn.net/hguisu/article/details/27305435 ...

  3. 后端程序员之路 59、go uiprogress

    gosuri/uiprogress: A go library to render progress bars in terminal applicationshttps://github.com/g ...

  4. 后端程序员之路 45、nginx CORS 跨域

    在提供api给其它应用使用时,有时我们会要限制它的跨域使用,而有时,我们又要用CORS来打破AJAX只能同源使用的限制 跨域资源共享 CORS 详解 - 阮一峰的网络日志http://www.ruan ...

  5. 后端程序员之路 43、Redis list

    Redis数据类型之LIST类型 - Web程序猿 - 博客频道 - CSDN.NEThttp://blog.csdn.net/thinkercode/article/details/46565051 ...

  6. 后端程序员之路 37、Akka、Actor、Scala初窥

    Akkahttp://akka.io/ Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用,是一个广泛运用的分布式应用框架. ...

  7. 后端程序员之路 33、Index搜索引擎实现分析2-对外接口和大体流程

    # index_manager的单例是index server对外的唯一接口,part_indexer是index搜索的核心部分,index_manager持有了一组part_indexer. typ ...

  8. 后端程序员之路 26、CAP理论

    可能是CAP理论的最好解释 - 西代零零发 - 博客频道 - CSDN.NEThttp://blog.csdn.net/dc_726/article/details/42784237 CAP理论 - ...

  9. 后端程序员之路 22、RESTful API

    理解RESTful架构 - 阮一峰的网络日志http://www.ruanyifeng.com/blog/2011/09/restful.html RESTful API 设计指南 - 阮一峰的网络日 ...

随机推荐

  1. CENTOS7 使用YUM安装MARIADB

    现在在服务器配置数据库,一般都会直接配置MariaDB,它可以实现mysql数据库连接. 1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server ...

  2. AtCoder Beginner Contest 171

    比赛链接:https://atcoder.jp/contests/abc171/tasks A - αlphabet 题意 给出一个字母,如果为大写输出 'A',如果为小写输出 'a' . 代码 #i ...

  3. enumerate() -- Python

    #!usr/bin/env python #coding:utf-8 ''' enumerate()说明: 1.enumerate()是Python的内置函数: 2.enumerate字面上是枚举.列 ...

  4. 【Azure 微服务】基于已经存在的虚拟网络(VNET)及子网创建新的Service Fabric并且为所有节点配置自定义DNS服务

    问题描述 创建新的Service Fabric集群,可以通过门户,Powershell命令,或者是ARM模板.但是通过门户和PowerShell命令时,创建的SF集群都会自动新建一个虚拟网络而无法使用 ...

  5. nginx+lua实现灰度发布/waf防火墙

    nginx+lua 实现灰度发布 waf防火墙 课程链接:[课程]Nginx 与 Lua 实现灰度发布与 WAF 防火墙(完)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 参考博客 Nginx ...

  6. WOJ1022 Competition of Programming 贪心 WOJ1023 Division dp

    title: WOJ1022 Competition of Programming 贪心 date: 2020-03-19 13:43:00 categories: acm tags: [acm,wo ...

  7. 334A Candy Bags

    A. Candy Bags time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  8. 基于HSV彩色空间与直方图信息的植物叶脉FFCM算法提取

    宣旭峰,王美丽,张建锋. 基于HSV彩色空间与直方图信息的植物叶脉FFCM算法提取[J/OL]. 计算机应用研究,2018,(08):1-7. (2017-07-21)[2017-10-09]. ht ...

  9. 20 个使用原生 JavaScript 实现的 Web 项目

    20 个使用原生 JavaScript 实现的 Web 项目 20 vanilla JavaScript Web Projects https://github.com/learning-js-by- ...

  10. ES6 ...rest In Action

    ES6 ...rest In Action const arr = [ 2.48, 13.77, 8.64, 20.17, 8.94, 8.07, 12.05, 5.71, 17.54, 2.63 ] ...