bigkey是指key对应的value所占用的内存空间比较大。例如一个字符串类型的value可以最大存到512MB,一个列表类型的value最多可以存储2^32-1个元素。如果按照数据结构来细分的话,一般分为字符串类型bigkey和非字符串类型bigkey。
字符串类型:体现在单个value值很大,一般认为超过10kb就是bigkey。
非字符串类型:哈希、列表、集合、有序集合体现在元素个数过多。
bigkey无论在空间复杂度还是时间复杂度都不太友好。
bigkey的危害主要体现在四个方面:
(1)内存空间不均匀
例如在Redis Cluster中,bigkey会造成节点的内存空间使用不均匀。
(2)超时阻塞:由于Redis单线程的特性,对元素较多的hash,list,zset做运算会耗时比较久,也就意味着阻塞redis的可能性增加。
(3)网络阻塞:每次获取bigkey产生的网络流量较大。
(4)CPU飙升:对bigkey序列化反序列化导致CPU飙升。
(1)优雅的kye结构的设计
key可以遵循下面几个约定:
遵循基本格式:[业务名称]:[数据名]:[id]
长度不超过44字节
不包含特殊字符
(2)拆分
对big key存储的数据(big value)进行拆分,变成value1、value2、valuen等等。
例如big value是个大json通过mset的方式,将这个key的内容打散到各个实例中,或者一个hash,每个field代表一个具体属性,通过hget、hmget获取部分value,hset,hmset来更新部分属性。
例如big value是个大list,可以将list拆成多个list。