需求:當redis中的某個key失效的時候,更新key對應數據在數據庫的狀態java
安裝的redis服務默認是: notify-keyspace-events "",修改爲 notify-keyspace-events Ex;redis
位置:redis安裝目下的redis.windows-service.conf 或 redis.windows.conf。(具體看redis服務加載的哪一個配置, 貌似要redis 2.8+才支持)spring
能夠在redis.conf中找到對應的描述數據庫
# K 鍵空間通知,以__keyspace@<db>__爲前綴 # E 鍵事件通知,以__keysevent@<db>__爲前綴 # g del , expipre , rename 等類型無關的通用命令的通知, ... # $ String命令 # l List命令 # s Set命令 # h Hash命令 # z 有序集合命令 # x 過時事件(每次key過時時生成) # e 驅逐事件(當key在內存滿了被清除時生成) # A g$lshzxe的別名,所以」AKE」意味着全部的事件
pom.xmlwindows
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.4.2.RELEASE</version> </dependency>
RedisConfig.javaide
/** * redis監聽器 */ @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { log.info("***************************redis監聽器初始化***************************"); RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); /// container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired")); return container; }
RedisKeyExpirationListener.javaspring-boot
/** * 監聽全部db的過時事件__keyevent@*__:expired" * * @author lsm */ @Component public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { private static final Logger log = LoggerFactory.getLogger(RedisKeyExpirationListener.class); public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } /** * 針對redis數據失效事件,進行數據處理 * redis.conf 設置 notify-keyspace-events "Ex" * * @param message * @param pattern */ @Override public synchronized void onMessage(Message message, byte[] pattern) { // 用戶作本身的業務處理便可,注意message.toString()能夠獲取失效的key String expiredKey = message.toString(); log.info("redis失效key通知:expiredKey={}", expiredKey); //若是xxx:開頭的key,進行處理 if (expiredKey.startsWith("orderId")) { } } }