redis大key如何删除 什么是大KeyString类型 值超过10KB 单个字符串过大Hash/List/Set/Zset类型 元素个数超过5000个 成员数量过多Hash类型 成员总Value超过10MB大Key的危害1.Redis单线程工作造成主线程阻塞服务卡顿2.Reds分片集群情况下造成数据倾斜3.网络传输大key,造成网络拥堵4.操作大Key消耗内存资源造成性能下降大Key的排查方案1.Redis-cli提供了–bigkeys参数能够以遍历的方式分析Redis实例中的所有Key并返回每种数据类型中Top1的大Key2.通过SCAN命令配合类型查询命令可以自定义扫描逻辑减小对Redis性能的影响。# 使用SCAN命令迭代所有键 redis-cliSCAN0COUNT1000# 对特定Key分析 #STRING类型STRLENkey #LIST类型LLENkey #HASH类型HLENkey #SET类型SCARDkey #ZSET类型ZCARDkey大Key解决方案String类型拆分# 原大KeySETuser:1001:profile{大量JSON数据}# 拆分后SETuser:1001:profile:base基本信息SETuser:1001:profile:detail详细信息SETuser:1001:profile:extend扩展信息Hash类型拆分在客户端定义一个分拆数量N对field计算哈希值取模确定该field落在哪个Key上# 拆分逻辑示例N10# 拆分成10个Keyfield_hashhash(field)%Nkeyfuser:{user_id}:shard:{field_hash}hset(key,field,value)压缩大Key对JSON、XML文本数据等可压缩数据在序列化时启动压缩算法使用GZIP、Snappy等压缩算法使用Protocol Buffers等二进制序列化协议大Key删除方案禁止直接使用DEL命令删除大Key这会造成Redis长时间阻塞1.UNLINK命令通过异步方式清理Key避免阻塞主线程。2.对于集合类型使用SCAN命令分批读取然后逐个删除。lua 代码解读复制代码--分批删除Hash中的字段 local cursor0repeat local resultredis.call(HSCAN,KEYS[1],cursor,COUNT,100)cursorresult[1]local fieldsresult[2]fori1,#fields,2doredis.call(HDEL,KEYS[1],fields[i])end until cursor0--最后删除空Keyredis.call(DEL,KEYS[1])