1. 程式人生 > >【redis】spring boot利用redis的Keyspace Notifications實現訊息通知

【redis】spring boot利用redis的Keyspace Notifications實現訊息通知

前言

  需求:當redis中的某個key失效的時候,更新key對應資料在資料庫的狀態

1、修改redis.conf

  安裝的redis服務預設是: notify-keyspace-events "",修改成 notify-keyspace-events Ex;

  位置:redis安裝目下的redis.windows-service.conf 或 redis.windows.conf。(具體看redis服務載入的哪個配置, 貌似要redis 2.8+才支援)


  可以在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”意味著所有的事件

2、配置服務端

pom.xml

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.4.2.RELEASE</version>
        </dependency>

RedisConfig.java

    /**
     * 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.java

/**
 * 監聽所有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")) {
           
        }
    }
}