1 Star 0 Fork 2

zhaoyao / shm_hash

forked from wuyi / shm_hash 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 2.43 KB
一键复制 编辑 原始数据 按行查看 历史
wuyi 提交于 2022-02-23 08:25 . update README.md.

在当前微服务的结构中,缓存有远端的缓存,常用redis或者mongo,本地的缓存使用进程自己的内存。但是一个尴尬的事情是,我们经常为了性能在

一个服务里自己的内存里进行缓存数据,多个服务要缓存多份数据。当这样设计的时候,肯定觉得很别扭,占用内存大,每个服务都要进行缓存的重建和预热。

所以缓存缺少一级就是节点级的缓存被多个服务所共享。在缓存的设计里,分为三级缓存,如远端缓存(redis/mongo),本地节点缓存,每个进程自己的内存缓存。

本代码使用共享内存作为节点级别的缓存,可被本机器节点多个服务所共享使用。本机24核,32G内存,一个set和一个get 2个操作,1000万KEY,测试得是30万左右tps,因为是2个操作,所以理论上的qps是60万。

输入图片说明

1 健壮性保证

在共享内存上使用数据容器,如boost有实现,如map,vector等。但是这些都不能提供健壮性保证,因为当一个进程写数据到共享内存的试试,这时可能进程崩溃了,数据结构的维护可能就写到了一半,这时数据结构,就损坏了,没法使用。本库提供确保了数据的一致性和健壮性,使用简单的hash表数据结构。运行过程中始终保存运行的信息,任何一个写操作,都会检查当前数据结构的完整性,如果不完整,会对数据就行回滚,修复数据结构。在读写操作的线程安全上,写操作是串行的,使用进程共享级别的锁。当一个程序持有写锁崩溃后,这时锁没释放,会造程其他程序死锁。本库设置了健壮性锁,确保,持有锁的进程死了后会解锁,同时回滚事务,修复数据异常。

2 读写安全

本程序作为库使用,没有独立运行程序,类似sqlite等。多个写进程,写操作时,需要获取锁,写操作是串行的。读操作是多个可并行的,使用无锁读取,不需要获取锁。

3 数据结构

本库使用多阶hash,hash 表存key,数据存放到另外的内存块上,索引和数据分离。我们的hash表一般key冲突时使用链表解决冲突,这样查询时会遍历链表,查询速度不可控。同时,链表扩容时,需要移动和拷贝数据,比较麻烦。使用多阶hash,查询和插入是可控的,内存的使用也是可预计的。

C++
1
https://gitee.com/zhaoyao219/shm_hash.git
git@gitee.com:zhaoyao219/shm_hash.git
zhaoyao219
shm_hash
shm_hash
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891