首页 > 数据库 >redis 消息队列方案

redis 消息队列方案

时间:2023-08-29 10:36:04浏览次数:32  
标签:方案 订阅 队列 REDIS redis 消息 message blockingDeque

  1. List 实现消息队列
    • 使用LPUSH、RPOP 左进右出或RPUSH、LPOP 右进左出,实现消息顺序消费
    • 使用 BLPOP、BRPOP 这种阻塞式读取的命令,实现消息及时消费
    • ack 机制 使用,使用index 读取list 的消息,正常消费完成后再使用POP删除
    // 使用redission实现
    @Slf4j
    @Service
    public class QueueService {
    
      @Autowired
      private RedissonClient redissonClient;
    
      private static final String REDIS_MQ = "redisMQ";
    
      /**
      * 发送消息到队列头部
      *
      * @param message
      */
      public void sendMessage(String message) {
         RBlockingDeque<String> blockingDeque = redissonClient.getBlockingDeque(REDIS_MQ);
    
         try {
               blockingDeque.putFirst(message);
               log.info("将消息: {} 插入到队列。", message);
         } catch (InterruptedException e) {
               e.printStackTrace();
         }
      }
    
    /**
     * 从队列尾部阻塞读取消息,若没有消息,线程就会阻塞等待新消息插入,防止 CPU 空转
     */
    public void onMessage() {
        RBlockingDeque<String> blockingDeque = redissonClient.getBlockingDeque(REDIS_MQ);
        while (true) {
            try {
                String message = blockingDeque.takeLast();
                log.info("从队列 {} 中读取到消息:{}.", REDIS_MQ, message);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    }```
    
  2. 发布/订阅模式同样可以实现进程间的消息传递,其原理如下:
    "发布/订阅"模式包含两种角色,分别是发布者和订阅者。订阅者可以订阅一个或者多个频道(channel),而发布者可以向指定的频道(channel)发送消息,所有订阅此频道的订阅者都会收到此消息。
    缺点: 无法实现消息持久化,没有订阅者者数据会被丢弃
  3. 基于zset实现延时队列
    zset 会按 score 进行排序,如果 score 代表想要执行时间的时间戳。在某个时间将它插入zset集合中,它变会按照时间戳大小进行排序,也就是对执行时间前后进行排序。
    起一个死循环线程不断地进行取第一个key值,如果当前时间戳大于等于该key值的socre就将它取出来进行消费删除,可以达到延时执行的目的。

zset命令

  • 范围查询所有 zrange yuwen 0 -1 withscores
  • 添加/更新 ZADD yuwen 90 s01 89 s03 99 s02 74 s04 97 s05
  • 查询指定分数 ZSCORE yuwen s03
  • 查询分数范围 ZRANGEBYSCORE yuwen 90 100 withscores
  • 删除 ZREM myzset member1

标签:方案,订阅,队列,REDIS,redis,消息,message,blockingDeque
From: https://www.cnblogs.com/rise0111/p/17664118.html

相关文章

  • px转rem适配方案之postcss-pxtorem
    一、安装npminstallpostcss-pxtorem--save-dev二、增加postcss.config.js文件在目录文件下增加postcss.config.js并添加相关配置//https://github.com/michael-ciniawsky/postcss-load-configmodule.exports={'plugins':{//toedittargetbrowsers:use......
  • 栈和队列在数据结构中的应用
    文章目录理解栈和队列的概念及其特点栈的应用和操作队列的应用和操作结论......
  • 安防视频监控平台EasyCVR视频集中存储平台接入RTSP设备出现离线情况的问题解决方案
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的......
  • Redis 缓存满了怎么办?
    Redis缓存使用内存来保存数据,随着需要缓存的数据量越来越大,有限的缓存空间不可避免地会被写满。此时,应该怎么办?本篇文章接下来就来聊聊缓存满了之后的数据淘汰机制。值得注意的是,在Redis中 过期策略和内存淘汰策略是两个完全不同的概念。Redis过期策略指的是Redis使用......
  • redis的2种持久化方式:aof和rdb
    redis的rdb和aof持久化方式的区别及使用场景原创 陈烨123 java知路 2023-07-0422:25 发表于湖北Redis提供了两种持久化方式:RDB(RedisDatabase)和AOF(AppendOnlyFile)。RDB持久化是通过周期性地将Redis数据集快照写入磁盘上的二进制文件实现的。在触发持久化时,Redis会......
  • 队列和栈
    队列和栈是两种常见的数据结构,常用于存储和操作数据的方式。它们有不同的特点和用途。队列(Queue)是一种先进先出(First-In-First-Out,FIFO)的数据结构。可以将其想象成排队的人群,仅允许在队尾插入元素,从队头移除元素。新元素总是加入到队列的末尾,而最先加入的元素会最先被移除。队列......
  • Redis 为什么这么快?
    前言  作为一名后端软件工程师,工作中你肯定和Redis打过交道。但是Redis为什么快呢?很多人只能答出Redis因为它是基于内存实现的,但是对于其它原因都是模棱两可。那么今天就一起来看看是Redis为什么快吧:         Redis为什么这么快? 一、基于内......
  • Flutter跨端方案:2023年后 Flutter 还能火多久?
    前言随着Flutter3.10(包括对Web、mobile、图像、安全性等方面的持续改进)、Dart3的发布(带来了100%健全的空安全),我决定重新(开始)认识Flutter。不可否认的是,在数字时代,移动应用程序已成为大多数公司的必备品。随着智能手机的持续普及多,更多企业正在转向移动应用程序开发,以更有......
  • Redis数据持久化介绍
    Redis存储配置数据持久化,开启aof后,配置了aof重写规则,但aof文件仍然持续增长,当aof数据文件增长过大时,需要进行手动清理。本文意为手动清理aof文件提供帮助。同时对rdb和aof数据存储进行说明。1. Redis数据持久化介绍1.1. RDB数据存储RDB(RedisDatabase)通过快照的形式将数据保......
  • AR眼镜电路板|AR智能眼镜PCB生产设计方案
    随着摄像头和人机交互等技术的发展,AR眼镜的体验得到了质的飞跃。AR眼镜正在朝着更小、更轻、更薄的方向发展,但与用户对高舒适度和沉浸感的需求还有一定的差距,其中一个关键因素就是AR眼镜的电路板设计。客户提出了AR眼镜电路板的功能需求:1)要能够运行Android9.0或更高版本的系统,支......