redis中怎么用list做消息队列
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,本文小编为大家详细介绍"redis中怎么用list做消息队列",内容详细,步骤清晰,细节处理妥当,希望这篇"redis中怎么用list做消息队列"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一
千家信息网最后更新 2025年11月09日redis中怎么用list做消息队列
本文小编为大家详细介绍"redis中怎么用list做消息队列",内容详细,步骤清晰,细节处理妥当,希望这篇"redis中怎么用list做消息队列"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
leftPush消息入队,rightPop对应,消息出队。
rightPop(RedisConstant.MQ_LIST, 0L, TimeUnit.SECONDS)阻塞出队,0表示永久阻塞
生产消息服务
@Servicepublic class RedisService { @Autowired private RedisTemplate 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 listOperations = redisTemplate.opsForList(); //leftPush和rightPop对应,左边入队,右边出队 listOperations.leftPush(RedisConstant.MQ_LIST, s); //因为出队是阻塞读取的,所以上一步入队后,数据立刻就被驱走了,下一步size=0 Long size = listOperations.size(RedisConstant.MQ_LIST); List 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 { @Autowired private RedisService redisService; @GetMapping("publish") public Object publish() { return redisService.publish(); }}消费消息服务,定时任务
@Componentpublic class RedisConsumeTask { @Autowired private RedisService redisService; @TaskLock(RedisConstant.CONSUME_REDIS_LIST) @Scheduled(cron = "0/10 * * * * ?") public void consumeMqList() { redisService.consumeMqList(); }}@Service@Slf4jpublic class RedisService { @Autowired private RedisTemplate redisTemplate; public void consumeMqList() { ListOperations 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@Aspectpublic class TaskLockAop { @Autowired private 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"}"]
下面一直阻塞,任务开始了,不收到消息,永远不会结束。
阻塞有问题,改用轮询了。
先启动发送消息服务,发送消息。后启动消费消息服务,可以消费消息。这一点,比发布订阅要稳定。
读到这里,这篇"redis中怎么用list做消息队列"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
消息
阻塞
任务
服务
消费
队列
文章
内容
问题
永久
测试
妥当
再次
右边
小时
思路
数据
新知
日志
时间
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库排序组
临港区网络安全
计算机网络安全基础水光针搭配
网络安全成立多少周年
小孩学软件开发学费多少钱
我的世界农业养老服务器
全国大学网络技术大赛
用户发布的文章怎么创建数据库
阜阳大中小型视频系统服务器
网络安全法中的证据保护规定
2017中国网络安全论坛
旅游休闲软件开发
局域网如何制作文件服务器
智航盛网络技术广州有限公司
八爪鱼采集数据到本地数据库
打witch的服务器
贵州省网络技术技师
临沂全速网络技术有限公司
网络安全与执法(移民方向)
如何作软件开发
网络安全钥匙框弹不出来
数据库设计题ER图
数据库什么是事物的特点
neo2t续航小白测评数据库
服务器安全狗屏蔽ip
侠客软件开发是哪里的
服务器怎么租
网络安全学习网址
创建名字为mydb的数据库代码
服务器系统数据流量不够用