Redis大Key问题

一、背景

在sit环境中,测试批量上传500个网元进行批量激活,突然发现激活任务执行失败,而且系统其他功能接口响应缓慢,系统几乎卡死,服务器OOM。

二、问题分析

分析代码发现,此功能激活子任务把Redis的任务信息全部查询出来,然后放入Redis中,这500个子任务大概任务信息数据量达到37W+。直接导致Redis内存占用率过高,服务器OOM。

三、解决方案

针对修复激活子任务场景,先删除记录,再发送MQ消息,避免重复消费校验住。
旧代码如下,其中entries(statusRedisKey)会将statusRedisKey的所有信息全部查出,查询出的数据量很大!

Map<String,TaskVo> taskMap = RedisUtils.getRedisOperator().getRedisTemplate().opsForHash().entries(statusRedisKey);
// 然后执行RedisUtils.getRedisOperator().getRedisTemplate().opsForHash().put(statusRedisKey,taskVos)

优化后代码

Map<String,TaskVo> taskMap = RedisUtils.getRedisOperator().getRedisTemplate().opsForHash().get(statusRedisKey);
//然后执行put

entries方法会查询所有数据,当数据量超大时候,存入Redis时候,再进行其它业务操作,会引发OOM。

四、大Key的清理

1:低峰期删除:选择业务流量低的时期清理缓存(无法彻底解决)。
2:分批定时定量清理:一次删除一部分,防止一次性删除大批量数据导致阻塞。
3:异步删除:用unlink代替del删除,只是将键与键空间断开连接,实际的删除将稍后异步进行,以非阻塞的方式,逐步的清理插入的key,不阻塞主线程。

### Redis Key的常见场景 在实际应用中,RedisKey可能出现在多种业务场景下。以下是常见的几种情况: - **日志存储**:某些系统会将量的日志数据存入单个Redis键值对中,这些日志可能是JSON数组或其他结构化形式的数据[^1]。 - **缓存聚合对象**:当应用程序尝试将整个复杂对象(如用户的全部订单记录)一次性加载到Redis中时,可能会形成Key[^2]。 - **集合类数据结构滥用**:例如使用`Hash`、`List`或`Set`来保存量条目,而未考虑分片或者拆分策略。 ### 对系统性能的影响 #### 内存占用增加 Key直接导致内存消耗显著上升,尤其是在高并发环境下,多个客户端同时访问相同的Key可能导致服务器内存压力剧增。 #### 延迟提升 读写Key需要更多时间完成序列化/反序列化操作以及网络传输过程,从而增加了请求处理的时间开销。对于高频次调用的关键路径来说,这种延迟累积效应尤为明显。 #### RDB持久化的效率降低 由于RDB文件生成涉及全量快照机制,在存在Key的情况下,创建备份所需时间和资源都将成倍增长,甚至可能出现因耗尽磁盘空间而导致失败的情况。 #### AOF重写困难 AOF日志同样受制于Key的存在,因为每次更新都需要追加完整的修改指令至文件末尾;一旦触发后台压缩流程,则面临更复杂的计算负担。 ```python import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 示例代码展示如何检测是否存在潜在的Key def find_big_keys(pattern="*", max_size_kb=10): big_keys = [] for key in r.scan_iter(match=pattern): size_kb = r.memory_usage(key) / 1024 if size_kb > max_size_kb: big_keys.append((key, size_kb)) return big_keys print(find_big_keys()) ``` 上述脚本可以帮助识别当前数据库内的超标尺寸Keys,并据此采取相应措施优化其设计架构。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值