控制Redis的hash的field中的过期时间

Mathilda ·
更新时间:2024-11-13
· 1906 次阅读

目录

需求场景

方案一使用redis的Zset配置定时任务

方案二使用mq延时队列

综上

总结

需求场景

在业务中有些数据因为历史原因用的hash结构存储数据,但是后期需求要求其中某个field需要按照一些规则去过期,这个时候原来的逻辑懒得改,可以利用redisZset或者mq的延时队列去做过期设置.

方案一使用redis的Zset配置定时任务

捞个图

demo需要清缓存的redishash结构如下

然后我们再每次往Agent这个hash结构存储数据的时候,同时向AgentExpirekeyZSET数据结构存储一份数据(在存数据的时候可以在当前时间上增加过期时间),这个数据的keyhash结构中的field的值,value是过期时间戳(毫秒级

如下图所示:

然后用一个定时任务(我这里用的xxl-job,大家可以自己选择)定时去扫描这个ZSET里面score小于当前时间的元素,也就是使用ZSETrangeByScore命令:

上面在向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延时队列

延时队列的配置可以参考我另一篇文章

https://www.jb51.net/article/273145.htm

在延时队列消费者处增加上述过期代码即可

long currentTimeMillis = System.currentTimeMillis(); Set<String> expireKeys = //扫描key为AgentExpire的zset中时间在 0~currentTimeMillis当前时间范围内的数据 redisTemplate.opsForZSet().rangeByScore("AgentExpire", 0, currentTimeMillis); 综上

使用zset的话开发量少,但是定时job一直刷容易浪费资源,mq延时队列更精确

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持软件开发网。



hash Redis

需要 登录 后方可回复, 如果你还没有账号请 注册新账号