1.起因

最近公司项目要做订单超期未支付需自动关闭,首先想到的是用spring的定时器(@Schedule),结果领导举各种例子说会影响性能,只能作罢。后来想能不能基于redis实现,学习(baidu)之后,大概就是使用redis的Keyspace Notifications,大概就是利用该机制可以在key失效之后,提供一个回调,实际上是redis会给客户端发送一个消息。是需要redis版本2.8以上,conf配置需设置notify-keyspace-events Ex,请示领导之后也得到了同意。

2.整合实现

大致思路就是让spring做客户端订阅'__keyevent@0__:expired'频道就可以了。在这里给出两种实现方式。

1.利用MessageListenerAdapter,spring本身已经提供了的实现方式。

首先自定义一个MessageDelegate 接口并实现

 public interface MyMessageDelegate {
void handleMessage(String message);
void handleMessage(Map message); void handleMessage(byte[] message);
void handleMessage(Serializable message);
// pass the channel/pattern as well
void handleMessage(Serializable message, String channel);
} public class MyRedisKeyExpiredMessageDelegate implements MessageDelegate {
// implementation elided for clarity...
}

xml增加相关配置

     <bean id="messageListener"
class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter">
<constructor-arg>
<bean class="com.xxx.MyRedisKeyExpiredMessageDelegate" />
</constructor-arg>
</bean>
<bean id="redisContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<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>

具体可参考官方文档:http://docs.spring.io/spring-data/redis/docs/1.7.8.RELEASE/reference/html/#redis:pubsub:subscribe

2.即自定义一个OrderPubSub类继承自JedisPubSub,然后在spring启动的时候就订阅这个OrderPubSub。

 public class OrderSubscribe extends JedisPubSub {

     public void onPSubscribe(String pattern, int subscribedChannels) {   

     }  

     public void onPMessage(String pattern, String channel, String message) {
if ("__keyevent@0__:expired".equals(channel)) {
//do some thing
}
}
} public class RedisInitSubscrib implements InitializingBean{ JedisPool pool; @Override
public void afterPropertiesSet() throws Exception {
pool.getResource().psubscribe(new OrderSubscribe(), "*"); } }

当key失效后,收到消息的内容(即方法中的message参数)就是key的值,这样就可以做自定义的操作了。

3.后记

欢迎大家留言交流,关于订单自动关闭如果有更好的方式,还望不吝赐教,O(∩_∩)O谢谢。

Keyspace Notifications

Spring+Redis(keyspace notification)实现定时任务(订单过期自动关闭)的更多相关文章

  1. 利用Redis keyspace notification(键空间通知)实现过期提醒

    一.序言: 本文所说的定时任务或者说计划任务并不是很多人想象中的那样,比如说每天凌晨三点自动运行起来跑一个脚本.这种都已经烂大街了,随便一个 Crontab 就能搞定了. 这里所说的定时任务可以说是计 ...

  2. Redis实践操作之—— keyspace notification(键空间通知)

    一.需求分析: 设置了生存时间的Key,在过期时能不能有所提示? 如果能对过期Key有个监听,如何对过期Key进行一个回调处理? 如何使用 Redis 来实现定时任务? 二.序言: 本文所说的定时任务 ...

  3. Redis的keyspace notification(键空间通知)

    文章来源https://www.cnblogs.com/tinywan/p/5903988.html 一.需求分析: 设置了生存时间的Key,在过期时能不能有所提示? 如果能对过期Key有个监听,如何 ...

  4. Redis键空间通知(keyspace notification),事件订阅

      Redis键空间通知(keyspace notification),事件订阅   应用场景:有效期优惠券.24小时内支付.下单有效事件等等. 功能概览 键空间通知使得客户端可以通过订阅频道或模式, ...

  5. redis键空间通知(keyspace notification)

    一.需求 在redis中,设置好key和生存时间之后,希望key过期被删除时能够及时的发送一个通知告诉我key,以便我做后续的一些操作. 二.环境 系统:windows10 php:7.1 redis ...

  6. keyspace notification(键空间通知)-待验证

    一.需求分析: 设置了生存时间的Key,在过期时能不能有所提示? 如果能对过期Key有个监听,如何对过期Key进行一个回调处理? 如何使用 Redis 来实现定时任务? 二.序言: 本文所说的定时任务 ...

  7. spring+redis 集群下的操作

    文章就是记录一下工作当中的用到的点,与测试方法以备用,会不断更新. 配置文件spring-redis.xml: <?xml version="1.0" encoding=&q ...

  8. REDIS key notification

    Commands Clients Documentation Community Download Support License Join us in London October 19th for ...

  9. 使用Spring整合Quartz轻松完成定时任务

    一.背景 上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等. 二.开发环境及必 ...

随机推荐

  1. 第27篇 重复造轮子---模拟IIS服务器

    在写程序的时候,重复造轮子是程序员的一个大忌,很多人对重复造轮子持有反对的态度,但是我觉得这个造轮子的过程,是对于现有的知识的一个深入的探索的过程,虽然我们不可能把轮子造的那么的完善,对于现在有的东西 ...

  2. ViewPager基础入门

    效果图: 实现了三个view间的相互滑动 第一个VIEW向第二个VIEW滑动                       第二个VIEW向第三个VIEW滑动                       ...

  3. 在Signalr的Hub中写方法实现与安卓的数据交互

    简介: 实现数据实时刷新:SignalR 后台服务:.NET/WebAPI 为了减轻web的压力,将接口中接收数据的方法写到SignalR的Hub中 在此放一小段代码给自己加深下印象,博主有点健忘.. ...

  4. 关于Storm tick

    关于Storm tick 1. tick的功能 Apache Storm中内置了一种定时机制——tick,它能够让任何bolt的所有task每隔一段时间(精确到秒级,用户可以自定义)收到一个来自__s ...

  5. WebGIS前端瓦片地图显示原理及实现

    目前,有很多WebGIS开发包,ArcGIS API for JS.OpenLayers.LeafLetjs等为我们从事WebGIS开发的人封装了很多强大的功能.我们很方便的使用这些库的时候,也让我们 ...

  6. ci 框架发送邮箱

    定义数据 $config = array(    'protocol' =>'smtp',    'smtp_host'=>'ssl://smtp.163.com',    'smtp_u ...

  7. CSS3形变——transform与transform-origin画时钟

    css3属性transform和transform-origin"画"时钟 效果图 前言 八哥:哈喽,大家好!好攻城狮就是我就是你们的小八,欢迎收听你的月亮...哦不,是很高兴与你 ...

  8. node c++多线程插件 第二天 c++指针

    虽然取名叫node多线程插件,但是目前还是在学习c++的情况. 今天谈一谈c++指针. c++指针就像是c#中的引用变量,例如一个Person类的实例zs{Name="张三",Ag ...

  9. SEO-关键词密度与友情链接交换技巧

    关键词密度 关键词密度 关键词密度与关键词频率所阐述的实质上是同一个概念,用来量度关键词在网页上出现的总次数与其他文字的比例,一般用百分比表示.相对于页面总字数而言,关键词出现的频率越高,关键词密度也 ...

  10. OpenStack/devstack with Neutron on Ubuntu 14 (1)

    安装前,推荐安装一个全新的Ubuntu Server14.04,如果使用之前的ubuntu, 中间可能遇到各种的python包依赖,以及软件版本不对应的问题 环境准备,新建stack用户,给予sudo ...