一、redis簡介
REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統(tǒng)曾雕。
Redis是一個開源的使用ANSI C語言編寫球昨、遵守BSD協(xié)議笔呀、支持網(wǎng)絡(luò)灵巧、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫官觅,并提供多種語言的API。
它通常被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器阐污,因為值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型休涤。
二、redis的key過期的事件觸發(fā)
過期事件通過Redis的訂閱與發(fā)布功能(pub/sub)來進行分發(fā)笛辟。
- redis服務(wù)端配置
超時的監(jiān)聽功氨,并不需要自己發(fā)布,只有修改配置文件redis.conf中的:notify-keyspace-events Ex手幢,默認為notify-keyspace-events ""
image.png
修改好配置文件后捷凄,redis會對設(shè)置了expire的數(shù)據(jù)進行監(jiān)聽,當(dāng)數(shù)據(jù)過期時便會將其從redis中刪除
配置事件監(jiān)聽
如圖:
2.java實現(xiàn)redis中key過期事件觸發(fā)
a.創(chuàng)建一個實現(xiàn)類繼承KeyExpirationEventMessageListener
package com.focussend.weixin.utils;
import com.focussend.contacts.service.FissionMarketingService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
/**
* Created by Administrator on 2019/2/26.
*/
@Component
class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Resource
private FissionMarketingService fissionMarketingService;
private Logger logger = LoggerFactory.getLogger(RedisKeyExpirationListener.class);
private final Object fanNumUpdate = new Object();
/**
* 針對redis數(shù)據(jù)失效事件围来,進行數(shù)據(jù)處理
* @param message
* @param pattern
*/
@Override
public void onMessage(Message message, byte[] pattern) {
// 用戶做自己的業(yè)務(wù)處理即可,注意message.toString()可以獲取失效的key
String expiredKey = message.toString();
logger.info("此處根據(jù)對應(yīng)的redis的key去處理業(yè)務(wù)邏輯");
}
}
b. 注入RedisMessageListenerContainer
方法一跺涤、使用xml增加的相關(guān)配置
<bean id="redisContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer">
<property name="connectionFactory" ref="jedisConnectionFactory" />
</bean>
方法二、使用config類
/**
* Redis緩存配置類
*/
@Configuration
public class RedisConfigurer extends CachingConfigurerSupport {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
三监透、測試
向redis中存入一個key和value并設(shè)置過期時間桶错,key過期后會觸發(fā)onMessage(Message message, byte[] pattern) 方法
redisCacheManagerTool.set("test_renjiao","haha",20);
四、備注
如果服務(wù)宕機胀蛮,那么將接收不到redis推送過來的事件也就無法處理redis過期后的邏輯院刁。我們可以采用redis+定時任務(wù)處理,這樣可以避免服務(wù)宕機醇滥,Redis過期事件推送處理的問題黎比,也能夠提高系統(tǒng)整體性能(可以去了解一下redis的key過期策略)。