Redis相关配置(包括事件通知)

redis键的过期事件:

首先修改redis.windows.conf中的配置

这里把默认的notify-keyspace-events ""改成notify-keyspace-events Ex

notify-keyspace-events Ex 是一个配置指令,用于 Redis 。这个指令允许用户订阅某些类型的键空间通知。其中的 Ex 代表的事件类型是:键过期事件。就是当 Redis 中的某个键到期(也就是键所设定的超时时间到了)时,将会发出此类事件。

1)E 代表 expired 事件,表示某个 key 已经过期并被删除。

2)x 代表 expired entry script execution 事件。当某个 key 过期时,如果配置了相应的脚本或定时任务进行键过期的行为处理,如脚本的延时删除或者释放一些锁操作等。

然后编写配置类RedisConfig和监听器RedisKeyExpirationListener(监听并处理redis键值过期事件)

@Configuration
@EnableCaching
public class RedisConfig {

    @Value("${spring.datasource.redis.host}")
    private String host;

    @Value("${spring.datasource.redis.port}")
    private int port;

    @Value("${spring.datasource.redis.password}")
    private String password;

    @Autowired
    public static RedisTemplate<Object, Object> redisTemplate;

    public static JedisConnectionFactory jedisConnectionFactory;
    /**
     * key为Object,value为Object的配置
     *
     * @return
     */
    @Bean
    public RedisTemplate<Object, Object> setSTSRedisConfig() {
        redisTemplate = new RedisTemplate<>();
        //解决序列化
        redisTemplate.setDefaultSerializer(StringRedisSerializer.UTF_8);//默认的序列化程序
        redisTemplate.setKeySerializer(new StringRedisSerializer());//序列化键
        redisTemplate.setValueSerializer(new StringRedisSerializer());//序列化值

        //Java连接redis的工厂类
        jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setHostName(host);
        jedisConnectionFactory.setPort(port);
        jedisConnectionFactory.setUsePool(true);//使用连接池
        jedisConnectionFactory.setPassword(password);
        jedisConnectionFactory.afterPropertiesSet();//必须填,因为前面的设置后,需要调用afterPropertiesSet方法来完成初始化

        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        redisTemplate.afterPropertiesSet();//必须填,因为前面的设置后,需要调用afterPropertiesSet方法来完成初始化
        return redisTemplate;
    }

    /**
     * 创建监听redis事件的容器
     * @return
     */
    @Bean
    RedisMessageListenerContainer container() {
        jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setHostName(host);
        jedisConnectionFactory.setPort(port);
        jedisConnectionFactory.setUsePool(true);//使用连接池
        jedisConnectionFactory.setPassword(password);
        jedisConnectionFactory.afterPropertiesSet();//必须填,因为前面的设置后,需要调用afterPropertiesSet方法来完成初始化

        //用于监听Redis发布/订阅模式中的消息
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(jedisConnectionFactory);
        return container;
    }
}
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    @Resource
    private TransactionsService transactionsService;

    //这里写处理逻辑
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String expiredKey = message.toString();
        log.info("Redis 过期 key: {}", expiredKey);//打印过期键的日志信息\
        
        //下面就是处理逻辑
       。。。。
    }
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值