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

Posted 好大的月亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了控制Redis的hash的field中的过期时间相关的知识,希望对你有一定的参考价值。

需求场景

在业务中有些数据因为历史原因用的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://blog.csdn.net/weixin_43944305/article/details/120827661

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

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



综上

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

参考博文
https://www.chuckfang.com/2022/03/14/set-redis-hash-field-expire-time/

以上是关于控制Redis的hash的field中的过期时间的主要内容,如果未能解决你的问题,请参考以下文章

redis hash结构如何设置过期时间

Redis哈希表Hash操作

redis中hset(key,field,value)存储的数据怎么设置过期时间,针对field设置

Redis原子性写入HASH结构数据并设置过期时间

Redis——过期时间

redis的简单使用