原理

利用redis(2.8.0+版本)订阅发布模式 ,当key过期时触发相关事件

修改redis配置文件

# 在配置文件种加入这句话,开启key过期通知。然后重启redis
notify-keyspace-events Ex

测试是否配置正确

redis-cli开两个窗口
cli-1 订阅频道__keyevent@0__:expired(0代表数据库用的5就改为5)

127.0.0.1:6379> PSUBSCRIBE __keyevent@0__:expired
Reading messages... (press Ctrl-C to quit)       
1) "psubscribe"                                  
2) "__keyevent@0__:expired"                      
3) (integer) 1

cli-2 存入一个 key,并设置过期时间

127.0.0.1:6379> set test hahah EX 5
OK

当 5 秒过后,cli-1 收到信息就代表配置成功

1) "pmessage"
2) "__keyevent@0__:expired"
3) "__keyevent@0__:expired"
4) "test"

Springboot 接收 Redis 过期通知

接收通知类

import org.springframework.stereotype.Component;

/**
 * @author asmn
 * @date 2021/11/24
 */
@Component
public class RedisMessageReceiver {

    /**
     * 接收redis消息,并处理
     *
     * @param message 过期的key
     */
    public void receiveMessage(String message) {
        System.out.println("通知的key是:" + message);
    }

}

频道订阅

@Configuration
public class RedisConfig {
	
	.....其他不相关代码.......

    /**
     * 订阅频道
     *
     * @param connectionFactory
     * @param listenerAdapter
     * @return
     */
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                            MessageListenerAdapter listenerAdapter) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        // 订阅通道,key过期时通知
        container.addMessageListener(listenerAdapter, new PatternTopic("__keyevent@0__:expired"));
        // 可以订阅多个通道

        return container;
    }

    /**
     * 配置redis事件监听处理器
     *
     * @param receiver
     * @return
     */
    @Bean
    MessageListenerAdapter listenerAdapter(RedisMessageReceiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }
    
	......其他不相关代码......

}

补充

window下重启redis

关闭
redis-cli -h 127.0.0.1 -p 6379 shutdown

如果有密码,请先登录redis

redis-cli
# password为你的密码
auth "password"
shutdown
启动
redis-server redis.windows.conf
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐