后端程序员之路 8、一种内存kv数据库的实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了后端程序员之路 8、一种内存kv数据库的实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2023字,纯文字阅读大概需要3分钟。
内容图文
![后端程序员之路 8、一种内存kv数据库的实现](/upload/InfoBanner/zyjiaocheng/477/69e61b409443440b868e04a510d0f54d.jpg)
键值(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数据库的实现
标签:解析 重命名 nbsp 多个 return time 自己的 doc 基本
本文系统来源:http://www.cnblogs.com/zapline/p/6518172.html
内容总结
以上是互联网集市为您收集整理的后端程序员之路 8、一种内存kv数据库的实现全部内容,希望文章能够帮你解决后端程序员之路 8、一种内存kv数据库的实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。