1.修改redis配置文件
修改配置文件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”意味着所有的事件
修改好配置文件后,redis会对设置了expire的数据进行监听,当redis中的数据超时失效时,将会通知客户端.
2.在spring-jedis的配置文件中添加监听配置
<!--声明消息侦听器容器 -->
<bean id="messageListener" class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter">
<constructor-arg>
<bean class="cn.com.bonc.modules.monitor.redis.MyMessageDelegateImpl"/>
</constructor-arg>
</bean>
<bean id="redisContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer">
<property name="connectionFactory" ref="jedisConnectionFactory"/>
<property name="messageListeners">
<map>
<entry key-ref="messageListener">
<bean class="org.springframework.data.redis.listener.ChannelTopic">
<constructor-arg value="__keyevent@0__:expired"/>
</bean>
</entry>
</map>
</property>
</bean>
3.编写失效回调接口
public interface MyMessageDelegate {
void handleMessage(String message);
void handleMessage(Map message);
void handleMessage(byte[] message);
void handleMessage(Serializable message);
void handleMessage(Serializable message, String channel);
}
4.实现该接口并添加你的操作
public class MyMessageDelegateImpl implements MyMessageDelegate {
private static final Logger logger = LoggerFactory.getLogger(MyMessageDelegateImpl.class);
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Override
public void handleMessage(String message) {
}
@Override
public void handleMessage(Map message) {
}
@Override
public void handleMessage(byte[] message) {
}
@Override
public void handleMessage(Serializable message) {
logger.info("失效的键:",message);
//TODO 拿到失效的键后做其他操作
}
@Override
public void handleMessage(Serializable message, String channel) {
}
}
网友评论