服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - 数据库技术 - 控制Redis的hash的field中的过期时间

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

2023-07-13 12:08未知服务器之家 数据库技术

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

需求场景

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

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

捞个图

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

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

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

如下图所示:

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

然后用一个定时任务(我这里用的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延时队列更精确

总结

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

延伸 · 阅读

精彩推荐
  • 数据库技术服务器数据库端口-云服务器问题

    服务器数据库端口-云服务器问题

    问:127.0.0.1:服务器用户名:**********服务器初始密码:********** 服务器数据库端口 权限帮忙开一下 127.0.0.1:3306,服务器数据库端口 答:您好, 工单路径: 【 主机...

    未知1442023-05-09
  • 数据库技术快速修改mysql密码的四种方法示例详解

    快速修改mysql密码的四种方法示例详解

    快速修改mysql密码的四种方法 方法1: 用SET PASSWORD命令 首先登录MySQL。 格式:mysql set password for 用户名@localhost = password(新密码); 例子:mysql set password for r...

    未知1072023-06-27
  • 数据库技术在数据库中如何高效的实现订座功能

    在数据库中如何高效的实现订座功能

    这篇文章主要给大家介绍了关于在数据库中如何高效的实现订座功能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    腾讯云+社区7682021-11-04
  • 数据库技术Insert into select语句

    Insert into select语句

    这个语法结构在处理数据集之间的转换和整合时非常有用。在下面的回答中,我将详细介绍Insert into select语句的语法、用途和示例。 语法: INSERT INTO 目标...

    未知802023-07-10
  • 数据库技术SpringBoot如何正确连接SqlServer

    SpringBoot如何正确连接SqlServer

    一、正确的配置方式 第一种: maven依赖 !-- https://mvnrepository.com/artifact/net.sourceforge.jtds/jtds --dependency groupIdnet.sourceforge.jtds/groupId artifactIdjtds/artifactId version1...

    未知1752023-05-28
  • 数据库技术阿里云服务器怎么管理数据库

    阿里云服务器怎么管理数据库

    一、前言 随着互联网的发展,数据的重要性日益增长,数据库管理也越来越成为一个重要的领域。对于数据量较大需要需要长期存储、高并发读写的业务来...

    未知962023-06-14
  • 数据库技术在Navicat上怎么停止正在运行的MYSQL语句

    在Navicat上怎么停止正在运行的MYSQL语句

    运行一条极其漫长的SQL,发觉一直没有结果,点击下图的 停止 按钮,但是很遗憾一直没有效果,无法停止: 2. 用SQL方式停止运行的SQL (1)找到运行的S...

    未知1282023-06-10
  • 数据库技术MySQL事务处理详细介绍

    MySQL事务处理详细介绍

    MySQL是一种基于开放源代码的关系型数据库管理系统。在MySQL中,事务处理是一个非常重要的概念,它能够保证数据在数据库中的完整性和一致性。MySQL支持...

    未知672023-06-15