Redis

关注公众号 jb51net

关闭
首页 > 数据库 > Redis > Redis中big keys发现与解决

Redis中big keys发现与解决过程

作者:小码A梦

文章从bigkeys的定义、产生原因、危害、如何发现以及处理方法等方面详细介绍了Redis中bigkeys的问题,bigkeys会导致请求响应慢、网络卡顿、数据丢失等问题,需要通过异步删除、拆分key等方法进行处理

在使用 Redis 时,可能会出现请求响应慢、网络卡顿、数据丢失的情况。排查问题的时候,发现是 big keys 的问题。

什么是 big keys

在 Redis 中,一个字符串类型最大可以达到 512MB,其他非字符串类型的集合类型(list、set、hash、zset等)可以存储 40 亿个(2^32-1),但在实际业务场景中,并不需要这么大的内存。而且对于一个请求量大的互联网软件,对数据的大小要求更加的严格。如果达到如下标准,就可以认定是 big keys 了:

以上对 big keys 的判断标准并不是唯一,只是一个大题的标准。在实际业务开发中,对 big keys 的判断是需要根据具体的使用场景做不同的判断。比如操作某个 key 导致请求响应时间变慢,那么这个 key 就可以判定成 big keys。

big keys 是如何产生的

一般来说,big keys 的产生都是由于程序的设计不当,或者对数据的规模没有一个大体的估算。比如:

以上几种类型都是在实际运维中遇到的。在开发中需要根据预估的数据大小来合理的设计缓存数据。

big keys 的危害

在系统中如果存在 big keys,会导致请求数据响应变慢、请求超时或者系统不稳定。

1、响应变慢、超时阻塞

2、网络拥塞

3、内存分布不均

如何发现 big keys

Redis4.0 后提供了 --bigkeys命令,比如:

./redis-cli --bigkeys

获取每个数据类型最大的 big keys,同时给出每个类型键的个数和平均大小。因为 Redis 是单线程工作的,为了减少对线上请求的影响,执行--bigkeys命令需要注意一下几点:

big keys 处理

异步删除 big keys

找到 big keys 之后,首先需要删除对应的big keys,但是使用 del 命令删除 big keys 是比较耗时的。Redis4.0 后可以使用 unlink 删除,和 del 命令相比,unlink 是非阻塞的异步删除。

非字符串的 big keys,使用 hscan、sscan、zscan 方式渐进式删除,同时要注意防止big keys 过期时间自动删除问题(例如一个 200 万的 zset 设置1小时过期,会触发del操作,造成阻塞)。

big key 拆分

字符串类型的数据是减少字符串的长度,将一个字符串拆成几个小的字符串。非字符串的是减少元素数量。这些都是讲一个 key 拆成多个 key,比如:

如果 big keys 无法避免,那获取数据尽量不要把所有的数据都取出来,就使用分段的方式取出数据。删除的方式也类似,分段删除数据。

总结

要从几个方面分析:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文