首先启用
登陆redis-cli,输入命令:
config set notify-keyspace-events Ex
订阅的key
__keyevent@<db>__:expired
这个格式是固定的,db代表的是数据库的编号,由于订阅开启之后这个库的所有key过期时间都会被推送过来,所以最好单独使用一个数据库来进行隔离。可以使用redis来处理定时任务一种思路。
1.启用redis通知功能,并订阅过期的key,等待接收过期的key相关数据
2.设置键值对及过期时间
3.步骤2设置5秒过期时间后,步骤1窗口接收到过期的key test
spring中订阅redis键值过期消息通知
<!-- 设置redis消息订阅(方式1) -->
<!--<bean id="listener" class="
com.xlhy.new_agent.controller.DefaultMessageDelegate
" />
<redis:listener-container connection-factory="jedisConnFactory">
<redis:listener ref="listener" method="handleMessage" topic="__keyevent@1__:expired" />
</redis:listener-container>-->
<!-- 设置redis消息订阅(方式2) -->
<
bean
id
="messageListener"
class
="org.springframework.data.redis.listener.adapter.MessageListenerAdapter"
>
<
constructor-arg
>
<
bean
class
="com.xlhy.new_agent.controller.DefaultMessageDelegate"
/>
</
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"
>
<
list
>
<
bean
class
="org.springframework.data.redis.listener.ChannelTopic"
>
<
constructor-arg
value
="__keyevent@0__:expired"
/>
</
bean
>
</
list
>
</
entry
>
</
map
>
</
property
>
</
bean
>
//订阅过期key,监听过期key
public class
DefaultMessageDelegate {
public static
Logger
logger
= LogManager.
getLogger
(DefaultMessageDelegate.
class
.getName());
public void
handleMessage(String message) {
logger
.info(
"key过期了:"
+ message);
}
}