【Redis】大key问题详解
目录
- 1、什么是大key
- 2、大key的危害
- 【1】阻塞风险
- 【2】网络阻塞
- 【3】内存不均
- 【4】持久化问题
- 3、如何发现大key
- 【1】使用内置命令
- 【2】使用memory命令(Redis 4.0+)
- 【3】使用scan命令
- 【4】监控工具
- 4、解决方案
- 【1】拆分大key
- 【2】使用合适的数据结构
- 【3】设置过期时间
- 【4】渐进式删除
- 【5】客户端缓存
- 5、最佳实践
- 【1】设计阶段预防
- 【2】监控告警
- 【3】读写优化
1、什么是大key
在redis中,大key通常指以下三种情况之一:
1、value过大:单个key的value体积过大(如字符串值超过10KB,集合/列表/哈希/有序集合元素过多)
2、元素过多:集合类型(hash/list/set/zset)中包含大量元素(如超过5000个元素)
3、结构复杂:key对应的数据结构嵌套过深或过于复杂
2、大key的危害
【1】阻塞风险
1、大key的读写操作会消耗更多CPU和内存。
2、可能会导致redis阻塞,影响其他请求的响应时间。
【2】网络阻塞
1、大key传输会占用大量带宽。
2、可能会导致集群节点间同步延迟。
【3】内存不均
1、在集群模式下,大key会导致数据分片不均衡。
2、可能造成某些节点内存压力过大。
【4】持久化问题
1、AOF重写和RDB生成时处理大key会变慢。
2、可能导致持久化失败或服务暂停。
3、如何发现大key
【1】使用内置命令
redis-cli --bigkeys #扫描并统计大key
【2】使用memory命令(Redis 4.0+)
MEMORY USAGE key_name #查看指定key的内存使用
【3】使用scan命令
redis-cli --scan --pattern '*' | while read key; do echo "$key: $(redis-cli memory usage "$key")"; done
【4】监控工具
1、RedisInsight
2、Redis Desktop Manager
4、解决方案
【1】拆分大key
1、将大hash拆分成多个小hash
2、对大list/set进行分片
【2】使用合适的数据结构
1、根据合适的业务场景使用合适的数据结构
【3】设置过期时间
1、EXPIRE key seconds
【4】渐进式删除
1、对大key删除,使用UNLINK代替DEL(非阻塞)
2、对集合类型,分批删除
【5】客户端缓存
1、对不常变更的大key使用客户端缓存
5、最佳实践
【1】设计阶段预防
1、预估数据规模,提前设计合理的key结构
2、避免单个key存储过多数据
【2】监控告警
1、设置大key监控告警
2、定期扫描和清理
【3】读写优化
1、对大key使用pipeline减少网络往返
2、避免对大key进行范围操作