当前位置: 首页 > news >正文

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/

相关文章:

Redis stream特性了解

在发布订阅中我们了解到发布订阅模式存在的无法持久化保存消息和对于离线重连的客户端不能读取历史消息的缺陷&#xff0c;以下就来了解一下stream是如何解决这个问题的 steam是类似于仅添加log的数据结构&#xff0c;提供了以下基本命令 XADD: 添加新条目到stream # 语法xadd…...

苍穹外卖项目可以写的简历和如何优化简历

文章目录 重点写中规写添加自己个性的项目面试会问道的问题 我是一名双非大二计算机本科生&#xff0c;希望我的分享对你有帮助&#xff0c;点赞关注不迷路。 简历编写一直是很多人求职人的心病&#xff0c;我自己上学期有一门课程是去校内企业面试&#xff0c;当时我就感受出…...

C++:智能指针

C在用引用取缔掉指针的同时&#xff0c;模板的引入带给了指针新的发挥空间 智能指针简单的来说就是带有不同特性和内存管理的指针模板 unique_ptr 1.不能有多个对象指向一块内存 2.对象释放时内部指针指向地址也随之释放 3.对象内数据只能通过接口更改绑定 4.对象只能接收右值…...

用户界面(UI)、用户体验(UE)和用户体验(UX)的差异

对一个应用程序而言&#xff0c;UX/UE (user experience) 设计和 UI (user interface) 设计非常重要。UX设计包括可视化布局、信息结构、可用性、图形、互动等多个方面。UI设计也属于UX范畴。正是因为三者在一定程度上具有重叠的工作内容&#xff0c;很多从业多年的设计师都分不…...

react 之 UseReducer

UseReducer作用: 让 React 管理多个相对关联的状态数据 import { useReducer } from react// 1. 定义reducer函数&#xff0c;根据不同的action返回不同的新状态 function reducer(state, action) {switch (action.type) {case INC:return state 1case DEC:return state - 1de…...

C++:this隐藏参数

你是否有一个问题&#xff1a;C中成员函数中究竟是如何访问成员变量的&#xff1f; 其实了解后回答起来这个问题很简单&#xff0c;通过一个不受限的隐藏参数this&#xff0c;this是类的指针&#xff0c;通过它可以访问到类内的各种成员。 明白了这个问题就很好理解&#xff…...

MySQL事务原理-相关日志

文章目录 前言一、什么是事务&#xff1f;1.1 事务概念1.2 事务的四大特性1.3 事务的隔离级别 二、实现原理2.1 TODO2.2 TODO 前言 事务是由MySQL的引擎来实现的&#xff0c;通过show engines命令查看MySQL存储引擎类别&#xff0c;观察只有InnoDB存储引擎支持事务。 一、什么…...

内核Oops的几种定位方法

反汇编 报错信息 [ 1.826455] ------------[ cut here ]------------ [ 1.831091] Kernel BUG at c011fef0 [verbose debug info unavailable] [ 1.837344] Internal error: Oops - BUG: 0 [#1] PREEMPT THUMB2 [ 1.843108] Modules linked in: [ 1.846158] C…...

外包干了10个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...

2024美赛C完整思路

首先&#xff0c;题目明确表示可以自行选择额外的玩家信息或其他数据。因此最好找一些其他选手的数据以扩大数据集&#xff0c;与其他选题人作出数据集上的区分。大数据集可以帮助后续的建模实验更准确。 第一问本质就是开发一个评价模型&#xff0c;主要针对运动员得分的时刻…...

Backtrader 文档学习- Broker - Cheat-On-Open

Backtrader 文档学习- Broker - Cheat-On-Open 1.概述 V1.9.44.116增加了Cheat On Open的支持。对于全押的人来说&#xff0c;这似乎是一个必需的功能&#xff0c;用bar的收盘价后进行计算&#xff0c;希望与开盘价相匹配。 当开盘价差距&#xff08;上涨或下跌&#xff0c;取…...

基于微信浙江杭州某停车场车位预约小程序系统设计与实现 研究背景和意义、国内外现状

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…...

编程流程图

对于复杂流程&#xff0c;我做开发之前一般会 先画一下流程图。特别是多个部门有交叉的情况下&#xff1a; processOn&#xff1a; 这个是我之前 一直的选择&#xff0c;他可以画上面的这些&#xff0c;流程图&#xff0c;网页操作&#xff0c;但是他不是免费的&#xff0c;查过…...

2024年1月29日-2月4日(全面进行+收集虚幻商城免费资源)

从上周发现&#xff0c;一轮轮推就行&#xff0c;每轮多个时间片&#xff0c;每个时间片一门。周一到周五一轮&#xff0c;周六日多轮&#xff08;比如上下午各一轮&#xff09;。 周一&#xff1a; 7&#xff1a;09–9&#xff1a;20卫星导航定位&#xff08;p3&#xff09;&a…...

【python接口自动化】- 正则用例参数化

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…...

Java中的四种线程池详解及使用场景

前言 在Java并发编程中&#xff0c;JDK提供了一套强大的线程池工具类java.util.concurrent.ThreadPoolExecutor以及它的四个便捷工厂方法&#xff0c;这四种线程池分别对应不同的使用场景和特性。下面将详细介绍每种线程池的创建方式、工作原理以及适用场景。 1. CachedThrea…...

Google Chrome 常用的几个参数

1 右键--Google Chrome--属性--目标 参数作用--disable-infobars此计算机将不会再收到 Google Chrome 更新&#xff0c;因为 Windows XP 和 Windows Vista 不再受支持。适用于 xp、2003 的 49.x.x.x 版本。示例1--ingore-certificate-errors忽略证书错误--disable-background-…...

Keil软件某些汉字输出乱码,0xFD问题,51单片机

1. 问题 keil软件输入某些汉字的时候会输出乱码&#xff0c;例如&#xff1a;升、 数 2. 原因 keil软件会忽略0xFD。 升的GB2312编码为 0xc9fd&#xff0c;keil解析为0xc9数的GB2312编码为 0xcafd&#xff0c;keil解析为0xca 关于Keil软件中0xFD问题的说明 3. 解决方案1 …...

自然语言开发AI应用,利用云雀大模型打造自己的专属AI机器人

如今&#xff0c;大模型层出不穷&#xff0c;这为自然语言处理、计算机视觉、语音识别和其他领域的人工智能任务带来了重大的突破和进展。大模型通常指那些参数量庞大、层数深、拥有巨大的计算能力和数据训练集的模型。 但不能不承认的是&#xff0c;普通人使用大模型还是有一…...

Android中 Gradle与 AGP 版本对应关系表

Android Gradle Plugin Version版本Gradle Version版本1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1 - 2.91.5.02.2.1 - 2.132.0.0 - 2.1.22.10 - 2.132.1.3 - 2.2.32.14.12.3.03.33.0.04.13.1.04.43.2.0 - 3.2.14.63.3.0 - 3.3.34.10.13.4.0 - 3.4.35.1.13.5.0 - 3.5.45.4.13.…...

Linux基础知识合集

整理了一下学习的一些关于Linux的一些基础知识&#xff0c;同学们也可以通过公众号菜单栏查看&#xff01; 一、基础知识 Linux基础知识 Linux命令行基础学习 Linux用户与组概念初识 Linux文件与目录权限基础 Linux中文件内容的查看 Linux系统之计划任务管理 二、服务器管理 Vm…...

跟着pink老师前端入门教程-day13

品优购案例 一、品优购项目规划 1. 品优购项目整体介绍 项目名称&#xff1a;品优购 项目描述&#xff1a;品优购是一个电商网站&#xff0c;我们要完成 PC 端首页、列表页、注册页面的制作 2. 品优购项目学习目的 1. 电商类网站比较综合&#xff0c;里面需要大量的布…...

go语言基础之泛型

1.泛型 泛型是一种独立于所使用的特定类型的编写代码的方法。使用泛型可以编写出适用于一组类型中的任何一种的函数和类型。 1.1 为什么需要泛型 func reverse(s []int) []int {l : len(s)r : make([]int, l)for i, e : range s {r[l-i-1] e}return r }fmt.Println(reverse…...

Vue.js 中子组件向父组件传值的方法

Vue.js 是一款流行的 JavaScript 前端框架&#xff0c;它提供了一套完整的工具和 API&#xff0c;使得开发者可以更加高效地构建交互式的 Web 应用程序。其中&#xff0c;组件化是 Vue.js 的一个核心概念&#xff0c;通过组件化可以将一个复杂的应用程序拆分成多个独立的部分&a…...

数据可视化 pycharts实现地理数据可视化(全球地图)

自用版 紧急整理一点可能要用的可视化代码&#xff0c;略粗糙 以后有机会再改 requirements&#xff1a; python3.6及以上pycharts1.9 数据格式为&#xff1a; 运行结果为&#xff1a; import pandas as pd from pyecharts.charts import Map, Timeline from pyecharts im…...

Mac下查看、配置和使用环境变量

Mac下查看、配置和使用环境变量 一&#xff1a;Mac怎么查看环境变量命令 printenv一&#xff1a;这个命令会一次性列出所有环境变量的键值对&#xff0c;输出格式为&#xff1a; VAR1value1 VAR2value2 ...二&#xff1a; 也可以通过给这个命令加上环境变量名参数&#xff0…...

虚拟机克隆的三种方式:全量克隆、快速全量克隆、链接克隆

虚拟机克隆的三种方式:全量克隆、快速全量克隆、链接克隆 快速全量克隆 特点&#xff1a;虚拟机启动快、拍平后数据独立 场景&#xff1a;快速发放独立的虚拟机&#xff0c;减少等待虚拟机部署完成时间&#xff0c;能够快速提供用户使用虚拟机。 实现方式&#xff1a;通过对…...

如何隐藏Selenium特征实现自动化网页采集

Selenium是一个流行的自动化网页测试工具&#xff0c;可以通过模拟用户在Chrome浏览器中的操作来完成网站的测试。然而&#xff0c;有些网站会检测浏览器是否由Selenium驱动&#xff0c;如果是&#xff0c;就会返回错误的结果或拒绝访问。为了避免这种情况&#xff0c;我们需要…...

springboot149智慧图书管理系统设计与实现

智慧图书管理系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现…...

3D词云图

工具库 tagcanvas.min.js vue3&#xff08;框架其实无所谓&#xff0c;都可以&#xff09; 实现 <script setup> import { onMounted, ref } from vue; import ./tagcanvas.min.js;const updateFlag ref(false);// 词云图初始化 const initWordCloud () > {let …...