redis開(kāi)啟過(guò)期監(jiān)聽(tīng)的實(shí)現(xiàn)示例
java項(xiàng)目中,場(chǎng)景:訂單沒(méi)有付款到期取消訂單,使用的是redis過(guò)期監(jiān)聽(tīng)來(lái)做的,做個(gè)筆記!首先使用該功能需要下載2.8.0及以上的版本,這一部分詳細(xì)內(nèi)容可以訪問(wèn)redis官網(wǎng):http://redis.io/topics/notifications ,以下是我總結(jié)的:
第一步:配置redis的過(guò)期失效監(jiān)聽(tīng),需要修改redis.conf配置文件,找到 EVENT NOTIFICATION (事件通知)這個(gè)配置
將 notify-keyspace-events "" 修改為 notify-keyspace-events "Ex"

參數(shù)解釋?zhuān)磁渲梦募蛘吖倬W(wǎng)都有詳細(xì)解釋?zhuān)缦拢?/p>
############################# EVENT NOTIFICATION ############################## # 鍵空間通知使得客戶(hù)端可以通過(guò)訂閱頻道或模式,來(lái)接收那些以某種方式改動(dòng)了 Redis 數(shù)據(jù)集的事件。 # 因?yàn)殚_(kāi)啟鍵空間通知功能需要消耗一些 CPU ,所以在默認(rèn)配置下,該功能處于關(guān)閉狀態(tài)。 # notify-keyspace-events 的參數(shù)可以是以下字符的任意組合, # 它指定了服務(wù)器該發(fā)送哪些類(lèi)型的通知: # K 鍵空間通知,所有通知以 __keyspace@__ 為前綴 # E 鍵事件通知,所有通知以 __keyevent@__ 為前綴 # g DEL 、 EXPIRE 、 RENAME 等類(lèi)型無(wú)關(guān)的通用命令的通知 # $ 字符串命令的通知 # l 列表命令的通知 # s 集合命令的通知 # h 哈希命令的通知 # z 有序集合命令的通知 # x 過(guò)期事件:每當(dāng)有過(guò)期鍵被刪除時(shí)發(fā)送 # e 驅(qū)逐(evict)事件:每當(dāng)有鍵因?yàn)?maxmemory 政策而被刪除時(shí)發(fā)送 # A 參數(shù) g$lshzxe 的別名 # 輸入的參數(shù)中至少要有一個(gè) K 或者 E,否則的話(huà),不管其余的參數(shù)是什么,都不會(huì)有任何 通知被分發(fā)。
第二步: 重新啟動(dòng)redis,沒(méi)什么好說(shuō)的,修改配置文件以及啟動(dòng)redis不會(huì)自行度娘
第三步:驗(yàn)證配置是否成功
- 運(yùn)行redis客戶(hù)端:
redis-cli - 選擇你要監(jiān)聽(tīng)的庫(kù) @后面的值,redis默認(rèn)連接0號(hào)庫(kù),這里不做修改了,運(yùn)行監(jiān)聽(tīng)命令:
psubscribe __keyevent@0__:expired - 在啟動(dòng)一個(gè)客戶(hù)端redis-cli,這里也是默認(rèn)0號(hào)庫(kù),不做修改,設(shè)置一個(gè)10秒過(guò)期的key:
SETEX mykey 10 redis
拓展:Redis Setex 命令為指定的 key 設(shè)置值及其過(guò)期時(shí)間。如果 key 已經(jīng)存在, SETEX 命令將會(huì)替換舊的值。 - 10秒后,可以看到監(jiān)聽(tīng)端口可以接收到失效的redis的key。如圖

springboot 項(xiàng)目集成ridis配置過(guò)期監(jiān)聽(tīng):
1.引入redis依賴(lài),這塊不做過(guò)多解釋?zhuān)粫?huì)的去搜集成reids
<!--Spring boot Redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.創(chuàng)建兩個(gè)類(lèi),第一個(gè)類(lèi)配置 RedisListenerConfig 實(shí)現(xiàn)監(jiān)聽(tīng) Redis key 過(guò)期時(shí)間,我這里是監(jiān)聽(tīng)所有db的過(guò)期事件__keyevent@*__:expired,根據(jù)自己的業(yè)務(wù)需求自行配置,@幾號(hào)庫(kù),@*是所有
RedisListenerConfig:
import org.springframework.beans.factory.annotation.Autowired;
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.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
/**
* @ClassName RedisListenerConfig
* @Description redis監(jiān)聽(tīng)配置
* @Author cl
* @Date 2021-09-09 10:45
*/
@Configuration
public class RedisListenerConfig {
@Autowired
RedisListen redisListen;
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory factory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(factory);
container.addMessageListener(redisListen, new PatternTopic("__keyevent@*__:expired"));
return container;
}
}
第二個(gè)類(lèi),定義監(jiān)聽(tīng)器 RedisListen,監(jiān)聽(tīng) Redis key 過(guò)期事件,針對(duì) Redis 數(shù)據(jù)失效事件,進(jìn)行業(yè)務(wù)處理
RedisListen:
import com.tanghe.common.constant.RedisConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;
/**
* @ClassName RedisListen
* @Description RedisListen
* @Author cl
* @Date 2021-09-09 10:46
*/
@Slf4j
@Component
public class RedisListen implements MessageListener {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Override
public void onMessage(Message message, byte[] pattern) {
String expiredKey = message.toString();
log.info("失效的redis是:"+expiredKey);
RedisSerializer<?> serializer = redisTemplate.getValueSerializer();
String channel = String.valueOf(serializer.deserialize(message.getChannel()));
String body = String.valueOf(serializer.deserialize(message.getBody()));
log.info("channel==="+channel+"-----------------"+"body === "+body);
//key過(guò)期監(jiān)聽(tīng),在處理業(yè)務(wù)之前校驗(yàn)下自己業(yè)務(wù)的key和監(jiān)聽(tīng)的key以及庫(kù)號(hào)
if("__keyevent@0__:expired".equals(channel) && body.indexOf(“自己業(yè)務(wù)的key”) != -1){
log.info("進(jìn)來(lái)了哈");
//這里寫(xiě)需要處理的業(yè)務(wù)
}
}
}
附redis常用指令,會(huì)持續(xù)更新!??!
windows
redis設(shè)置開(kāi)機(jī)自啟動(dòng):redis-server --service-install redis.windows-service.conf --loglevel verbose
redis啟動(dòng)命令:redis-server redis.windows.conf
redis卸載命令:redis-server --service-uninstall
redis啟動(dòng)服務(wù)命令:redis-server --service-start
redis停止服務(wù)命令:redis-server --service-stop
進(jìn)入redis命令:redis-cli.exe -h 127.0.0.1 -p 6379
進(jìn)入redis使用密碼命令:redis-cli.exe -h 127.0.0.1 -p 6379 -a password
到此這篇關(guān)于redis開(kāi)啟過(guò)期監(jiān)聽(tīng)的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)redis開(kāi)啟過(guò)期監(jiān)聽(tīng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
redis快照模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了redis快照模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Redis分布式鎖如何設(shè)置超時(shí)時(shí)間
這篇文章主要介紹了Redis分布式鎖如何設(shè)置超時(shí)時(shí)間,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
redis-copy使用6379端口無(wú)法連接到Redis服務(wù)器的問(wèn)題
這篇文章主要介紹了redis-copy使用6379端口無(wú)法連接到Redis服務(wù)器的問(wèn)題的相關(guān)資料,需要的朋友可以參考下2023-05-05
內(nèi)存型數(shù)據(jù)庫(kù)Redis持久化小結(jié)
redis是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫(kù),也就是說(shuō)redis需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到磁盤(pán)來(lái)保證持久化.redis支持四種持久化方式,一是 Snapshotting(快照)也是默認(rèn)方式,二是Append-only file(縮寫(xiě)aof)的方式,三是虛擬內(nèi)存方式,四是diskstore方式.今天我們總結(jié)下前2種。2017-09-09
redis實(shí)現(xiàn)排行榜的簡(jiǎn)單方法
這篇文章主要給大家介紹了關(guān)于redis實(shí)現(xiàn)排行榜的簡(jiǎn)單方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
windows下通過(guò)批處理腳本啟動(dòng)redis的操作
本文主要給大家介紹了windows下通過(guò)批處理腳本啟動(dòng)redis的操作,windows下redis啟動(dòng),需要進(jìn)入redis安裝目錄,然后shift+右鍵,選擇“在此處打開(kāi)命令窗口”,然后輸入redis-server.exe redis.conf,就可以啟動(dòng)redis了,文中有詳細(xì)的圖文參考,感興趣的朋友可以參考下2023-12-12

