Redis的大key怎么处理
通俗易懂的讲,Big Key就是某个key对应的value很大,占用的redis空间很大,本质上是大value问题。key往往是程序可以自行设置的,value往往不受程序控制,因此可能导致value很大。
redis中这些Big Key对应的value值很大,在序列化/反序列化过程中花费的时间很大,因此当我们操作Big Key时,通常比较耗时,这就可能导致redis发生阻塞,从而降低redis性能。
用几个实际的例子对大Key的特征进行描述:
- 一个String类型的Key,它的值为5MB(数据过大);
- 一个List类型的Key,它的列表数量为20000个(列表数量过多);
- 一个ZSet类型的Key,它的成员数量为10000个(成员数量过多);
- 一个Hash格式的Key,它的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大);
如何解决Big Key问题?
要解决Big Key问题,无非就是减小key对应的value值的大小,也就是对于String数据结构的话,减少存储的字符串的长度;对于List、Hash、Set、ZSet数据结构则是减少集合中元素的个数。
1、对大Key进行拆分
将一个Big Key拆分为多个key-value这样的小Key,并确保每个key的成员数量或者大小在合理范围内,然后再进行存储,通过get不同的key或者使用mget批量获取。
2、压缩value
使用序列化、压缩算法将key的大小控制在合理范围内,但是需要注意序列化、反序列化都会带来一定的消耗。如果压缩后,value还是很大,那么可以进一步对key进行拆分。在应用程序层面对数据进行压缩后再存入 Redis,可以显著减小 key 的大小,但需要注意这会增加 CPU 使用率
3、监控Redis的内存、网络带宽、超时等指标
通过监控系统并设置合理的Redis内存报警阈值来提醒我们此时可能有大Key正在产生,如:Redis内存使用率超过70%,Redis内存1小时内增长率超过20%等。对Redis中的大Key进行清理,从Redis中删除此类数据。Redis自4.0起提供了UNLINK命令,该命令能够以非阻塞的方式缓慢逐步的清理传入的Key,通过UNLINK,你可以安全的删除大Key甚至特大Key。
4、定期清理失效数据
如果某个Key有业务不断以增量方式写入大量的数据,并且忽略了其时效性,这样会导致大量的失效数据堆积。可以通过定时任务的方式,对失效数据进行清理。
5、设定合理的 TTL (Time To Live)
对于那些有生命周期的数据,设置适当的 TTL 可以自动清理过期的数据,减少不必要的大 key 形成。
好文参考:Redis中什么是Big Key(大key)问题?如何解决Big Key问题?_redis bigkey-CSDN博客
好文参考:Redis大key有什么危害?如何排查和处理?_grafana redis 大key-CSDN博客