leftPush消息入队,rightPop对应,消息出队。
rightPop(RedisConstant.MQ_LIST, 0L, TimeUnit.SECONDS)阻塞出队,0表示永久阻塞

生产消息服务

@Service
public class RedisService {@Autowiredprivate RedisTemplate<String, String> redisTemplate;public Object publish() {OrderDTO dto = new OrderDTO();dto.setId(1);dto.setCreateTime(new Date());dto.setMoney("12.34");dto.setOrderNo("orderNo1");String s = JSON.toJSONString(dto);ListOperations<String, String> listOperations = redisTemplate.opsForList();//leftPush和rightPop对应,左边入队,右边出队listOperations.leftPush(RedisConstant.MQ_LIST, s);//因为出队是阻塞读取的,所以上一步入队后,数据立刻就被驱走了,下一步size=0Long size = listOperations.size(RedisConstant.MQ_LIST);List<String> list = new ArrayList<>();if (size != null && size > 0) {list = listOperations.range(RedisConstant.MQ_LIST, 0, size - 1);}return list;}
}

测试

@RestController
@RequestMapping("redisList")
public class RedisListController {@Autowiredprivate RedisService redisService;@GetMapping("publish")public Object publish() {return redisService.publish();}
}

消费消息服务,定时任务

@Component
public class RedisConsumeTask {@Autowiredprivate RedisService redisService;@TaskLock(RedisConstant.CONSUME_REDIS_LIST)@Scheduled(cron = "0/10 * * * * ?")public void consumeMqList() {redisService.consumeMqList();}
}@Service
@Slf4j
public class RedisService {@Autowiredprivate RedisTemplate<String, String> redisTemplate;public void consumeMqList() {ListOperations<String, String> listOperations = redisTemplate.opsForList();//0时间,表示阻塞永久//待机一小时后,再次发消息,消费不了了,阻塞有问题啊。还得轮寻啊//String s = listOperations.rightPop(RedisConstant.MQ_LIST, 0L, TimeUnit.SECONDS);String s = listOperations.rightPop(RedisConstant.MQ_LIST);if (s == null) {return;}log.info("{} = {}", RedisConstant.MQ_LIST, s);OrderDTO dto = JSON.parseObject(s, OrderDTO.class);log.info("dto = {}", dto);}
}

日志

@Component
@Aspect
public class TaskLockAop {@Autowiredprivate RedisLockRegistry redisLockRegistry;@Around("execution(@TaskLock * * (..))")public Object taskAround(ProceedingJoinPoint pjp) throws Throwable {TaskLock taskAnnotation = ((MethodSignature)pjp.getSignature()).getMethod().getAnnotation(TaskLock.class);String lockKey = taskAnnotation.value();Lock lock = redisLockRegistry.obtain(lockKey);try {lock.tryLock(30L, TimeUnit.SECONDS);System.out.println("任务开始, " + lockKey + ", " + new Date());return pjp.proceed();} finally {lock.unlock();System.out.println("任务结束, " + lockKey + ", " + new Date());}}}

测试

http://localhost:9040/redisList/publish

["{“createTime”:1574394538430,“id”:1,“money”:“12.34”,“orderNo”:“orderNo1”}"]

下面一直阻塞,任务开始了,不收到消息,永远不会结束。
阻塞有问题,改用轮询了。

先启动发送消息服务,发送消息。后启动消费消息服务,可以消费消息。这一点,比发布订阅要稳定。

关联项目https://github.com/mingwulipo/cloud-demo.git

redis用list做消息队列相关推荐

  1. 使用Redis Stream来做消息队列和在Asp.Net Core中的实现

    Redis - Wikipedia 写在前面 我一直以来使用redis的时候,很多低烈度需求(并发要求不是很高)需要用到消息队列的时候,在项目本身已经使用了Redis的情况下都想直接用Redis来做消 ...

  2. php redis查看队列长度,php redis做消息队列解决流量削峰常用的5个指令

    线上的秒杀等业务场景,需要类似的解决方案,需要平安度过同时抢购带来的流量峰值的问题.如果此时还用mysql做消息队列是什么容易挂掉的,如果死轻量级的秒杀我们完全可以用redis来应对. 削峰从本质上来 ...

  3. 使用redis做消息队列mq的总结

    总结 目前使用redis做消息队列的的方式有3中,list,      publish/subscribe,       stream list做mq的总结 使用方法 1. 生产者可以 lpush 写 ...

  4. redis 怎么做消息队列 适合的场景

    redis也可以作为消息队列来使用,而且具备搭建简单,使用简易快捷的特点 适合的场景: 1.数据场景简单且单一 2.对数据的丢失是有容忍度的 3.对消费数据的正确消费是有容忍度的 目前实现redis消 ...

  5. Redis 使用 List 实现消息队列的利与弊

    作者 | 码哥字节 来源 | 码哥字节 分布式系统中必备的一个中间件就是消息队列,通过消息队列我们能对服务间进行异步解耦.流量消峰.实现最终一致性. 目前市面上已经有 RabbitMQ.RochetM ...

  6. java redis延迟队列_基于redis实现的延迟消息队列

    delay-queue redis实现延迟消息队列 需求背景 最近在做一个排队取号的系统 在用户预约时间到达前XX分钟发短信通知 在用户预约时间结束时要判断用户是否去取号了,不然就记录为爽约 在用户取 ...

  7. Pyspider 使用带认证redis集群作为消息队列

    文章目录 概述 pyspider message_queue 源码解读 pyspider的message_queue的配置文件 使用redis集群时的配置文件 使用redis单点,带认证时的messa ...

  8. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ

    RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ ...

  9. 14. Redis 发布订阅-实现消息队列

    Redis 除了做缓存, 也可以做消息队列, 实现简单的消息的发布和订阅.Redis 消息订阅支持精确订阅和模糊订阅两种模式! 1. Redis 消息队列 1.1 Redis 消息队列特点 当有新消息 ...

最新文章

  1. C++ 打造自己的Windows终端服务客户端(转)
  2. Android-静态代理模式
  3. SQL2005 属性 IsLocked 不可用于 登录[sa]
  4. 【LVS】简介与说明
  5. ybtoj洛谷P4406三角形面积并(扫描线)
  6. MySQL学习【第五篇SQL语句上】
  7. 算法高级(6)-共识(Raft)算法
  8. TIF合并Java代码
  9. 洛谷3389:【模板】高斯消元法——题解
  10. Jquery自定义$的名称(自定义变量)
  11. 软考软件设计师中级考试大纲(附题型举例)
  12. Python之shp文件
  13. PV、EV、AC、BAC、EAC、ETC等的含义及计算公式
  14. 人工智能导论——智能计算(进化算法+群智能优化)
  15. (06) Apache Felix 入门 - 06
  16. axios 框架的介绍和基本使用
  17. 微软企业库(Microsoft Enterprise Library Data Access Block)
  18. Restful 风格请求
  19. EXTJS入门教程及其框架搭建
  20. JAVA计算机毕业设计二手儿童闲置物品交易平台Mybatis+系统+数据库+调试部署

热门文章

  1. js动态产生对象push进数组,发现数组所有元素(element or object)一样
  2. Web存储—sessionStorage存储
  3. CSS:实现文本超出显示省略效果(可指定几行显示)
  4. JavaScript学习(三十八)—面向过程与面向对象
  5. 零基础带你学习计算机网络复习—(五)
  6. winccweb发布画面不显示_wincc web navigator 发布用户名或密码错误问题
  7. 楷书和草书哪幅更具有艺术性?
  8. 之前8年都在上班工资16000,厌倦了天天上班的日子,就裸辞了。现在很迷茫,下一步怎么办?
  9. 有些卖花生的人6.5元拿货,却卖6元,这是怎么回事?求解?
  10. 如何快速进入一个陌生的领域,高手通常用这三步