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

 更新时间:2023年01月19日 08:43:30   作者:好大的月亮  
这篇文章主要介绍了控制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://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延时队列更精确

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • window环境redis通过AOF恢复数据的方法

    window环境redis通过AOF恢复数据的方法

    这篇文章主要介绍了window环境redis通过AOF恢复数据的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 浅析Redis底层数据结构Dict

    浅析Redis底层数据结构Dict

    Redis是一个键值型的数据库,我们可以根据键实现快速的增删改查,而键与值的映射关系正是通过Dict来实现的,当然 Dict 也是 Set Hash 的实现方式,本文就详细带大家介绍一下Redis底层数据结构 Dict,,需要的朋友可以参考下
    2023-05-05
  • Redis为什么快如何实现高可用及持久化

    Redis为什么快如何实现高可用及持久化

    这篇文章主要介绍了Redis为什么快如何实现高可用及持久化,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 详解Redis命令和键_动力节点Java学院整理

    详解Redis命令和键_动力节点Java学院整理

    Redis命令用于在redis服务器上执行某些操作,下面通过本文给大家分享Redis命令和键,需要的的朋友参考下吧
    2017-08-08
  • Redis中统计各种数据大小的方法

    Redis中统计各种数据大小的方法

    这篇文章主要介绍了Redis中统计各种数据大小的方法,本文使用PHP实现统计Redis内存占用比较大的键,需要的朋友可以参考下
    2015-03-03
  • redis.conf中使用requirepass不生效的原因及解决方法

    redis.conf中使用requirepass不生效的原因及解决方法

    本文主要介绍了如何启用requirepass,以及启用requirepass为什么不会生效,从代码层面分析了不生效的原因,以及解决方法,需要的朋友可以参考下
    2023-07-07
  • Redis缓存三大异常的处理方案梳理总结

    Redis缓存三大异常的处理方案梳理总结

    这篇文章主要介绍了Redis缓存三大异常的处理方案梳理总结,缓存方式,在提高数据查询效率、保护数据库等方面起到了不可磨灭的作用,但实际应用中,可能会出现一些Redis缓存异常的情况,下文对其方案总结需要的朋友可以参考一下
    2022-06-06
  • Redis集群新增、删除节点以及动态增加内存的方法

    Redis集群新增、删除节点以及动态增加内存的方法

    本文主要介绍了Redis集群新增、删除节点以及动态增加内存的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Redis 集群模式(Cluster)原理详解

    Redis 集群模式(Cluster)原理详解

    redis cluster集群是一个由多个主从节点集群组成的分布式服务集群,它具有复制、高可用和分片特性,cluster集群不需要sentinel 哨兵也能完成节点移除和故障转移的功能,本文就详细的给大家介绍一下Redis 集群模式原理,感兴趣的朋友跟着小编一起来看看吧
    2023-07-07
  • redis4.0入门小结

    redis4.0入门小结

    这篇文章主要介绍了redis4.0入门小结,文中通过示例和概念介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11

最新评论