若依添加添加监听容器配置(删除键,键过期)
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();}}