因为redis是单线程运行的,若是一次操做的value很大会对整个redis的响应时间形成负面影响,因此业务上一般会以如下方式进行分拆。redis
每次都是整存整取api
这种操做通常都是每次整存整取,这种状况能够尝试将对象拆分红多个key-value,使用multiGet获取值,这样分拆意义在于分拆操做的压力,将操做压力平摊到多个redis实例,下降对于单个redis的io压力。线程
每次只存取部分数据指针
一样能够拆成几个key-value,也能够将这些存储在一个hash中,每一个field表明具体属性,使用hget,hmget来获取部分value,使用hset,hmset来更新部分属性。对象
一样能够将这部分元素拆分,以hash为例,正常的流程是:hget(hashKey, field);hset(hashKey, field, value)。 如今能够固定一个桶数量,好比1w,每次存取的时候,先在本地计算field的hash值,对1w取模,肯定field落在哪一个key上。内存
newHashKey = hashKey + ( hash(field) % 10000); hset (newHashKey, field, value) ; hget(newHashKey, field)路由
set,zset,list作法相似。get
若是key个数过多会带来更多的内存占用空间:hash
减小key个数能够减小对内存的消耗,能够参考hash结构存储,将多个key存储在一个hash结构中。it
组合那些key自己强相关性的,好比key表明一个对象,m每一个key是对象的一个属性,按照这种方式设置一个新的key-hash的结构,原先的key做为这个新hash field。
好比:
将user.zhangsan.id= 123,user.zhangsan.age = 18,user.zhangsan.country = china 改为 key = user.zhangsan field:id = 123 field:age = 18 field:country = china
若是key自己没有相关性,能够预估总量,对一些场景预分固定的桶数量。
好比有2亿key,按照一个hash存储100个field来算,须要200w个桶,这样能够按照200w个固定桶数量作取模,hash(123456) % 200w,好比算出3个key的桶分别是1,2,3。调用存储api hset(key, field, value),读取时用hget(key,field)。 建议分桶数量100合适。
使用Bloom的场景每每是数据量极大的状况,这种状况下,bitmap和bloom使用空间比较大。
若是bitmap比较大,能够拆分红多个小的bitmap,能够经过结合hash方式,将key路由到hash上对应的bitmap上,将不一样的key分配给不一样的bitmap,而不是全部小的bitmap看成一个总体,这样每次请求都只要取redis中的一个key便可。