Redis大Key问题
文章目录
- 1.什么是大key
- 2.如何衡量大key
- 3.大key有什么影响
- 4.大key是如何产生的
- 5.如何发现大key
- 6.如何解决大key
1.什么是大key
Redis key和value的最大限制都是512M,超过了Redis会拒绝这个操作,并返回一个错误信息给客户端。例如,可能会收到类似ERR key too big的消息,具体的错误信息可能依据Redis版本的不同而有所变化。
但我们这里讨论的大key是指的value很大,并不是value很大。虽然key大也会引起同样的问题,但是实际使用中,key作为一个标识一般不会很大,而value具体存一些热点数据,用户详情、商品详情等,可以能会比较大。
2.如何衡量大key
没有统一衡量标准,需要结合具体业务场景和性能需求。例如大key是否导致带宽承受不住、tps达不到、cpu利用率飙升、内存不够等。
比如你的业务需要Redis支持100tps,每个value 1M。那么需要的带宽: 100 * 1M 1024 *8 MBs,看看你的带宽是否支持,如果支持不了,那就是大key了。
举例衡量:
对于 String 类型的 Value 值,值超过 10MB(数据值太大)。对于 Set 、 ZSet、List、Hash类型的 Value 值,含有的成员数量为 10000 个(成员数量多)或成员总大小超过100M。
3.大key有什么影响
1. redis工作线程阻塞/客户端超时阻塞
redis是单线程执行命令的,当操作一个大key时(例如删除、获取或更新),这个操作会占用主线程较长时间,导致其他客户端请求被阻塞,进而引起响应时间上升和超时。
2. 网络阻塞
大key在网络传输过程中会产生较大的流量,特别是对于频繁访问的大key,可能会占满带宽,导致网络拥塞。
3. 内存占用不均
在集群模式下,如果大key存到了某个节点上,那么这个节点的内存与其他节点相比,可能会被更多的占用。
4. 负载均衡不均
当操作一个大Key时(例如删除、获取或更新),这个操作会占用主线程较长时间、占用较多带宽,表现就是节点负载比较大。
4.大key是如何产生的
1. 技术设计不当
如把redis集合 List当消息队列用,生成速度又大于消费速度,导致List元素堆积过多。
2. 未切分处理
通过单个key来存储过多的信息,比如一个key对应一个用户的全部会话信息,而没有进行适当的分割。
5.如何发现大key
1. 使用 redis-cli 的 --bigkeys 参数
redis-cli --bigkeys
这个命令会遍历整个数据库,并输出一些统计信息,包括每个数据类型的最大的几个key。这是一个简单直接的方式,但是请注意它会在生产环境中产生一定的负载,尤其是在数据库规模较大的情况下。
2. 使用第三方工具等等
6.如何解决大key
1. 清理集合中的无效数据
把不用的元素主动移除、或者设置过期时间。
2. 压缩对应的大 key 的 Value
3. 针对大 key 进行拆分
用多个key把value拆分存。如存整个用户信息 【key: userId value: userInfo】,userInfo可以切分为 【userId-name: nameInfo】、【userId-age : ageInfo】等