Redis stream特性了解

在发布订阅中我们了解到发布订阅模式存在的无法持久化保存消息和对于离线重连的客户端不能读取历史消息的缺陷,以下就来了解一下stream是如何解决这个问题的

steam是类似于仅添加log的数据结构,提供了以下基本命令

  • XADD: 添加新条目到stream

    # 语法xadd {key} {id_generator} {key} {value} [{key} {value} ...]
    # id表示生成id的规则。*表示时间戳 + 序号的方式自动生成ID,用户也可以自己指定 ID
    xadd skey * name alex age 16
    
  • XREAD: 读取条目

    # xread [Count {count}] [BLOCK {ms}] STREAMS {key} {id}
    # Block 0代表一致堵塞
    # id采用$代表最新的id
    # 查询skey stream id 100001之后的第一条消息
    xread Count 1 STREAMS skey 100001
    
  • XDEL: 根据id删除消息

    xdel skey 100001
    
  • DEL: 删除stream

    del skey
    
  • XRANGE: 返回范围内的条目

    # xrange {key} start end [Count {count}]
    # - 表示第一条消息 +表示最后一条消息
    # 查询skey steam的第一条到最后一条消息
    xrange skey - +
    
  • XLEN: 返回流的长度

    xlen skey
    
  • XINFO: 展示stream的信息

    # 展示stream skey关于流如何在内部编码的信息,还显示了流中的第一个和最后一个消息。另一个可用的信息是与此流关联的消费者组的数量。
    XINFO STREAM skey
    # 询问更多关于消费者群体的信息
    XINFO GROUPS skey
    

消费组

  • XGROUP: 创建、销毁、管理消费组

    # xgroup create {stream_key} {group_key} {offset}
    # 0-0代表从第一条消息开始读取,$代表读取新消息
    # 可以在最后添加MKSTREAM来自动创建不存在的stream
    xgroup create skey gname $
    
  • XREADGROUP: 通过消费组读取消息

    # xreadgroup group {group_key} {consumer_key} streams {stream_key} {id}
    # > 代表到目前为止,消息从未传递给其他消费者
    xreadgroup group gname cname streams skey >
    

    如果ID是特殊ID >,则该命令将只返回到目前为止从未传递给其他消费者的新消息,并且作为副作用,将更新消费者组的最后一个ID。

    如果ID是任何其他有效的数字ID,那么该命令将允许我们访问pending消息的历史记录。也就是说,传递给该指定使用者(由所提供的名称标识)的消息集,并且到目前为止从未使用XACK进行确认。

  • XACK: 标记消息已被处理

    # 标记之后的消息就不在pending消息历史中了
    XACK skey gname 1692632639151-0
    
消息子集所有权转移
  • XPENDING: 输出消费组pending消息数量

    # XPENDING <key> <groupname> [[IDLE <min-idle-time>] <start-id> <end-id> <count> [<consumer-name>]]
    # 输出stream skey所在消息组gname的信息
    xpending skey gname
    
  • XCLAIM: 变更消费者消息所有权

    # XCLAIM <key> <group> <consumer> <min-idle-time> <ID-1> <ID-2> ... <ID-N>
    # 提供了最小空闲时间,因此只有当上述消息的空闲时间大于指定的空闲时间时,操作才会工作。这很有用,因为可能有两个客户端同时试图重新声明一条消息
    XCLAIM skey gname cname 60000 1692632647899-0
    

    6.2之后引入了XAUTOCLAIM,用于自动识别空闲的挂起消息,并将它们的所有权转移给消费者

与发布订阅的区别

所有消息都无限期地添加到流中(除非用户显式地要求删除条目):不同的消费者将通过记住最后收到的消息的ID,从其角度知道什么是新消息。

流消费者组提供了发布订阅无法实现的控制级别,对同一流使用不同的组,明确确认已处理的项目,检查挂起项目的能力,声明未处理的消息,以及每个单个客户端的连贯历史可见性,只能看到其私有的过去的消息历史。

性能

添加一个条目是O(1)、访问任何单条目都是O(n),其中n是ID的长度。

由于流id通常很短且长度固定,因此这有效地减少了常量查找时间。

Ref

  1. https://redis.io/docs/data-types/streams/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/659969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试题宝典(万字长文)

Java 基础 1. JDK 和 JRE 有什么区别&#xff1f; JRE是Java运行环境&#xff0c;即&#xff08;Java Runtime Environment&#xff09;&#xff0c;也就是Java平台。所有的Java程序都要在JRE下才能运行。 JDK是开发工具包&#xff0c;即&#xff08;Java Development Kit&am…

Python——turtle库笔记②

填充颜色 turtle.fillcolor(colorstring) turtle.fillcolor() turtle.fillcolor((r, g, b)) turtle.fillcolor(r, g, b) 填充 turtle.filling() #返回填充状态 (填充为 True&#xff0c;否则为 False)。 turtle.begin_fill() #在绘制要填充的形状之前调用 turtle.end_fill()…

【Docker与微服务】基础篇

1 Docker简介 1.1 docker是什么 1.1.1 问题&#xff1a;为什么会有docker出现&#xff1f; 假定您在开发一个项目&#xff0c;您使用的是一台笔记本电脑而且您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。您正在开发的应用依赖于您当前的配置且还要依…

数据结构与算法面试系列-02

1. 一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,请问该数是多少? 程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析: 程序代码如下: package com.yoodb.uti…

js获取dom元素的宽度数值

有的时候我们需要依赖元素的具体的宽高数值&#xff0c;那这个时候就需要你来进行调用了相关的api进行获取了 这个需要搭配 getComputedStyle getPropertyValue <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

android 自定义下拉框

一、 简介&#xff1a; 原生Android 提供的spinner下拉框不怎么方便&#xff0c;样式有点丑。修改起来麻烦&#xff0c;于是就自己动手写了一下拉列表。 实现原理使用的是&#xff0c;popwindow弹框&#xff0c;可实现宽高自定义&#xff0c;下拉列表使用listview. 二、pop弹框…

vue3兼容超宽屏、超窄屏、4K屏幕等等

vue3兼容超宽屏、超窄屏、4K屏幕等等 在你的项目src下创建一个hooks文件夹 在里面创建一个 UserScalePage.ts文件 在里面写上 import { onMounted, onUnmounted } from "vue"; import _ from "lodash"; export default function UserScalePage(opstion: …

大模型基础架构的变革:剖析Transformer的挑战者(中)

上一篇文章中&#xff0c;我们介绍了RetNet、RWKV、Mamba等有可能会替代Transformer的模型架构&#xff0c;这一篇文章我们将要介绍另外三个有可能会替代Transformer的模型架构&#xff0c;它们分别是UniRepLKNet、StripedHyena、PanGu-π&#xff0c;想了解之前的内容&#xf…

vue项目改造服务端渲染

vue项目改造服务端渲染 概述 【定义】 服务器渲染的Vue应用程序被认为是"同构"或"通用"&#xff0c;因为应用程序的大部分代码都可以在服务器和客户端上运行 【优点】 与传统SPA相比&#xff0c;服务器端渲染(SSR)的优势主要在于&#xff1a; 1、更好的…

二叉树-堆应用(1)

目录 堆排序 整体思路 代码实现 Q1建大堆/小堆 Q2数据个数和下标 TopK问题 整体思路 代码实现 Q1造数据CreateData Q2建大堆/小堆 建堆的两种方法这里会用到前面的向上/向下调整/交换函数。向上调整&向下调整算法-CSDN博客 堆排序 整体思路 建堆&#xff08;直…

【硬件产品经理】锂电池充电时间怎么计算?

目录 前言 电池容量 充电器功率 电能转换效率 充电时间计算 作者简介<

LeetCode2670. 找出不同元素数目差数组:哈希表(预处理)

【LetMeFly】2670.找出不同元素数目差数组&#xff1a;哈希表&#xff08;预处理&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-the-distinct-difference-array/ 给你一个下标从 0 开始的数组 nums &#xff0c;数组长度为 n 。 nums 的 不同元素…

Qt 5.9.4 转 Qt 6.6.1 遇到的问题总结(三)

1.QSet: toList 中的toList 函数已不存在&#xff0c;遇到xx->toList改成直接用&#xff0c;如下&#xff1a; 2.开源QWT 图形库中QwtDial中的 setPenWidth 变成 setPenWidthF函数。 3.QDateTime 中无setTime_t 改为了setSecsSinceEpoch函数。 4.QRegExp 类已不存在 可以用Q…

【定位·HTML】

定位布局可以分为以下四种&#xff1a; 静态定位&#xff08;inherit&#xff09; 相对定位&#xff08;relative&#xff09; 绝对定位&#xff08;absolute&#xff09; 固定定位&#xff08;fixed&#xff09; 一般的标签元素不加任何定位属性时&#xff0c;默认都属于静态…

百川终入海 ,一站式海量数据迁移工具 X2Doris 正式发布

在大数据分析领域&#xff0c;Apache Doris 作为广受认可的开源实时数据仓库&#xff0c;已经在越来越多行业用户的真实业务场景中得到广泛应用&#xff0c;成为许多企业数据分析基础设施的重要基座。尤其在过去一年多的时间里&#xff0c;越来越多企业选择基于 Apache Doris 进…

node.js(nest.js控制器)学习笔记

nest.js控制器&#xff1a; 控制器负责处理传入请求并向客户端返回响应。 为了创建基本控制器&#xff0c;我们使用类和装饰器。装饰器将类与所需的元数据相关联&#xff0c;并使 Nest 能够创建路由映射&#xff08;将请求绑定到相应的控制器&#xff09;。 1.获取get请求传参…

html css javascript写一个扫雷

文章目录 一、html css javascript写一个扫雷二、JavaScript三、HTML四、CSS五、热门文章 一、html css javascript写一个扫雷 一个简单的使用HTML、CSS和JavaScript编写的扫雷游戏的示例代码&#xff1a; <!DOCTYPE html> <html> <head><title>扫雷…

牛客——中位数图(连续子数组和二维前缀和)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 给出1~n的一个排列&#xff0c;统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后&#xff0c;位于中间的数。 输入描述: 第一行为两个正…

CentOS gui 图形界面显示文字乱码

一、现象 CentOS&#xff08;CentOS 7.5&#xff09;控制台下显示中文乱码&#xff1a; 或者通过X11 Forwarding远程显示CentOS的图形化程序文字乱码&#xff1a; 二、解决方法 安装中文语言包&#xff1a; yum install kde-l10n-Chinese 注&#xff1a;网上有些文章会推荐安…

Linux文本三剑客---grep经典案例

grep&#xff08;从文本或字符串种过滤特定内容。&#xff09; 格式&#xff1a;Usage: grep [OPTION]... PATTERNS [FILE]... 常用选项&#xff1a; -E 等价于 egrep 扩展正则 -i 忽略大小写 -w 匹配单词 -o 仅显示匹配内容 -r 递归匹配 -c 统计匹配的行数 -v 取反 -n 行号 -A…