这篇文章主要介绍了控制Redis的hash的field中的过期时间问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
需求场景
在业务中有些数据因为历史原因用的hash
结构存储数据,但是后期需求要求其中某个field
需要按照一些规则去过期,这个时候原来的逻辑懒得改,可以利用redis
的Zset
或者mq
的延时队列去做过期设置.
方案一使用redis的Zset配置定时任务
捞个图
demo需要清缓存的redis
的hash
结构如下
然后我们再每次往Agent
这个hash
结构存储数据的时候,同时向AgentExpire
为key
的ZSET
数据结构存储一份数据(在存数据的时候可以在当前时间上增加过期时间),这个数据的key
是hash
结构中的field
的值,value
是过期时间戳(毫秒级)
如下图所示:
然后用一个定时任务(我这里用的xxl-job,大家可以自己选择)定时去扫描这个ZSET
里面score
小于当前时间的元素,也就是使用ZSET
的rangeByScore
命令:
上面在向Zset
中存数据的时候已经增加了过期时间,那么当时间小于当前时间时就过期了,代表hash
中对应field
的数据要被delete
long currentTimeMillis = System.currentTimeMillis();
//扫描key为AgentExpire的zset中时间在 0~currentTimeMillis当前时间范围内的数据
Set<String> keys = redisTemplate.opsForZSet().rangeByScore("AgentExpire", 0, currentTimeMillis);
//然后遍历删除即可
for (String key : keys) {
Boolean hashResult = stringRedisTemplate.opsForHash().hasKey("xxxxxx", key);
if(hashResult){
stringRedisTemplate.opsForHash().delete(recommenKey, key);
stringRedisTemplate.opsForZSet().remove(SelectionRecommenAspect.selectionRecommendZset, key);
}
}
方案二使用mq延时队列
延时队列的配置可以参考我另一篇文章
在延时队列消费者处增加上述过期代码即可
long currentTimeMillis = System.currentTimeMillis();
Set<String> expireKeys =
//扫描key为AgentExpire的zset中时间在 0~currentTimeMillis当前时间范围内的数据
redisTemplate.opsForZSet().rangeByScore("AgentExpire", 0, currentTimeMillis);
综上
使用zset
的话开发量少,但是定时job
一直刷容易浪费资源,mq延时队列
更精确
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程学习网。
本文标题为:控制Redis的hash的field中的过期时间
- redis清除数据 2023-09-13
- Numpy中如何创建矩阵并等间隔抽取数据 2023-07-28
- 在阿里云CentOS 6.8上安装Redis 2023-09-12
- SQL Server 2022 AlwaysOn新特性之包含可用性组详解 2023-07-29
- SQLSERVER调用C#的代码实现 2023-07-29
- MySQL8.0.28安装教程详细图解(windows 64位) 2023-07-26
- 基于Python制作一个简单的文章搜索工具 2023-07-28
- Mongodb启动报错完美解决方案:about to fork child process,waiting until server is ready for connections. 2023-07-16
- Oracle 删除大量表记录操作分析总结 2023-07-23
- 搭建单机Redis缓存服务的实现 2023-07-13