1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-08-01 16:28:03 +08:00

[docs update]Redis Stream 消息队列内容完善+部分笔误完善

This commit is contained in:
Guide 2023-11-29 23:27:15 +08:00
parent a46f5a9383
commit 5b7c40bdd6
7 changed files with 598 additions and 428 deletions

1
.gitignore vendored
View File

@ -17,3 +17,4 @@ format-markdown.py
package-lock.json package-lock.json
lintmd-config.json lintmd-config.json
pnpm-lock.yaml pnpm-lock.yaml
pnpm-lock.yaml

View File

@ -171,12 +171,47 @@ pub/sub 既能单播又能广播,还支持 channel 的简单正则匹配。不
为此Redis 5.0 新增加的一个数据结构 `Stream` 来做消息队列。`Stream` 支持: 为此Redis 5.0 新增加的一个数据结构 `Stream` 来做消息队列。`Stream` 支持:
- 发布 / 订阅模式 - 发布 / 订阅模式
- 按照消费者组进行消费 - 按照消费者组进行消费(借鉴了 Kafka 消费者组的概念)
- 消息持久化( RDB 和 AOF - 消息持久化( RDB 和 AOF
- ACK 机制(通过确认机制来告知已经成功处理了消息)
- 阻塞式获取消息
`Stream` 使用起来相对要麻烦一些,这里就不演示了。而且,`Stream` 在实际使用中依然会有一些小问题不太好解决比如在 Redis 发生故障恢复后不能保证消息至少被消费一次。 `Stream` 的结构如下:
综上,和专业的消息队列相比,使用 Redis 来实现消息队列还是有很多欠缺的地方比如消息丢失和堆积问题不好解决。因此,我们通常建议不要使用 Redis 来做消息队列,你完全可以选择市面上比较成熟的一些消息队列比如 RocketMQ、Kafka。 ![](https://oss.javaguide.cn/github/javaguide/database/redis/redis-stream-structure.png)
这是一个有序的消息链表,每个消息都有一个唯一的 ID 和对应的内容。ID 是一个时间戳和序列号的组合,用来保证消息的唯一性和递增性。内容是一个或多个键值对(类似 Hash 基本数据类型),用来存储消息的数据。
这里再对图中涉及到的一些概念,进行简单解释:
- `Consumer Group`:消费者组用于组织和管理多个消费者。消费者组本身不处理消息,而是再将消息分发给消费者,由消费者进行真正的消费
- `last_delivered_id`:标识消费者组当前消费位置的游标,消费者组中任意一个消费者读取了消息都会使 last_delivered_id 往前移动。
- `pending_ids`:记录已经被客户端消费但没有 ack 的消息的 ID。
下面是`Stream` 用作消息队列时常用的命令:
- `XADD`:向流中添加新的消息。
- `XREAD`:从流中读取消息。
- `XREADGROUP`:从消费组中读取消息。
- `XRANGE`:根据消息 ID 范围读取流中的消息。
- `XREVRANGE`:与 `XRANGE` 类似,但以相反顺序返回结果。
- `XDEL`:从流中删除消息。
- `XTRIM`:修剪流的长度,可以指定修建策略(`MAXLEN`/`MINID`)。
- `XLEN`:获取流的长度。
- `XGROUP CREATE`:创建消费者组。
- `XGROUP DESTROY` 删除消费者组
- `XGROUP DELCONSUMER`:从消费者组中删除一个消费者。
- `XGROUP SETID`:为消费者组设置新的最后递送消息 ID
- `XACK`:确认消费组中的消息已被处理。
- `XPENDING`:查询消费组中挂起(未确认)的消息。
- `XCLAIM`:将挂起的消息从一个消费者转移到另一个消费者。
- `XINFO`:获取流(`XINFO STREAM`)、消费组(`XINFO GROUPS`)或消费者(`XINFO CONSUMERS`)的详细信息。
`Stream` 使用起来相对要麻烦一些,这里就不演示了。
总的来说,`Stream` 已经可以满足一个消息队列的基本要求了。不过,`Stream` 在实际使用中依然会有一些小问题不太好解决比如在 Redis 发生故障恢复后不能保证消息至少被消费一次。
综上,和专业的消息队列相比,使用 Redis 来实现消息队列还是有很多欠缺的地方比如消息丢失和堆积问题不好解决。因此,我们通常建议不要使用 Redis 来做消息队列,你完全可以选择市面上比较成熟的一些消息队列比如 RocketMQ、Kafka。不过如果你就是想要用 Redis 来做消息队列的话,那我建议你优先考虑 `Stream`,这是目前相对最优的 Redis 消息队列实现。
相关阅读:[Redis 消息队列发展历程 - 阿里开发者 - 2022](https://mp.weixin.qq.com/s/gCUT5TcCQRAxYkTJfTRjJw)。 相关阅读:[Redis 消息队列发展历程 - 阿里开发者 - 2022](https://mp.weixin.qq.com/s/gCUT5TcCQRAxYkTJfTRjJw)。

View File

@ -374,9 +374,9 @@ IdGenerator 生成的唯一 ID 组成如下:
![IdGenerator 生成的 ID 组成](https://oss.javaguide.cn/github/javaguide/system-design/distributed-system/idgenerator-distributed-id-schematic-diagram.png) ![IdGenerator 生成的 ID 组成](https://oss.javaguide.cn/github/javaguide/system-design/distributed-system/idgenerator-distributed-id-schematic-diagram.png)
- **timestamp (位数不固定)**时间差,是生成 ID 时的系统时间减去 BaseTime(基础时间,也称基点时间、原点时间、纪元时间,默认值为 2020 年) 的总时间差(毫秒单位)。初始为 5bits随着运行时间而增加。如果觉得默认值太老你可以重新设置不过要注意这个值以后最好不变。 - **timestamp (位数不固定)**时间差,是生成 ID 时的系统时间减去 BaseTime(基础时间,也称基点时间、原点时间、纪元时间,默认值为 2020 年) 的总时间差(毫秒单位)。初始为 5bits随着运行时间而增加。如果觉得默认值太老你可以重新设置不过要注意这个值以后最好不变。
- **worker id (默认 6 bits)** 机器 id机器码最重要参数是区分不同机器或不同应用的唯一 ID最大值由 `WorkerIdBitLength`(默认 6限定。如果一台服务器部署多个独立服务需要为每个服务指定不同的 WorkerId。 - **worker id (默认 6 bits)** 机器 id机器码最重要参数是区分不同机器或不同应用的唯一 ID最大值由 `WorkerIdBitLength`(默认 6限定。如果一台服务器部署多个独立服务需要为每个服务指定不同的 WorkerId。
- **sequence (默认 6 bits)**序列数,是每毫秒下的序列数,由参数中的 `SeqBitLength`(默认 6限定。增加 `SeqBitLength` 会让性能更高,但生成的 ID 也会更长。 - **sequence (默认 6 bits)**序列数,是每毫秒下的序列数,由参数中的 `SeqBitLength`(默认 6限定。增加 `SeqBitLength` 会让性能更高,但生成的 ID 也会更长。
Java 语言使用示例:<https://github.com/yitter/idgenerator/tree/master/Java> Java 语言使用示例:<https://github.com/yitter/idgenerator/tree/master/Java>

View File

@ -15,12 +15,7 @@ title: JavaGuideJava学习&面试指南)
<div align="center"> <div align="center">
[![logo](https://oss.javaguide.cn/github/javaguide/csdn/1c00413c65d1995993bf2b0daf7b4f03.png)](https://github.com/Snailclimb/JavaGuide) ![logo](https://oss.javaguide.cn/github/javaguide/csdn/1c00413c65d1995993bf2b0daf7b4f03.png)
[![阅读](https://img.shields.io/badge/阅读-read-brightgreen.svg)](https://javaguide.cn/)
![Stars](https://img.shields.io/github/stars/Snailclimb/JavaGuide)
![forks](https://img.shields.io/github/forks/Snailclimb/JavaGuide)
![issues](https://img.shields.io/github/issues/Snailclimb/JavaGuide)
[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide) [GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)

View File

@ -72,7 +72,7 @@ String message = STR."Greetings \{name}!";
- STR 是模板处理器。 - STR 是模板处理器。
- `\{name}`为表达式,运行时,这些表达式将被相应的变量值替换。 - `\{name}`为表达式,运行时,这些表达式将被相应的变量值替换。
Java 目前支持三种模板处理器: Java 目前支持三种模板处理器:
- STR自动执行字符串插值即将模板中的每个嵌入式表达式替换为其值转换为字符串 - STR自动执行字符串插值即将模板中的每个嵌入式表达式替换为其值转换为字符串
- FMT和 STR 类似,但是它还可以接受格式说明符,这些格式说明符出现在嵌入式表达式的左边,用来控制输出的样式 - FMT和 STR 类似,但是它还可以接受格式说明符,这些格式说明符出现在嵌入式表达式的左边,用来控制输出的样式

View File

@ -18,7 +18,7 @@ category: 开源项目
另外,我的公众号还会定期分享优质开源项目,每月一期,每一期我都会精选 5 个高质量的 Java 开源项目。 另外,我的公众号还会定期分享优质开源项目,每月一期,每一期我都会精选 5 个高质量的 Java 开源项目。
目前已经更新到了第 22 期: 目前已经更新到了第 24 期:
1. [一款基于 Spring Boot + Vue 的一站式开源持续测试平台](http://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247515383&idx=1&sn=ba7244020c05d966b483d8c302d54e85&chksm=cea1f33cf9d67a2a111bcf6cadc3cc1c44828ba2302cd3e13bbd88349e43d4254808e6434133&scene=21#wechat_redirect)。 1. [一款基于 Spring Boot + Vue 的一站式开源持续测试平台](http://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247515383&idx=1&sn=ba7244020c05d966b483d8c302d54e85&chksm=cea1f33cf9d67a2a111bcf6cadc3cc1c44828ba2302cd3e13bbd88349e43d4254808e6434133&scene=21#wechat_redirect)。
2. [用 Java 写个沙盒塔防游戏!已上架 Steam,Apple Store](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247515981&idx=1&sn=e4b9c06af65f739bdcdf76bdc35d59f6&chksm=cea1f086f9d679908bd6604b1c42d67580160d9789951f3707ad2f5de4d97aa72121d8fe777e&token=435278690&lang=zh_CN&scene=21#wechat_redirect) 2. [用 Java 写个沙盒塔防游戏!已上架 Steam,Apple Store](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247515981&idx=1&sn=e4b9c06af65f739bdcdf76bdc35d59f6&chksm=cea1f086f9d679908bd6604b1c42d67580160d9789951f3707ad2f5de4d97aa72121d8fe777e&token=435278690&lang=zh_CN&scene=21#wechat_redirect)
@ -42,6 +42,7 @@ category: 开源项目
20. [这是我见过最强大的技术社区实战项目!!](https://mp.weixin.qq.com/s/tdBQ0Td_Gsev4AaIlq5ltg) 20. [这是我见过最强大的技术社区实战项目!!](https://mp.weixin.qq.com/s/tdBQ0Td_Gsev4AaIlq5ltg)
21. [颜值吊打 Postman这款开源 API 调试工具我超爱!!](https://mp.weixin.qq.com/s/_KXBGckyS--P97G48zXCrw) 21. [颜值吊打 Postman这款开源 API 调试工具我超爱!!](https://mp.weixin.qq.com/s/_KXBGckyS--P97G48zXCrw)
22. [轻量级 Spring够优雅](https://mp.weixin.qq.com/s/tl2539hsYsvEm8wjmQwDEg) 22. [轻量级 Spring够优雅](https://mp.weixin.qq.com/s/tl2539hsYsvEm8wjmQwDEg)
23. [这是我见过最强的 Java 版内网穿透神器!](https://mp.weixin.qq.com/s/4hyQsTICIUf9EvAVrC6wEg)
推荐你在我的公众号“**JavaGuide**”回复“**开源**”在线阅读[「优质开源项目推荐」](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg2OTA0Njk0OA==&action=getalbum&album_id=1345382825083895808&scene=173&from_msgid=2247516459&from_itemidx=1&count=3&nolastread=1#wechat_redirect)系列。 推荐你在我的公众号“**JavaGuide**”回复“**开源**”在线阅读[「优质开源项目推荐」](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg2OTA0Njk0OA==&action=getalbum&album_id=1345382825083895808&scene=173&from_msgid=2247516459&from_itemidx=1&count=3&nolastread=1#wechat_redirect)系列。

968
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff