控制Redis的hash的field中的过期时间
目录
- 需求场景
- 方案一使用redis的Zset配置定时任务
- 方案二使用mq延时队列
- 综上
- 总结
需求场景
在业务中有些数据因为历史原因用的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延时队列
延时队列的配置可以参考我另一篇文章
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延时队列
更精确
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
解析redis hash应用场景和常用命令
存储对象类数据 hmset user name huyongjian age 23 height 170 常用命令 将多个 field-value对设置到哈希表 key 中 hmset user name huyongjian age 23 height 170 将哈希表 key 中的字段 field 的值设为 value hset user weight 70 只有在字段 field 不存在时,设置哈希表字段的值 hsetnx user address china 获取存储在哈希表中指定字段的
-
Redis基本数据类型哈希Hash常用操作
目录 Redis数据类型Hash常用操作 一.hset 二.hget 三.hmset 四.hmget 五.hgetall 六.hdel 七.hlen 八.hexists 九.hkeys 十.hvals 十一.hincrby 十二.hsetnx Redis数据类型Hash常用操作 redis里的hash是一个string类型的field(字段)和value(值)的映射表.特别适合用于存储对象,每个hash可以存储40多亿键值对. 熟悉python的童鞋可以想象成字典dict.之前的数据类型存储都是
-
深入解析Redis中常见的应用场景
前言 Redis是一个key-value存储系统,现在在各种系统中的使用越来越多,大部分情况下是因为其高性能的特性,被当做缓存使用,这里介绍下Redis经常遇到的使用场景.下面话不多说了,来一起看看详细的介绍吧. Redis特性 一个产品的使用场景肯定是需要根据产品的特性,先列举一下Redis的特点: 读写性能优异 持久化 数据类型丰富 单线程 数据自动过期 发布订阅 分布式 这里我们通过几个场景,不同维度说下Redis的应用. 高性能适合当做缓存 缓存是Redis最常见的应用场景,之所有这么使
-
php中session过期时间设置及session回收机制介绍
网上很多人给出了解答:修改配置文件中的session.gc_maxlifetime.如果想了解更多session回收机制,继续阅读.(本文环境php5.2) 概述:每一次php请求,会有1/100的概率(默认值)触发"session回收".如果"session回收"发生,那就会检查/tmp/sess_*的文件,如果最后的修改时间到现在超过了1440秒(gc_maxlifetime的值),就将其删除,意味着这些session过期失效. 1. session在端(一般是
-
手写redis@Cacheable注解 支持过期时间设置方式
目录 原理解释 实现方法 源代码 原理解释 友情链接 手写redis @ Cacheable注解参数java对象作为键值 @Cacheable注解作用,将带有该注解方法的返回值存放到redis的的中; 使用方法在方法上使用@Cacheable(键=“测试+#P0 + P1#...”) 表示键值为测试+方法第一个参数+方法第二个参数,值为该方法的返回值. 以下源代码表示获取人员列表,Redis的中存放的关键值为'领袖'+ leaderGroupId + UUID + yearDetailId @
-
asp中设置session过期时间方法总结
如果程序中没有设置session的过期时间,那么session过期时间就会按照IIS设置的过期时间来执行,IIS中session默认过期时间为20分钟,IIS中session时间可以更改 时间设置要放在前面 例如 复制代码 代码如下: Session.Timeout=30 'SEESION有效时间为30分钟 Session("ID")=Rs("id") Session("Name")=Rs("Name") Session(&q
-
java操作Redis缓存设置过期时间的方法
关于Redis的概念和应用本文就不再详解了,说一下怎么在java应用中设置过期时间. 在应用中我们会需要使用redis设置过期时间,比如单点登录中我们需要随机生成一个token作为key,将用户的信息转为json串作为value保存在redis中,通常做法是: //生成token String token = UUID.randomUUID().toString(); //把用户信息写入redis jedisClient.set(REDIS_USER_SESSION_KEY + ":"
-
浅谈redis的过期时间设置和过期删除机制
目录 一:设置过期时间 二:保存过期时间 三:移除过期时间 四:计算并返回剩余生存时间 五:过期键的删除策略 六:redis使用的策略 一:设置过期时间 redis有四种命令可以用于设置键的生存时间和过期时间: EXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 秒 PEXPIRE <KEY> <TTL> :将键的生存时间设为 ttl 毫秒 EXPIREAT <KEY> <timestamp> :将键的过期时间设为
-
浅谈Redis 中的过期删除策略和内存淘汰机制
目录 前言 Redis 中 key 的过期删除策略 1.定时删除 2.惰性删除 3.定期删除 Redis 中过期删除策略 从库是否会脏读主库创建的过期键 内存淘汰机制 内存淘汰触发的最大内存 有哪些内存淘汰策略 内存淘汰算法 LRU LFU 为什么数据删除后内存占用还是很高 内存碎片如何产生 碎片率的意义 如何清理内存碎片 总结 参考 前言 Redis 中的 key 设置一个过期时间,在过期时间到的时候,Redis 是如何清除这个 key 的呢? 这来分析下 Redis 中的过期删除策略和内存淘
-
浅谈Redis 中的过期删除策略和内存淘汰机制
目录 前言 Redis 中 key 的过期删除策略 1.定时删除 2.惰性删除 3.定期删除 Redis 中过期删除策略 从库是否会脏读主库创建的过期键 内存淘汰机制 内存淘汰触发的最大内存 有哪些内存淘汰策略 内存淘汰算法 LRU LFU 为什么数据删除后内存占用还是很高 内存碎片如何产生 碎片率的意义 如何清理内存碎片 总结 参考 前言 Redis 中的 key 设置一个过期时间,在过期时间到的时候,Redis 是如何清除这个 key 的呢? 这来分析下 Redis 中的过期删除策略和内存淘
-
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
具体代码如下所示: # -*- coding: utf-8 -*- import redis import datetime ''' # 1. redis设置过期时间的两种方式 expire函数设置过期时间为10秒.10秒后,ex1将会失效 expireat设置一个具体的时间,15年9月8日15点19分10秒,过了这个时间,ex2将失效 如果设置过期时间成功会返回True,反之返回False ''' pool = redis.ConnectionPool(host='192.168.3.128'
-
Redis 事务与过期时间详细介绍
Redis 事务与过期时间详细介绍 一.Redis事务: Redis中支持事务,事务即为当我们需要执行几条命令时,要么这几条命令都不执行,要么都执行: 1.开始事务写入: multi 2.然后写入命令,注意写完事务要执行的每条命令之后回车即可,命令会自动入队: lpush art:1 hello lpush art:1 nihao 3.执行事务: exec Redis则会保证事务中的所有命令要么都执行,要么都不执行. 二.Redis过期时间: 实际开发中经常会遇到一些有时效性的数据,比如缓存,过
-
php中实现精确设置session过期时间的方法
大多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一下session过期时间. 对此,可以在PHP中,设置php.ini,找到session.gc_maxlifetime = 1440 #(PHP5默认24分钟) 这里你可以随便设置一下过期时间.但是有人说设置以后,好象不起作用! 其实不是不起作用,而是因为系统默认: session.gc_probability = 1 session.gc_divisor = 1000 garbage
随机推荐
- PHP的switch判断语句的“高级”用法详解
- js获取窗口相对于屏幕左边和上边的位置坐标
- OpenStack Identity(Keystone)身份服务、体系结构与中间件讲解
- 理解Javascript_11_constructor实现原理
- javascript的事件描述
- PHP 开源AJAX框架14种
- python获取外网ip地址的方法总结
- C语言小程序 杨辉三角示例代码
- vue params、query传参使用详解
- 用MyEclipse配置DataBase Explorer(图示)
- css与javascript跨浏览器兼容性总结
- lua获取未来某时间点的时间戳解决方案
- jquery获取input type=text中的值的各种方式(总结)
- Java 对10个数进行排序的实现代码
- C++虚函数的实现机制分析
- MyBatis Excutor 拦截器的巧妙用法
- vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
- 如何解决SpringBoot2.x版本对Velocity模板不支持的方案
- 使用python来调用CAN通讯的DLL实现方法
- Android Studio下Flutter环境搭建图文教程
其他
- android popupwindow 滚轮日期
- python画平缓的loss曲线
- python中读取word文档指定段落内容
- android recyclerview grid 间隔
- vue获取div的内容
- Java获取枚举所有的key值
- mongodb内存占用过高死机
- opencv阈值分割算法
- 找不到全局的shelljs
- robotframework 接口自动化实例
- 易语言怎么取百度北京时间
- Python多元高斯分类器决策边界
- @Table(name = "admin_info")爆红
- python datafram求逆矩阵
- dataframe设置第一行为列名
- fmod 浮点和double 一直0
- 微信小程序搜索下拉框
- python处理过后的图片进行保存
- list里是string postman的参数咋传
- idea导出配置 包含哪些内容