Skip to content

Commit 5b7c40b

Browse files
committed
[docs update]Redis Stream 消息队列内容完善+部分笔误完善
1 parent a46f5a9 commit 5b7c40b

File tree

7 files changed

+598
-428
lines changed

7 files changed

+598
-428
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ format-markdown.py
1717
package-lock.json
1818
lintmd-config.json
1919
pnpm-lock.yaml
20+
pnpm-lock.yaml

docs/database/redis/redis-questions-01.md

+38-3
Original file line numberDiff line numberDiff line change
@@ -171,12 +171,47 @@ pub/sub 既能单播又能广播,还支持 channel 的简单正则匹配。不
171171
为此,Redis 5.0 新增加的一个数据结构 `Stream` 来做消息队列。`Stream` 支持:
172172

173173
- 发布 / 订阅模式
174-
- 按照消费者组进行消费
174+
- 按照消费者组进行消费(借鉴了 Kafka 消费者组的概念)
175175
- 消息持久化( RDB 和 AOF)
176+
- ACK 机制(通过确认机制来告知已经成功处理了消息)
177+
- 阻塞式获取消息
176178

177-
`Stream` 使用起来相对要麻烦一些,这里就不演示了。而且,`Stream` 在实际使用中依然会有一些小问题不太好解决比如在 Redis 发生故障恢复后不能保证消息至少被消费一次。
179+
`Stream` 的结构如下:
178180

179-
综上,和专业的消息队列相比,使用 Redis 来实现消息队列还是有很多欠缺的地方比如消息丢失和堆积问题不好解决。因此,我们通常建议不要使用 Redis 来做消息队列,你完全可以选择市面上比较成熟的一些消息队列比如 RocketMQ、Kafka。
181+
![](https://oss.javaguide.cn/github/javaguide/database/redis/redis-stream-structure.png)
182+
183+
这是一个有序的消息链表,每个消息都有一个唯一的 ID 和对应的内容。ID 是一个时间戳和序列号的组合,用来保证消息的唯一性和递增性。内容是一个或多个键值对(类似 Hash 基本数据类型),用来存储消息的数据。
184+
185+
这里再对图中涉及到的一些概念,进行简单解释:
186+
187+
- `Consumer Group`:消费者组用于组织和管理多个消费者。消费者组本身不处理消息,而是再将消息分发给消费者,由消费者进行真正的消费
188+
- `last_delivered_id`:标识消费者组当前消费位置的游标,消费者组中任意一个消费者读取了消息都会使 last_delivered_id 往前移动。
189+
- `pending_ids`:记录已经被客户端消费但没有 ack 的消息的 ID。
190+
191+
下面是`Stream` 用作消息队列时常用的命令:
192+
193+
- `XADD`:向流中添加新的消息。
194+
- `XREAD`:从流中读取消息。
195+
- `XREADGROUP`:从消费组中读取消息。
196+
- `XRANGE`:根据消息 ID 范围读取流中的消息。
197+
- `XREVRANGE`:与 `XRANGE` 类似,但以相反顺序返回结果。
198+
- `XDEL`:从流中删除消息。
199+
- `XTRIM`:修剪流的长度,可以指定修建策略(`MAXLEN`/`MINID`)。
200+
- `XLEN`:获取流的长度。
201+
- `XGROUP CREATE`:创建消费者组。
202+
- `XGROUP DESTROY` : 删除消费者组
203+
- `XGROUP DELCONSUMER`:从消费者组中删除一个消费者。
204+
- `XGROUP SETID`:为消费者组设置新的最后递送消息 ID
205+
- `XACK`:确认消费组中的消息已被处理。
206+
- `XPENDING`:查询消费组中挂起(未确认)的消息。
207+
- `XCLAIM`:将挂起的消息从一个消费者转移到另一个消费者。
208+
- `XINFO`:获取流(`XINFO STREAM`)、消费组(`XINFO GROUPS`)或消费者(`XINFO CONSUMERS`)的详细信息。
209+
210+
`Stream` 使用起来相对要麻烦一些,这里就不演示了。
211+
212+
总的来说,`Stream` 已经可以满足一个消息队列的基本要求了。不过,`Stream` 在实际使用中依然会有一些小问题不太好解决比如在 Redis 发生故障恢复后不能保证消息至少被消费一次。
213+
214+
综上,和专业的消息队列相比,使用 Redis 来实现消息队列还是有很多欠缺的地方比如消息丢失和堆积问题不好解决。因此,我们通常建议不要使用 Redis 来做消息队列,你完全可以选择市面上比较成熟的一些消息队列比如 RocketMQ、Kafka。不过,如果你就是想要用 Redis 来做消息队列的话,那我建议你优先考虑 `Stream`,这是目前相对最优的 Redis 消息队列实现。
180215

181216
相关阅读:[Redis 消息队列发展历程 - 阿里开发者 - 2022](https://mp.weixin.qq.com/s/gCUT5TcCQRAxYkTJfTRjJw)
182217

docs/distributed-system/distributed-id.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -374,9 +374,9 @@ IdGenerator 生成的唯一 ID 组成如下:
374374

375375
![IdGenerator 生成的 ID 组成](https://oss.javaguide.cn/github/javaguide/system-design/distributed-system/idgenerator-distributed-id-schematic-diagram.png)
376376

377-
- **timestamp (位数不固定)**时间差,是生成 ID 时的系统时间减去 BaseTime(基础时间,也称基点时间、原点时间、纪元时间,默认值为 2020 年) 的总时间差(毫秒单位)。初始为 5bits,随着运行时间而增加。如果觉得默认值太老,你可以重新设置,不过要注意,这个值以后最好不变。
377+
- **timestamp (位数不固定)**时间差,是生成 ID 时的系统时间减去 BaseTime(基础时间,也称基点时间、原点时间、纪元时间,默认值为 2020 年) 的总时间差(毫秒单位)。初始为 5bits,随着运行时间而增加。如果觉得默认值太老,你可以重新设置,不过要注意,这个值以后最好不变。
378378
- **worker id (默认 6 bits)**: 机器 id,机器码,最重要参数,是区分不同机器或不同应用的唯一 ID,最大值由 `WorkerIdBitLength`(默认 6)限定。如果一台服务器部署多个独立服务,需要为每个服务指定不同的 WorkerId。
379-
- **sequence (默认 6 bits)**序列数,是每毫秒下的序列数,由参数中的 `SeqBitLength`(默认 6)限定。增加 `SeqBitLength` 会让性能更高,但生成的 ID 也会更长。
379+
- **sequence (默认 6 bits)**序列数,是每毫秒下的序列数,由参数中的 `SeqBitLength`(默认 6)限定。增加 `SeqBitLength` 会让性能更高,但生成的 ID 也会更长。
380380

381381
Java 语言使用示例:<https://github.com/yitter/idgenerator/tree/master/Java>
382382

docs/home.md

+1-6
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,7 @@ title: JavaGuide(Java学习&面试指南)
1515

1616
<div align="center">
1717

18-
[![logo](https://oss.javaguide.cn/github/javaguide/csdn/1c00413c65d1995993bf2b0daf7b4f03.png)](https://github.com/Snailclimb/JavaGuide)
19-
20-
[![阅读](https://img.shields.io/badge/阅读-read-brightgreen.svg)](https://javaguide.cn/)
21-
![Stars](https://img.shields.io/github/stars/Snailclimb/JavaGuide)
22-
![forks](https://img.shields.io/github/forks/Snailclimb/JavaGuide)
23-
![issues](https://img.shields.io/github/issues/Snailclimb/JavaGuide)
18+
![logo](https://oss.javaguide.cn/github/javaguide/csdn/1c00413c65d1995993bf2b0daf7b4f03.png)
2419

2520
[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)
2621

docs/java/new-features/java21.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ String message = STR."Greetings \{name}!";
7272
- STR 是模板处理器。
7373
- `\{name}`为表达式,运行时,这些表达式将被相应的变量值替换。
7474

75-
Java 目前支持三种模板处理器:
75+
Java 目前支持三种模板处理器:
7676

7777
- STR:自动执行字符串插值,即将模板中的每个嵌入式表达式替换为其值(转换为字符串)。
7878
- FMT:和 STR 类似,但是它还可以接受格式说明符,这些格式说明符出现在嵌入式表达式的左边,用来控制输出的样式

docs/open-source-project/readme.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ category: 开源项目
1818

1919
另外,我的公众号还会定期分享优质开源项目,每月一期,每一期我都会精选 5 个高质量的 Java 开源项目。
2020

21-
目前已经更新到了第 22 期:
21+
目前已经更新到了第 24 期:
2222

2323
1. [一款基于 Spring Boot + Vue 的一站式开源持续测试平台](http://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247515383&idx=1&sn=ba7244020c05d966b483d8c302d54e85&chksm=cea1f33cf9d67a2a111bcf6cadc3cc1c44828ba2302cd3e13bbd88349e43d4254808e6434133&scene=21#wechat_redirect)
2424
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: 开源项目
4242
20. [这是我见过最强大的技术社区实战项目!!](https://mp.weixin.qq.com/s/tdBQ0Td_Gsev4AaIlq5ltg)
4343
21. [颜值吊打 Postman,这款开源 API 调试工具我超爱!!](https://mp.weixin.qq.com/s/_KXBGckyS--P97G48zXCrw)
4444
22. [轻量级 Spring,够优雅!!](https://mp.weixin.qq.com/s/tl2539hsYsvEm8wjmQwDEg)
45+
23. [这是我见过最强的 Java 版内网穿透神器!](https://mp.weixin.qq.com/s/4hyQsTICIUf9EvAVrC6wEg)
4546

4647
推荐你在我的公众号“**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)系列。
4748

0 commit comments

Comments
 (0)