redis緩存過期策略,監聽redis緩存
場景:
redis緩存中的緩存過期了,但是還需要用到他,然而如果設置緩存為永不過期的話,數據會越堆越多,嚴重佔用空間。所以需要對過期緩存進行監聽。在緩存過期的時候進行處理。如果還需要用到就重新載入緩存,用不到了可以不用處理。解決了有用緩存過期的尷尬,又不會造成數據堆積。
過期事件通過Redis的訂閱與發布功能(pub/sub)來進行分發。
配置文件
而對超時的監聽呢,並不需要自己發布,只有修改配置文件redis.conf中的:notify-keyspace-events Ex,默認為notify-keyspace-events ""
# K 鍵空間通知,以__keyspace@<db>__為前綴
# E 鍵事件通知,以__keysevent@<db>__為前綴
# g del , expipre , rename 等類型無關的通用命令的通知, ...
# $ String命令
# l List命令
# s Set命令
# h Hash命令
# z 有序集合命令
# x 過期事件(每次key過期時生成)
# e 驅逐事件(當key在內存滿了被清除時生成)
# A g$lshzxe的別名,因此」AKE」意味著所有的事件
監聽器:
package connect.listen;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.Topic;
/**
* @author wm
*/
public class KeyExpirationEvent5MessageListener extends KeyExpirationEventMessageListener {
private static final Topic KEYEVENT5_EXPIRED_TOPIC = new PatternTopic("__keyevent@*__:expired");
/**
* Creates new {@link MessageListener} for {@code __keyevent@*__:expired} messages.
*
* @param listenerContainer must not be {@literal null}.
*/
public KeyExpirationEvent5MessageListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void doRegister(RedisMessageListenerContainer listenerContainer) {
listenerContainer.addMessageListener(this, KEYEVENT5_EXPIRED_TOPIC);
}
}
過期監聽的管道默認是__keyevent@0__:expired,@後面的0表示第幾個資料庫,redis默認的資料庫是0~15一共16個資料庫,根據需求修改@後的數字。expired監聽過期redis,可以換成*,監聽所有。
配置bean:
@Bean
public RedisMessageListenerContainer container(JedisConnectionFactory jedisConnectionFactory, ApplicationContext context) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(jedisConnectionFactory);
KeyExpirationEvent5MessageListener listener = new KeyExpirationEvent5MessageListener(container);
listener.doRegister(container);
listener.setApplicationEventPublisher(context);
return container;
}
監聽:
@EventListener(classes = RedisKeyExpiredEvent.class)
@Override
public void event(RedisKeyExpiredEvent event) {
String expiredKey = new String(event.getSource());
System.out.println(expiredKey);
//expiredKey監聽到的過期redis,根據業務要求進行操作
}
啟動項目就可以監聽redis了。
---------------------
作者:會寫點代碼的小菜鳥
原文:https://blog.csdn.net/weixin_41497481/article/details/85322794
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
TAG:程序員小新人學習 |