# 业务场景

我们以订单功能为例说明下:生成订单后一段时间不支付订单会自动关闭。最简单的想法是设置定时任务轮询,但是每个订单的创建时间不一样,定时任务的规则无法设定,如果将定时任务执行的间隔设置的过短,太影响效率。还有一种想法,在用户进入订单界面的时候,判断时间执行相关操作。方式可能有很多,在这里介绍一种监听 Redis 键值对过期时间来实现订单自动关闭。整理了一份Java面试宝典完整版PDF

# 实现思路

在生成订单时,向 Redis 中增加一个 KV 键值对,K 为订单号,保证通过 K 能定位到数据库中的某个订单即可,V 可为任意值。假设,生成订单时向 Redis 中存放 K 为订单号,V 也为订单号的键值对,并设置过期时间为 30 分钟,如果该键值对在 30 分钟过期后能够发送给程序一个通知,或者执行一个方法,那么即可解决订单关闭问题。实现:通过监听 Redis 提供的过期队列来实现,监听过期队列后,如果 Redis 中某一个 KV 键值对过期了,那么将向监听者发送消息,监听者可以获取到该键值对的 K,注意,是获取不到 V 的,因为已经过期了,这就是上面所提到的,为什么要保证能通过 K 来定位到订单,而 V 为任意值即可。拿到 K 后,通过 K 定位订单,并判断其状态,如果是未支付,更新为关闭,或者取消状态即可。

# 开启 Redis key 过期提醒

修改 redis 相关事件配置。找到 redis 配置文件 redis.conf,查看 notify-keyspace-events 配置项,如果没有,添加 notify-keyspace-events Ex,如果有值,则追加 Ex,相关参数说明如下:

  • K:keyspace 事件,事件以 keyspace@ 为前缀进行发布

  • E:keyevent 事件,事件以 keyevent@ 为前缀进行发布

  • g:一般性的,非特定类型的命令,比如del,expire,rename等

  • $:字符串特定命令

  • l:列表特定命令

  • s:集合特定命令

  • h:哈希特定命令

  • z:有序集合特定命令

  • x:过期事件,当某个键过期并删除时会产生该事件

  • e:驱逐事件,当某个键因 maxmemore 策略而被删除时,产生该事件

  • A:g$lshzxe的别名,因此”AKE”意味着所有事件

# 引入依赖

在 pom.xml 中添加 org.springframework.boot:spring-boot-starter-data-redis 依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

# 相关配置

定义配置 RedisListenerConfig 实现监听 Redis key 过期时间

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;@Configuration
public class RedisListenerConfig {@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);return container;}
}

定义监听器 RedisKeyExpirationListener,实现KeyExpirationEventMessageListener 接口,查看源码发现,该接口监听所有 db 的过期事件 keyevent@*:expired"整理了一份Java面试宝典完整版PDF

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;/*** 监听所有db的过期事件__keyevent@*__:expired"*/
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}/*** 针对 redis 数据失效事件,进行数据处理* @param message* @param pattern*/@Overridepublic void onMessage(Message message, byte[] pattern) {// 获取到失效的 key,进行取消订单业务处理String expiredKey = message.toString();System.out.println(expiredKey);}
}

美团面试官:生成订单后一段时间不支付订单会自动关闭的功能该如何实现?越详细越好~相关推荐

  1. 美团面试官:生成订单后一段时间不支付订单会自动关闭的功能该如何实现?

    正文如下: 业务场景 我们以订单功能为例说明下:生成订单后一段时间不支付订单会自动关闭.最简单的想法是设置定时任务轮询,但是每个订单的创建时间不一样,定时任务的规则无法设定,如果将定时任务执行的间隔设 ...

  2. java实现订单未支付失效_生成订单后一段时间不支付订单会自动关闭的功能该如何实现?...

    业务场景 我们以订单功能为例说明下:生成订单后一段时间不支付订单会自动关闭.最简单的想法是设置定时任务轮询,但是每个订单的创建时间不一样,定时任务的规则无法设定,如果将定时任务执行的间隔设置的过短,太 ...

  3. cms是什么意思啊_美团面试官问我:ZGC 的 Z 是什么意思?

    本文的阅读有一定的门槛,请先了解 GC 的基本知识. 现代垃圾收集器的演进大部分都是往减少停顿方向发展. 像 CMS 就是分离出一些阶段使得应用线程可以和垃圾回收线程并发,当然还有利用回收线程的并行来 ...

  4. java runtime ssh 后执行指令_酒后系列:被某厂面试官吊打后酒后整理的JVM干货

    为什么要写这么一篇文章呢,因为很基础,很基础,很基础,重要的事情说三遍!!!哼,还不是因为面试的时候经常会被问到,哈哈哈哈哈 ,为此我静下心来,狠心写下了这一篇文章,好去对付一般的面试官,也可以帮助你 ...

  5. 台式机就是什么计算机,台式电脑启动后一段时间后自动关机是怎么回事?

    首先小九给大家拜个晚年,祝大家晚年快乐,狗年大吉,小九今年过节在我媳妇家过得年,媳妇家新安装了一个55寸三星电视贝漂亮,刚到家想晚上一家人一起看个电影啥的乐呵乐呵!找个个电影解解闷,因为我知道她家有个 ...

  6. 京东面试官:给我说说你简历上的订单系统是如何设计的?尽量详细点~

    热门文章推荐: 2021年电商基础面试总结 视频 |Java高性能优化电商秒杀 Redis 的 8 大数据类型,写得非常好! 面试中问什么问题最能让面试官记忆犹新? 一个人决定离职的征兆有哪些?202 ...

  7. 美团面试官问我: ZGC 的 Z 是什么意思

    本文的阅读有一定的门槛,请先了解 GC 的基本只知识. 现代垃圾收集器的演进大部分都是往减少停顿方向发展. 像 CMS 就是分离出一些阶段使得应用线程可以和垃圾回收线程并发,当然还有利用回收线程的并行 ...

  8. 美团面试官:MySQL主备、主从、读写分离你知道多少?

    一.MySQL主备的基本原理 在状态1中,客户端的读写都直接访问节点A,而节点B是A的备库,只是将A的更新都同步过来,到本地执行.这样可以保持节点B和A的数据是相同的.当需要切换的时候,就切成状态2. ...

  9. 5月面试美团面试官问到MySQL时我竟无言以对,闭关42天,再战美团

    MySQL 作为主流的数据库,在业务开发中有着举足轻重的地位.绝大部分一线企业,尤其是电商大厂,在线交易业务这块,如订单.支付系统,都离不开 MySQL 这种金融级的关系型数据库.因此在选用人才时,大 ...

最新文章

  1. vivado----fpga硬件调试 (四)----mark_debug
  2. ELK logstash gork匹配在线测试
  3. Python 用一行代码完成词频统计与分析,词频分析如此简单
  4. java木马编码,深度好文:解码“深度伪装”的ZeuS网银木马
  5. gitbook:gitbook-cli\node_modules\npm\node_modules\graceful-fs\polyfills.js
  6. 为什么产品经理都在学画原型?
  7. (第两百篇BLOG记录)写于博士三年级结束-20210529
  8. python时间函数纳秒_在Python中以秒和纳秒获取POSIX / Unix时间?
  9. 【CV】斯坦福CS231n DL-CV by李飞飞 team
  10. 5.Wide Deep Learning for Recommender Systems论文详细解读和代码实现
  11. 32位w7怎么升64位|w7系统32位升级64位教程
  12. MySql 中 PK、NN、UQ、BIN、UN、ZF、AI、G分别代表什么意思
  13. C语言中chdir()使用
  14. SAP的SLED的2个验证
  15. jmeter常用逻辑控制器的使用(如果(if)控制器)
  16. Spark基础学习笔记06:搭建Spark On YARN集群
  17. My97DatePicker日历控件基本用法
  18. hp probook 4411s电脑在用光盘安装时没有镜像问题
  19. 某鱼APP x-sign x-mini-wua x-sgext 分析成果
  20. 利用DevicePolicyManager执行屏幕锁定

热门文章

  1. u盘在linux系统上只读,解决办法:
  2. wpf和wp7版网络音乐播放器,使用虾米网的资源
  3. OBCP考试经验分享
  4. 热云数据白冬立:做智能数据服务的提供商
  5. 如何更改计算机上的网络设置路由器,宽带重新换路由器怎么设置【图】
  6. 最简单部署k8s集群(一)
  7. php api接口乱码,php api 中文乱码
  8. isspace()方法
  9. 要学习Java,英语真的很重要吗?
  10. 【css】苹果手机上input的button按钮颜色显示问题