javascript
springboot listener_Springboot 监听redis key的过期事件
項(xiàng)目中常常會(huì)碰到這樣的需求,用戶下訂單后,30分鐘未完成自動(dòng)取消訂單的功能。
有人說(shuō)這個(gè)簡(jiǎn)單呀,寫(xiě)個(gè)定時(shí)任務(wù)就搞定了。除了定時(shí)任務(wù)之外,難道就沒(méi)有其他的方法來(lái)實(shí)現(xiàn)嗎?有--Redis 的鍵空間通知事件。
在Redis 2.8.0之后提供Keyspace Notifications功能,當(dāng)我們將<key,value>鍵值對(duì)使用Redis緩存并設(shè)置緩存失效時(shí)間的時(shí)候,會(huì)觸發(fā)Redis的鍵事件通知,客戶端訂閱這個(gè)通知,服務(wù)端將會(huì)把對(duì)應(yīng)的通知事件發(fā)送給客戶端,客戶端收到通知,然后根據(jù)自己的不同業(yè)務(wù)進(jìn)行處理。要注意的是因?yàn)镽edis的發(fā)布訂閱模式采用的是發(fā)送即忘的策略,當(dāng)訂閱的客戶端斷線時(shí),會(huì)丟失所有在斷線期間發(fā)送給他的事件通知。當(dāng)你的程序需要一個(gè)可靠的事件通知時(shí),Redis的鍵空間通知就不適合了。
事件類型
鍵空間通知都會(huì)發(fā)送兩種不同類型的事件消息:keyspace 和 keyevent。以 keyspace 為前綴的頻道被稱為鍵空間通知(key-space notification), 而以 keyevent 為前綴的頻道則被稱為鍵事件通知(key-event notification)。
開(kāi)啟配置
修改Redis的redis.conf
# notify-keyspace-events Ex # By default all notifications are disabled because most users don't need # this feature and the feature has some overhead. Note that if you don't # specify at least one of K or E, no events will be delivered. notify-keyspace-events "Ex"鍵空間通知通常是不啟用的,因?yàn)檫@個(gè)過(guò)程會(huì)產(chǎn)生額外消耗。所以在使用該特性之前,請(qǐng)確認(rèn)一定是要用這個(gè)特性的,然后修改配置文件
# K 鍵空間通知,以__keyspace@<db>__為前綴 # E 鍵事件通知,以__keysevent@<db>__為前綴 # g del , expipre , rename 等類型無(wú)關(guān)的通用命令的通知, ... # $ String命令 # l List命令 # s Set命令 # h Hash命令 # z 有序集合命令 # x 過(guò)期事件(每次key過(guò)期時(shí)生成) # e 驅(qū)逐事件(當(dāng)key在內(nèi)存滿了被清除時(shí)生成) # A g$lshzxe的別名,因此”AKE”意味著所有的事件springboot 中的處理方式
添加Redis 消息監(jiān)聽(tīng)的配置
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;/*** @ClassName RedisListenerConfig* @Description* @Author ZhaoDeLin* @Date 2019/9/16 15:15* @Email: casablanca523@163.com**/ @Configuration public class RedisListenerConfig {@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);return container;} }添加Redis key過(guò)期事件的監(jiān)聽(tīng)
import lombok.extern.slf4j.Slf4j; 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; import javax.annotation.Resource;/*** @ClassName RedisKeyExpirationListener* @Description 監(jiān)聽(tīng)redis的過(guò)期事件* @Author ZhaoDeLin* @Date 2019/9/16 15:18* @Email: casablanca523@163.com**/ @Component @Slf4j public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}public void onMessage(Message message, byte[] pattern){String expiredKey = message.toString();log.info("redis key過(guò)期:{}",expiredKey);//業(yè)務(wù)邏輯處理。。。} } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的springboot listener_Springboot 监听redis key的过期事件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python编程制作接金币游戏,闪电侠接
- 下一篇: 记事本linux命令换行符,Window