springboot使用redis的keyspace notifications 實現定時通知


簡單定時任務解決方案:使用redis的keyspace notifications(鍵失效后通知事件)
需要注意此功能是在redis 2.8版本以后推出的,因此你服務器上的reids最少要是2.8版本以上;

1.開啟redis key過期提醒
修改redis相關事件配置。找到redis配置文件redis.conf,查看“notify-keyspace-events”的配置項,如果沒有,添加“notify-keyspace-events Ex”,如果有值,添加Ex,相關參數說明如下:
K:keyspace事件,事件以__keyspace@<db>__為前綴進行發布;         
E:keyevent事件,事件以__keyevent@<db>__為前綴進行發布;         
g:一般性的,非特定類型的命令,比如del,expire,rename等;        
$:字符串特定命令;         
l:列表特定命令;         
s:集合特定命令;         
h:哈希特定命令;         
z:有序集合特定命令;         
x:過期事件,當某個鍵過期並刪除時會產生該事件;         
e:驅逐事件,當某個鍵因maxmemore策略而被刪除時,產生該事件;         
A:g$lshzxe的別名,因此”AKE”意味着所有事件。

2.在springboot中使用   

     <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

3.定義配置RedisListenerConfig 

@Configuration
public class RedisTimerConfiguration {

    private Logger logger = LoggerFactory.getLogger(RedisTimerConfiguration.class);
    @Autowired
    private RedisConnectionFactory redisConnectionFactory;
    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        return redisMessageListenerContainer;
    }
}

4.定義監聽器,實現KeyExpirationEventMessageListener接口,查看源碼發現,該接口監聽所有db的過期事件keyevent@*:expired"

@Component
public class RedisTask extends KeyExpirationEventMessageListener {

    private Logger logger = LoggerFactory.getLogger(RedisTask.class);

    public RedisTask(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String channel = new String(message.getChannel(), StandardCharsets.UTF_8);
        //過期的key
        String key = new String(message.getBody(),StandardCharsets.UTF_8);
        logger.info("redis key 過期:pattern={},channel={},key={}",new String(pattern),channel,key);
       
        }
    }  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM