1、配置Redis的鍵觸發事件
# 基礎配置
bind 0.0.0.0
# 允許所有IP連接
protected-mode no
# 關閉保護模式(生產環境建議結合密碼使用)
port 6379
# 默認端口
daemonize no
# 非后臺運行(Docker 中必須為 no)
timeout 0
# 連接超時時間(0為不限制)
tcp-keepalive 300
# 保持TCP連接活性
# 持久化
appendonly yes
# 開啟AOF持久化
appendfsync everysec
# 每秒同步一次AOF文件
dir /data
# 數據存儲路徑(Docker 中需掛載此目錄)# 內存管理
maxmemory 1GB
# 最大內存限制(根據需求調整)
maxmemory-policy volatile-lru
# 內存滿時刪除最近最少使用的鍵# 安全
requirepass 12321sadsadsadSDDSADS
# 設置密碼(生產環境必選)# 鍵空間通知(關鍵配置!)
notify-keyspace-events Egx
# 監聽鍵過期事件(E: 鍵事件, x: 過期事件)# 日志
loglevel notice
# 日志級別(notice/production環境推薦)
logfile ""
# 日志輸出到標準輸出(Docker 友好)
按照配置文件進行啟動
docker run -d -p 6379:6379 --name redis-server --restart=always -v /home/redis/redis.conf:/etc/redis/redis.conf -v /home/redis/data:/data -d redis:7.0.2 redis-server /etc/redis/redis.conf
2、 總的配置需要添加
配置文件在framework模塊下面的config文件夾中
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport
{@Beanpublic RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);return container;}
}
3、 鍵刪除監聽
@Component
@Slf4j
public class RedisKeyDeletionListener extends KeyExpirationEventMessageListener {@Value("${spring.redis.database}")private Integer database;public RedisKeyDeletionListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}@Overrideprotected void doRegister(RedisMessageListenerContainer listenerContainer) {// 監聽指定數據庫的鍵刪除事件(__keyevent@*__:del)listenerContainer.addMessageListener(this,new PatternTopic("__keyevent@" + database + "__:del"));}@Overridepublic void onMessage(Message message, byte[] pattern) {String deletedKey = new String(message.getBody());log.info("Key deleted: {}", deletedKey);//此處寫你的業務邏輯}}
4、 鍵過期監聽
@Component
@Slf4j
public class RedisKeyBasicExpirationListener extends KeyExpirationEventMessageListener {// 當前服務連接的redis庫序列號@Value("${spring.redis.database}")private Integer database;public RedisKeyBasicExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}// 指定監聽數據庫@Overrideprotected void doRegister(RedisMessageListenerContainer listenerContainer) {listenerContainer.addMessageListener(this, new PatternTopic("__keyevent@" + database + "__:expired"));}@Overridepublic void onMessage(Message message, byte[] pattern) {// 業務邏輯執行System.out.println("業務邏輯執行");killVlcThread();}}