淺談Redis中的自動過期機(jī)制
Redis中的自動過期機(jī)制
實(shí)現(xiàn)需求:處理訂單過期自動取消,比如下單30分鐘未支付自動更改訂單狀態(tài)
1.使用Redis Key自動過期出發(fā)事件通知
2.使用定時任務(wù)30分鐘后檢查
3.按照每分鐘輪訓(xùn)檢查
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自動過期機(jī)制
當(dāng)我們的key失效時,可以執(zhí)行我們的客戶端回調(diào)監(jiān)聽的方法。
需要在Redis中配置:
1.打開redis.conf配置文件
vi redis.conf
2. 在配置文件中查找notify-keyspace-events
/notify-keyspace-events
3. 修改為notify-keyspace-events Ex
4.重啟redis
二、SpringBoot整合key失效監(jiān)聽
@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; /** * 使用該方法監(jiān)聽 當(dāng)我們的key失效的時候執(zhí)行該方法 * * @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; } // 獲取訂單狀態(tài) Integer orderStatus = orderNumber.getOrderStatus(); // 如果該訂單狀態(tài)為待支付的情況下,直接將該訂單修改為已經(jīng)超時 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 已經(jīng)支付 */ 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.查看數(shù)據(jù)庫數(shù)據(jù)
3. 10s后redis過期,執(zhí)行回調(diào)機(jī)制
4.再次查看數(shù)據(jù)庫,狀態(tài)已被修改
到此這篇關(guān)于淺談Redis中的自動過期機(jī)制的文章就介紹到這了,更多相關(guān)Redis 自動過期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis鏈表底層實(shí)現(xiàn)及生產(chǎn)實(shí)戰(zhàn)
Redis 的 List 是一個雙向鏈表,鏈表中的每個節(jié)點(diǎn)都包含了一個字符串。是redis中最常用的數(shù)據(jù)結(jié)構(gòu)之一,本文主要介紹了Redis鏈表底層實(shí)現(xiàn)及生產(chǎn)實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03如何利用Redis分布式鎖實(shí)現(xiàn)控制并發(fā)操作
這篇文章主要介紹了如何利用Redis分布式鎖實(shí)現(xiàn)控制并發(fā)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09使用lua+redis解決發(fā)多張券的并發(fā)問題
這篇文章主要介紹了使用lua+redis解決發(fā)多張券的并發(fā)問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01Redis為什么默認(rèn)有16個數(shù)據(jù)庫問題
這篇文章主要介紹了Redis為什么默認(rèn)有16個數(shù)據(jù)庫問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02