当前位置: 七九推 > IT编程>数据库>Redis > 控制Redis的hash的field中的过期时间

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

2023年01月21日 Redis 我要评论
需求场景在业务中有些数据因为历史原因用的hash结构存储数据,但是后期需求要求其中某个field需要按照一些规则去过期,这个时候原来的逻辑懒得改,可以利用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延时队列

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

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

long currenttimemillis = system.currenttimemillis();
set<string> expirekeys = 
//扫描key为agentexpire的zset中时间在 0~currenttimemillis当前时间范围内的数据
redistemplate.opsforzset().rangebyscore("agentexpire", 0, currenttimemillis);

综上

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持七九推。

(0)
打赏 微信扫一扫 微信扫一扫

相关文章:

  • Redis缓存工具封装实现

    Redis缓存工具封装实现

    将 stringredistemplate 封装成一个缓存工具类,方便以后重复使用。1. 方法要求在这个工具类中我们完成四个方法:方法①:将任意java对象序列... [阅读全文]
  • redis保存session信息的示例代码

    本文实现一个将session信息保存在 redis中,多个tomcat中的工程都从redis获取session信息的示例。1、新建一个maven web 工程名为 session-…

    2023年01月17日 数据库
  • Redis脑裂导致数据丢失的解决

    Redis脑裂导致数据丢失的解决

    1 案例主从集群有1个主库、5个从库和3个哨兵实例,突然发现客户端发送的一些数据丢了,直接影响业务层数据可靠性。最终排查发现是主从集群中的脑裂问题导致:主从集群... [阅读全文]
  • 浅谈Redis在秒杀场景的作用

    浅谈Redis在秒杀场景的作用

    秒杀业务特点:限时限量,业务系统要处理瞬时高并发请求,redis是必需品。秒杀可分成秒杀前、秒杀中和秒杀后三阶段,每个阶段的请求处理需求不同,redis具体在秒... [阅读全文]
  • Redis使用Bitmap的方法实现

    1. bitmap 是什么bitmap(也称为位数组或者位向量等)是一种实现对位的操作的'数据结构',在数据结构加引号主要因为:bitmap 本身不是一种数据结构,…

    2023年01月27日 数据库
  • Redisson如何解决redis分布式锁过期时间到了业务没执行完问题

    面试问题redis锁的过期时间小于业务的执行时间该如何续期?问题分析首先如果你之前用redis的分布式锁的姿势正确,并且看过相应的官方文档的话,这个问题so easy.我们来看很多…

    2023年01月14日 数据库

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2023  七九推 保留所有权利. 粤ICP备17035492号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com