Redis中的自动过期机制

  • 前言
  • 1.使用Redis Key自动过期机制
    • 2.Springboot整合key过期监听
      • 2.1. 创建表 order_number
      • 2.2核心代码
        • 2.2.1 核心代码
        • 2.2.2 maven核心依赖
        • 2.2.3 application.yml

前言

比如我们需要监听那些key已经过期,再进行对该数据进行下一步的业务处理。
实现需求:处理订单过期自动取消,比如下单15分钟未支付自动更改订单状态
实现方案:
1.使用Redis Key自动过期出发事件通知
2.使用定时任务15分钟后检查
3.按照每分钟轮训检查

1.使用Redis Key自动过期机制

当我们的key失效时,我们可以执行我们的客户端回调监听的方法。
需要在redis中配置:notify-keyspace-events “Ex”

2.Springboot整合key过期监听

2.1. 创建表 order_number

CREATE TABLE `order_number` (`id` int(11) NOT NULL AUTO_INCREMENT,`order_name` varchar(255) DEFAULT NULL,`order_status` int(11) DEFAULT NULL,`order_token` varchar(255) DEFAULT NULL,`order_id` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2.2核心代码

列举部分核心监控redis失效key的代码,详见github项目 :springboot-redis【redis-listener】

2.2.1 核心代码

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;@Configuration
public class RedisListenerConfig {@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);return container;}
}
import com.redmaple.entity.OrderEntity;
import com.redmaple.mapper.OrderMapper;
import com.redmaple.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;/*** @description:* @author: uwank171* @date: 2022/9/2 14:40*/
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {private final static String ORDER_ = "order_";@Autowiredprivate OrderService orderService;/*** Creates new {@link MessageListener} for {@code __keyevent@*__:expired} messages.** @param listenerContainer must not be {@literal null}.*/public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}/*** Redis失效事件 key* @param message* @param pattern*/@Overridepublic void onMessage(Message message, byte[] pattern) {// 表示失效过期的key值String expiraKey = message.toString();System.out.println(">>>>> 过期的key: " + expiraKey);// 做业务处理 TODOif (expiraKey.startsWith(ORDER_)) {orderService.doOrderExpireKey(expiraKey);}}
}
import com.redmaple.entity.OrderEntity;
import com.redmaple.mapper.OrderMapper;
import com.redmaple.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @description:* @author: uwank171* @date: 2022/9/2 15:10*/
@Service
public class OrderServiceImpl implements OrderService {/*** 待支付*/private static final Integer ORDER_STAYPAY = 0;/*** 失效*/private static final Integer ORDER_INVALID = 2;@Autowiredprivate OrderMapper orderMapper;/*** 处理过期的key** @param expiraKey*/@Overridepublic void doOrderExpireKey(String expiraKey) {// 根据key查询 value 如果还还是为待支付状态 将订单改为已经超时~~OrderEntity orderNumber = orderMapper.getOrderNumber(expiraKey);System.out.println(expiraKey);if (orderNumber == null) {return;}if (orderNumber.getOrderStatus().equals(ORDER_STAYPAY)) {// 将订单状态改为已经失效orderMapper.updateOrderStatus(expiraKey, ORDER_INVALID);}System.out.println(">>>>> doOrderExpireKey 完成");}
}
import com.redmaple.common.util.JedisUtil;
import com.redmaple.entity.OrderEntity;
import com.redmaple.mapper.OrderMapper;
import com.redmaple.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.UUID;@RestController
public class OrderController {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate OrderService orderService;@Autowiredprivate JedisUtil jedisUtil;private final static String ORDER_ = "order_";@RequestMapping("/saveOrder")public String saveOrder() {// 1.生成tokenString orderToken = ORDER_ + UUID.randomUUID().toString();String orderId = System.currentTimeMillis() + "";//2. 将该token存放到redis中jedisUtil.set(orderToken, orderId);jedisUtil.expire(orderToken, 10);OrderEntity orderEntity = new OrderEntity(null, "C测试监听redis失效过期的key值", orderId, orderToken);int result = orderMapper.insertOrder(orderEntity);return result > 0 ? "success" : "fail";}
}

2.2.2 maven核心依赖

     <!-- SpringBoot-整合Web组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 集成lombok 框架 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- springboot-redis 和 jedis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- Jedis 客户端 --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><!-- fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>

2.2.3 application.yml

server:port: 7000spring:redis:database: 0host: 172.28.13.140port: 7000password: China1234timeout: 10000jedis:pool:max-active: 500min-idle: 5max-idle: 50max-wait: 60000datasource:driver-class-name: com.mysql.cj.jdbc.Driver## 数据库url: jdbc:mysql://127.0.0.1:3306/gi_test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghaiusername: rootpassword: root

如果该文章能够帮助到你,希望麻烦点赞收藏下,谢谢

Redis自动过期机制之key的过期监听(7)相关推荐

  1. redis 能不能监听特定的key失效_php监听redis key失效触发回调事件

    订单超时.活动过期解决方案:php监听redis key失效触发回调事件 Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0 ...

  2. Redis学习—过期机制

    本节我们来讲一下Redis的过期机制 Redis经常用作缓存,很多都是临时缓存,比如验证码等session信息,我们希望它们能在一定时间内自动销毁.Redis提供了一些对key设置过期时间的命令. 一 ...

  3. 在Redis中设置了过期时间的Key,需要注意哪些问题?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:千山qianshan juejin.im/post/5d6b ...

  4. 在 Redis 中设置了过期时间的 Key,需要注意哪些问题?

    熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 在为key设置过期时间需要注意的事项 1. DEL/SET/GETSET等 ...

  5. 【干货】在Redis中设置了过期时间的Key怎么办?

    熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 在为key设置过期时间需要注意的事项 1. DEL/SET/GETSET等 ...

  6. redis查看key的过期时间_面试官:你在Redis中设置过带过期时间的Key吗?

    点击上方小伟后端笔记关注公众号 每天阅读Java干货文章 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 在为key设置过 ...

  7. Redis持久化与过期机制

    文章目录 Redis持久化与过期机制 1. 持久化机制 1.1 RDB(默认) 1.2 AOF 2. 过期机制 2.1 根据过期策略删除数据 2.2 当内存过大装不下新数据时,将启用淘汰机制 3. 其 ...

  8. 在Redis中设置了过期时间的Key注意事项

    作者:千山qianshan juejin.im/post/5d6bda096fb9a06acc009dc8 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的 ...

  9. redis list设置过期时间_面试官:你在Redis中设置过带过期时间的Key吗?

    点击上方小伟后端笔记关注公众号 每天阅读Java干货文章 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 在为key设置过 ...

最新文章

  1. C++语言学习(十二)——C++语言常见函数调用约定
  2. 分布式锁的应用场景_分布式缓存技术Redis:高级应用(主从、事务与锁、持久化)...
  3. 8Manage PPM助力中投证券 项目管理向数字化转型
  4. MSF(四):常用弱点扫描模块
  5. 0 重新学习Ubuntu -- 这一段没怎么学习
  6. grid autosport额外内容下载慢_清理大王app下载-清理大王v1.0安卓下载
  7. 作者:吴琳(1974-),男,博士,国防大学信息作战与指挥训练教研部教授,主要研究方向为复杂系统与网络、战争复杂系统建模。...
  8. uva146-ID码
  9. eigrp debug命令详解
  10. asp.net mvc Autofac 依赖注入框架 使用
  11. linux与windows共享(四)
  12. CENTOS安装XXNET
  13. 基于51单片机三路温湿度语音LCD1602液晶显示报警
  14. 母亲节,表格交给我们,你早点回家
  15. 全新天狼星网络验证系统源码+功能强大
  16. 轻量级过程改进之项目计划
  17. java 调用麦克风录音_Java 实现麦克风自动录音
  18. 七巧板复原之剩余区域的计算-多边形的加减法计算
  19. laravel artisan命令汇总
  20. 力扣209. 长度最小的子数组

热门文章

  1. CString中 format、trimLeft和trimright、trim 和FindOneOf用法
  2. 美国计算机科学奥林匹克竞赛试题acsl,美国计算机奥林匹克竞赛USACO
  3. ROM和RAM和硬盘的区别
  4. WordPress建站
  5. 用户为中心:华为消费者云服务背后揭示了啥?
  6. win10开机自动进行宽带拨号
  7. 【SGL-110定时限过电流继电器】
  8. 华为员工吐槽:弟弟找我借6万还债,听完借钱理由网友:这不能借
  9. python发微博_Python使用新浪微博API发送微博的例子
  10. 帝国CMS数据库数据表详细说明