同步操作将从 wuyi/shm_hash 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
在当前微服务的结构中,缓存有远端的缓存,常用redis或者mongo,本地的缓存使用进程自己的内存。但是一个尴尬的事情是,我们经常为了性能在
一个服务里自己的内存里进行缓存数据,多个服务要缓存多份数据。当这样设计的时候,肯定觉得很别扭,占用内存大,每个服务都要进行缓存的重建和预热。
所以缓存缺少一级就是节点级的缓存被多个服务所共享。在缓存的设计里,分为三级缓存,如远端缓存(redis/mongo),本地节点缓存,每个进程自己的内存缓存。
本代码使用共享内存作为节点级别的缓存,可被本机器节点多个服务所共享使用。本机24核,32G内存,一个set和一个get 2个操作,1000万KEY,测试得是30万左右tps,因为是2个操作,所以理论上的qps是60万。
在共享内存上使用数据容器,如boost有实现,如map,vector等。但是这些都不能提供健壮性保证,因为当一个进程写数据到共享内存的试试,这时可能进程崩溃了,数据结构的维护可能就写到了一半,这时数据结构,就损坏了,没法使用。本库提供确保了数据的一致性和健壮性,使用简单的hash表数据结构。运行过程中始终保存运行的信息,任何一个写操作,都会检查当前数据结构的完整性,如果不完整,会对数据就行回滚,修复数据结构。在读写操作的线程安全上,写操作是串行的,使用进程共享级别的锁。当一个程序持有写锁崩溃后,这时锁没释放,会造程其他程序死锁。本库设置了健壮性锁,确保,持有锁的进程死了后会解锁,同时回滚事务,修复数据异常。
本程序作为库使用,没有独立运行程序,类似sqlite等。多个写进程,写操作时,需要获取锁,写操作是串行的。读操作是多个可并行的,使用无锁读取,不需要获取锁。
本库使用多阶hash,hash 表存key,数据存放到另外的内存块上,索引和数据分离。我们的hash表一般key冲突时使用链表解决冲突,这样查询时会遍历链表,查询速度不可控。同时,链表扩容时,需要移动和拷贝数据,比较麻烦。使用多阶hash,查询和插入是可控的,内存的使用也是可预计的。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。