springboot~redis的hash结构为key设置过期策略
redis配置文件开启键过期
# The "notify-keyspace-events" takes as argument a string that is composed
# of zero or multiple characters. The empty string means that notifications
# are disabled.
#
# Example: to enable list and generic events, from the point of view of the
# event name, use:
#
# notify-keyspace-events Elg
#
# Example 2: to get the stream of the expired keys subscribing to channel
# name __keyevent@0__:expired use:
#
# notify-keyspace-events Ex
#
# By default all notifications are disabled because most users don't need
# this feature and the feature has some overhead. Note that if you don't
# specify at least one of K or E, no events will be delivered.
springboot中实现键后的处理逻辑
- 订阅逻辑
public class KeyExpiredEventMessageListener implements MessageListener {
private final RedisTemplate redisTemplate;
public KeyExpiredEventMessageListener(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
@Override
public void onMessage(Message message, byte[] pattern) {
String expiredKey = message.toString();
// 处理键过期事件逻辑
System.out.println("Key expired: " + expiredKey);
String[] keys = expiredKey.split("\\:");
redisTemplate.opsForHash().delete(keys[0], keys[1]);
}
}
- 注册组件
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory,
KeyExpiredEventMessageListener keyExpiredEventMessageListener) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(keyExpiredEventMessageListener, new PatternTopic("__keyevent@*__:expired"));//__keyevent@0__:expired #0代表redis中的db索引
return container;
}
@Bean
public KeyExpiredEventMessageListener keyExpiredEventMessageListener(RedisTemplate redisTemplate) {
return new KeyExpiredEventMessageListener(redisTemplate);
}
- 测试demo
@Test
public void hashsetExpire4() throws InterruptedException {
redisTemplate.opsForHash().put("h_set4", "a", "1");
redisTemplate.opsForHash().put("h_set4", "b", "2");
redisTemplate.opsForValue().set("h_set4:b", "2");
redisTemplate.expire("h_set4:b", Duration.ofSeconds(10));// 多次设置时,以最后一次为准,这时有效期重设为1分
Thread.sleep(1000 * 60);
}
测试用例中,在10秒后,由于h_set4:b这个键过期了,所以触发了KeyExpiredEventMessageListener
事件,最后将对应的hashset里的键被动删除。
合集:
springboot(2)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2016-04-28 微信扫码i支付~官方DEMO的坑
2013-04-28 将不确定变为确定~Razor视图中是否可以嵌套JS代码
2013-04-28 将不确定变为确定~Flag特性的枚举是否可以得到Description信息