赞
踩
目录
这个主要是生活遇见的一个场景,就是订单未支付 ,时间过期自动取消, 记个小笔记了
当然实际业务肯定要很复杂点的,这个小demo需要去扩展才行,结合实际业务去完善,
比如一个用户下单了, 这个订单数据在入redis库的时候,我们设置了过期时间15分钟, 当线程在判断的时候 发现对比当前时间 超过15 分了 ,订单过期了, 就给监听频道发送取消订单消息,然后处理业务 返回对应用户消息提示
- import redis.clients.jedis.Jedis;
- import redis.clients.jedis.JedisPubSub;
-
- public class RedisDelayQueue {
- private Jedis jedis = null;
-
- public RedisDelayQueue() {
- jedis = new Jedis("localhost", 6379);
- }
-
- public void addOrder(String orderId, int delay) {
- long timestamp = System.currentTimeMillis() + delay * 1000;
- jedis.zadd("delay_queue", timestamp, orderId);
- }
-
- public void startListener() {
- new Thread(() -> {
- JedisPubSub jedisPubSub = new JedisPubSub() {
- @Override
- public void onMessage(String channel, String message) {
- System.out.println("Cancel order: " + message);
- }
- };
- jedis.subscribe(jedisPubSub, "cancel_order");
- }).start();
-
- new Thread(() -> {
- while (true) {
- long timestamp = System.currentTimeMillis();
- String orderId = jedis.zrangeByScore("delay_queue", 0, timestamp, 0, 1).stream().findFirst().orElse(null);
- if (orderId != null) {
- jedis.zrem("delay_queue", orderId);
- jedis.publish("cancel_order", orderId);
- }
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }).start();
- }
- }
- <dependency>
- <groupId>redis.clients</groupId>
- <artifactId>jedis</artifactId>
- <version>3.6.0</version>
- </dependency>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。