# shm_hash **Repository Path**: ghuazo/shm_hash ## Basic Information - **Project Name**: shm_hash - **Description**: 在共享内存上使用多阶hash 数据结构保存kv数据的一个缓存。主要用于本地的缓存服务,tps在30万左右。 - **Primary Language**: C++ - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2023-06-24 - **Last Updated**: 2023-06-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 在当前微服务的结构中,缓存有远端的缓存,常用redis或者mongo,本地的缓存使用进程自己的内存。但是一个尴尬的事情是,我们经常为了性能在 一个服务里自己的内存里进行缓存数据,多个服务要缓存多份数据。当这样设计的时候,肯定觉得很别扭,占用内存大,每个服务都要进行缓存的重建和预热。 所以缓存缺少一级就是节点级的缓存被多个服务所共享。在缓存的设计里,分为三级缓存,如远端缓存(redis/mongo),本地节点缓存,每个进程自己的内存缓存。 本代码使用共享内存作为节点级别的缓存,可被本机器节点多个服务所共享使用。本机24核,32G内存,一个set和一个get 2个操作,1000万KEY,测试得是30万左右tps,因为是2个操作,所以理论上的qps是60万。 ![输入图片说明](image.png) # 1 健壮性保证 在共享内存上使用数据容器,如boost有实现,如map,vector等。但是这些都不能提供健壮性保证,因为当一个进程写数据到共享内存的试试,这时可能进程崩溃了,数据结构的维护可能就写到了一半,这时数据结构,就损坏了,没法使用。本库提供确保了数据的一致性和健壮性,使用简单的hash表数据结构。运行过程中始终保存运行的信息,任何一个写操作,都会检查当前数据结构的完整性,如果不完整,会对数据就行回滚,修复数据结构。在读写操作的线程安全上,写操作是串行的,使用进程共享级别的锁。当一个程序持有写锁崩溃后,这时锁没释放,会造程其他程序死锁。本库设置了健壮性锁,确保,持有锁的进程死了后会解锁,同时回滚事务,修复数据异常。 # 2 读写安全 本程序作为库使用,没有独立运行程序,类似sqlite等。多个写进程,写操作时,需要获取锁,写操作是串行的。读操作是多个可并行的,使用无锁读取,不需要获取锁。 # 3 数据结构 本库使用多阶hash,hash 表存key,数据存放到另外的内存块上,索引和数据分离。我们的hash表一般key冲突时使用链表解决冲突,这样查询时会遍历链表,查询速度不可控。同时,链表扩容时,需要移动和拷贝数据,比较麻烦。使用多阶hash,查询和插入是可控的,内存的使用也是可预计的。