網站首頁 編程語言 正文
Redis中的自動過期機制
實現需求:處理訂單過期自動取消,比如下單30分鐘未支付自動更改訂單狀態
1.使用Redis Key自動過期出發事件通知
2.使用定時任務30分鐘后檢查
3.按照每分鐘輪訓檢查
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=20 DEFAULT CHARSET=utf8;
一、使用Redis Key自動過期機制
當我們的key失效時,可以執行我們的客戶端回調監聽的方法。
需要在Redis中配置:
1.打開redis.conf配置文件
vi redis.conf
2. 在配置文件中查找notify-keyspace-events
/notify-keyspace-events
3. 修改為notify-keyspace-events Ex
4.重啟redis
二、SpringBoot整合key失效監聽
@Configuration public class RedisListenerConfig { @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); return container; } }
@Component public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } @Resource private OrderMapper orderMapper; /** * 待支付 */ private static final Integer ORDER_STAYPAY = 0; /** * 失效 */ private static final Integer ORDER_INVALID = 2; /** * 使用該方法監聽 當我們的key失效的時候執行該方法 * * @param message * @param pattern */ @Override public void onMessage(Message message, byte[] pattern) { String expiraKey = message.toString(); System.out.println("該key:expiraKey:" + expiraKey + "失效啦~"); // 前綴判斷 orderToken OrderEntity orderNumber = orderMapper.getOrderNumber(expiraKey); if (orderNumber == null) { return; } // 獲取訂單狀態 Integer orderStatus = orderNumber.getOrderStatus(); // 如果該訂單狀態為待支付的情況下,直接將該訂單修改為已經超時 if (orderStatus.equals(ORDER_STAYPAY)) { orderMapper.updateOrderStatus(expiraKey, ORDER_INVALID); // 庫存加上1 } } }
@RestController public class MemberController { @Autowired private UserMapper userMapper; /** * * @return */ @RequestMapping("/getListMember") @Cacheable(cacheNames = "member", key = "'getListMember'") public List<MemberEntity> getListMember() { return userMapper.findMemberAll(); } }
@Data public class OrderEntity { private Long id; private String orderName; /** * 0 待支付 1 已經支付 */ private Integer orderStatus; private String orderToken; private String orderId; public OrderEntity(Long id, String orderName, String orderId, String orderToken) { this.id = id; this.orderName = orderName; this.orderId = orderId; this.orderToken = orderToken; } }
public interface OrderMapper { @Insert("insert into order_number values (null,#{orderName},0,#{orderToken},#{orderId})") int insertOrder(OrderEntity OrderEntity); @Select("SELECT ID AS ID ,order_name AS ORDERNAME ,order_status AS orderstatus,order_token as ordertoken,order_id as orderid FROM order_number\n" + "where order_token=#{orderToken};") OrderEntity getOrderNumber(String orderToken); @Update("\n" + "\n" + "update order_number set order_status=#{orderStatus} where order_token=#{orderToken};") int updateOrderStatus(String orderToken, Integer orderStatus); }
1.訪問addOrder接口
2.查看數據庫數據
3. 10s后redis過期,執行回調機制
4.再次查看數據庫,狀態已被修改
原文鏈接:https://blog.csdn.net/qq_30999361/article/details/124486136
相關推薦
- 2022-06-02 基于Android?Flutter編寫貪吃蛇游戲_Android
- 2023-05-21 python?jinjia2的項目使用_python
- 2022-10-20 VS?Code?常用自定義配置代碼規范保存自動格式化_相關技巧
- 2022-07-17 android?studio實現簡單的計算器小功能_Android
- 2022-08-27 Python服務器創建虛擬環境跑代碼_python
- 2022-04-19 Install MongoDB Community Edition on Red Hat or Ce
- 2022-04-30 DataGridView控件常用屬性介紹_C#教程
- 2022-10-22 Kotlin基礎通關之字符串與數字類型_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支