springboot~redis的hash結(jié)構(gòu)為key設(shè)置過(guò)期策略
redis配置文件開(kāi)啟鍵過(guò)期
# 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中實(shí)現(xiàn)鍵后的處理邏輯
- 訂閱邏輯
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();
// 處理鍵過(guò)期事件邏輯
System.out.println("Key expired: " + expiredKey);
String[] keys = expiredKey.split("\\:");
redisTemplate.opsForHash().delete(keys[0], keys[1]);
}
}
- 注冊(cè)組件
@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);
}
- 測(cè)試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));// 多次設(shè)置時(shí),以最后一次為準(zhǔn),這時(shí)有效期重設(shè)為1分
Thread.sleep(1000 * 60);
}
測(cè)試用例中,在10秒后,由于h_set4:b這個(gè)鍵過(guò)期了,所以觸發(fā)了KeyExpiredEventMessageListener事件,最后將對(duì)應(yīng)的hashset里的鍵被動(dòng)刪除。
浙公網(wǎng)安備 33010602011771號(hào)