广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >redis用list做消息队列的实现示例
  • 397
分享到

redis用list做消息队列的实现示例

2024-04-02 19:04:59 397人浏览 独家记忆
摘要

目录生产消息服务消费消息服务,定时任务日志测试leftPush消息入队,rightPop对应,消息出队。 rightPop(RedisConstant.MQ_LIST, 0L, Ti

leftPush消息入队,rightPop对应,消息出队。

rightPop(RedisConstant.MQ_LIST, 0L, TimeUnit.SECONDS)阻塞出队,0表示永久阻塞

生产消息服务

@Service
public class RedisService {
    @Autowired
    private 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=0
        Long 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 {

    @Autowired
    private RedisService redisService;

    @GetMapping("publish")
    public Object publish() {
        return redisService.publish();
    }
}

消费消息服务,定时任务

@Component
public class RedisConsumeTask {
    @Autowired
    private RedisService redisService;

    @TaskLock(RedisConstant.CONSUME_REDIS_LIST)
    @Scheduled(cron = "0/10 * * * * ?")
    public void consumeMqList() {
        redisService.consumeMqList();
    }
}

@Service
@Slf4j
public class RedisService {

    @Autowired
    private 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 {

    @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”}"]

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

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

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

到此这篇关于redis用list做消息队列的实现示例的文章就介绍到这了,更多相关redis list消息队列内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: redis用list做消息队列的实现示例

本文链接: https://www.lsjlt.com/news/139668.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • redis用list做消息队列的实现示例
    目录生产消息服务消费消息服务,定时任务日志测试leftPush消息入队,rightPop对应,消息出队。 rightPop(RedisConstant.MQ_LIST, 0L, Ti...
    99+
    2022-11-13
  • redis中怎么用list做消息队列
    本文小编为大家详细介绍“redis中怎么用list做消息队列”,内容详细,步骤清晰,细节处理妥当,希望这篇“redis中怎么用list做消息队列”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。leftPush消息入...
    99+
    2023-06-29
  • Redis 使用 List 实现消息队列的优缺点
    目录什么是消息队列消息队列满足哪些特性消息有序性重复消息处理可靠性List 实现消息队列LPUSHRPOP实时消费问题重复消费消息可靠性需要注意的是Redission 实战添加依赖J...
    99+
    2022-11-12
  • Java利用Redis实现消息队列的示例代码
    本文介绍了Java利用Redis实现消息队列的示例代码,分享给大家,具体如下:应用场景为什么要用redis?二进制存储、java序列化传输、IO连接数高、连接频繁一、序列化这里编写了一个java序列化的工具,主要是将对象转化为byt...
    99+
    2023-05-31
    java redis 消息队列
  • 如何利用redis做消息队列
    利用redis做消息队列的示例:生产者模拟程序,代码:package scheduleTest; import java.util.Random; import java.util.UUID; import redis.clients.je...
    99+
    2022-10-14
  • Redis中如何实现消息队列和延时消息队列
    这篇文章将为大家详细讲解有关Redis中如何实现消息队列和延时消息队列,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。list的几个命令lpush (left push)由...
    99+
    2022-10-19
  • redis能不能用来做消息队列
    这篇文章主要介绍了redis能不能用来做消息队列,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。应用场景:例如秒杀。瞬时大量写入订单到数据库,导致...
    99+
    2022-10-18
  • redis怎么实现消息队列
    Redis可以通过以下几种方式实现消息队列:1. List数据结构:使用Redis的List数据结构实现简单的消息队列。生产者将消息...
    99+
    2023-09-14
    redis
  • redis实现消息队列的方法
    这期内容当中的小编将会给大家带来有关redis实现消息队列的方法,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。消息队列,Message Queue,常用于解决并发系统中的资源一致性问题...
    99+
    2022-10-18
  • redis stream 实现消息队列的实践
    目录Redis 实现消息对列4中方法发布订阅list 队列zset 队列Stream 队列基本命令xadd 生产消息读取消息xgroup 消费者组xreadgroup 消费消息Pending 等待列表消息确认消息转移信息...
    99+
    2022-08-10
    redisstream消息队列 redis消息队列
  • 如何使用redis实现消息队列
    使用redis实现消息队列的示例:redis的pubsub功能实现发布订阅模式,代码:import redisclass Task(object):def __init__(self):self.rcon = redis.StrictRed...
    99+
    2022-10-24
  • PHP实现RabbitMQ消息列队的示例代码
    目录业务场景1、首先部署好thinkphp6框架2、安装workerman扩展3、生产者4、消费者5、整体测试业务场景 项目公司是主php做开发的,框架为thinkphp。众所周知,...
    99+
    2022-11-13
  • Java实现Redis延时消息队列
    目录什么是延时任务 延时任务的特点 实现思路: 代码实现 1.消息模型2.RedisMq 消息队列实现类3.消息生产者 4.消息消费者 5. 消息执接口 6. 任务类型的实现类:可以...
    99+
    2022-11-12
  • RabbitMQ消息队列实现延迟任务示例
    目录一、序言1、实现原理2、组件选型二、方案设计(一)服务器(二)生产者(三)消费者三、SpringBoot实现(一)生产者(二)消费者(三)通用工具包一、序言 延迟任务应用广泛,延...
    99+
    2022-11-13
  • 详解Redis用链表实现消息队列
    前言 Redis链表经常会被用于消息队列的服务,以完成多程序之间的消息交换。个人认为redis消息队列有一个好处,就是可以实现分布式和共享,就和memcache作为mysql的缓存和mysql自带的缓存一样...
    99+
    2022-06-04
    队列 详解 链表
  • redis中队列消息实现应用解耦
    本篇文章给大家分享的是有关redis中队列消息实现应用解耦,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、如果redis服务器挂掉了怎么办啊...
    99+
    2022-10-18
  • Redis怎么使用ZSET实现消息队列
    这篇文章主要介绍了Redis怎么使用ZSET实现消息队列的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis怎么使用ZSET实现消息队列文章都会有所收获,下面我们一起来看看吧。1.redis 用zset做消...
    99+
    2023-07-05
  • Redis如何实现消息队列功能
    Redis如何实现消息队列功能随着互联网的发展,消息队列在分布式系统中变得越来越重要。消息队列允许不同的应用程序之间通过异步通信来传递和处理消息,提高了系统的可伸缩性和可靠性。Redis作为一款快速、可靠、灵活的内存数据库,也可以用来实现消...
    99+
    2023-11-07
    redis 实现 消息队列
  • Redis消息队列怎么实现秒杀
    要实现秒杀功能,可以使用Redis的消息队列来进行异步处理。下面是一种基本的实现方法:1. 准备工作:创建一个商品库存键值对,如"s...
    99+
    2023-10-11
    Redis
  • python使用redis实现消息队列(异步)的实现完整例程
    目录安装相关库消息队列实现及使用创建配置文件代码实现最近在用fastapi框架开发web后端,由于近几年python异步编程大火,fastapi凭借高性能也火了起来。本篇介绍了在异步环境下实现Redis消息队列的方法,代...
    99+
    2023-01-18
    pythonredis消息队列 pythonredis异步
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作