Redis大key问题及解读
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进行范围操作
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
通过 Redis 实现 RPC 远程方法调用(支持多种编程语言)
这篇文章主要介绍了通过 Redis 实现 RPC 远程方法调用,支持多种编程语言,本文就以Ruby和Python为例,给出了实现代码,需要的朋友可以参考下2014-09-09


最新评论