1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

[docs update]添加对 Redis 模块和 RediSearch 的介绍

This commit is contained in:
Guide 2023-12-12 12:58:28 +08:00
parent 9dad19c7c9
commit 974e54ef6d
4 changed files with 59 additions and 17 deletions

View File

@ -75,7 +75,7 @@ HTTP/3.0 之前是基于 TCP 协议的,而 HTTP/3.0 将弃用 TCP改用 **
**运行于 UDP 协议之上的协议** **运行于 UDP 协议之上的协议**
1. **DHCP 协议**:动态主机配置协议,动态配置 IP 地址 1. **DHCP 协议**:动态主机配置协议,动态配置 IP 地址
2. **DNS****域名系统DNSDomain Name System将人类可读的域名 (例如www.baidu.com) 转换为机器可读的 IP 地址 (例如220.181.38.148)。** 我们可以将其理解为专为互联网设计的电话薄。实际上 DNS 同时支持 UDP 和 TCP 协议。 2. **DNS**域名系统DNSDomain Name System将人类可读的域名 (例如www.baidu.com) 转换为机器可读的 IP 地址 (例如220.181.38.148)。 我们可以将其理解为专为互联网设计的电话薄。实际上DNS 同时支持 UDP 和 TCP 协议。
3. …… 3. ……
### TCP 三次握手和四次挥手(非常重要) ### TCP 三次握手和四次挥手(非常重要)

View File

@ -101,6 +101,25 @@ Memcached 是分布式缓存最开始兴起的那会,比较常用的。后来
关于常见的缓存读写策略的详细介绍,可以看我写的这篇文章:[3 种常用的缓存读写策略详解](https://javaguide.cn/database/redis/3-commonly-used-cache-read-and-write-strategies.html) 。 关于常见的缓存读写策略的详细介绍,可以看我写的这篇文章:[3 种常用的缓存读写策略详解](https://javaguide.cn/database/redis/3-commonly-used-cache-read-and-write-strategies.html) 。
### 什么是 Redis Module有什么用
Redis 从 4.0 版本开始,支持通过 Module 来扩展其功能以满足特殊的需求。这些 Module 以动态链接库so 文件)的形式被加载到 Redis 中,这是一种非常灵活的动态扩展功能的实现方式,值得借鉴学习!
我们每个人都可以基于 Redis 去定制化开发自己的 Module比如实现搜索引擎功能、自定义分布式锁和分布式限流。
目前,被 Redis 官方推荐的 Module 有:
- [RediSearch](https://github.com/RediSearch/RediSearch):用于实现搜索引擎的模块。
- [RedisJSON](https://github.com/RedisJSON/RedisJSON):用于处理 JSON 数据的模块。
- [RedisGraph](https://github.com/RedisGraph/RedisGraph):用于实现图形数据库的模块。
- [RedisTimeSeries](https://github.com/RedisTimeSeries/RedisTimeSeries):用于处理时间序列数据的模块。
- [RedisBloom](https://github.com/RedisBloom/RedisBloom):用于实现布隆过滤器的模块。
- [RedisAI](https://github.com/RedisAI/RedisAI):用于执行深度学习/机器学习模型并管理其数据的模块。
- [RedisCell](https://github.com/brandur/redis-cell):用于实现分布式限流的模块。
- ……
关于 Redis 模块的详细介绍,可以查看官方文档:<https://redis.io/modules>
## Redis 应用 ## Redis 应用
### Redis 除了做缓存,还能做什么? ### Redis 除了做缓存,还能做什么?
@ -215,6 +234,28 @@ pub/sub 既能单播又能广播,还支持 channel 的简单正则匹配。不
相关阅读:[Redis 消息队列发展历程 - 阿里开发者 - 2022](https://mp.weixin.qq.com/s/gCUT5TcCQRAxYkTJfTRjJw)。 相关阅读:[Redis 消息队列发展历程 - 阿里开发者 - 2022](https://mp.weixin.qq.com/s/gCUT5TcCQRAxYkTJfTRjJw)。
### Redis 可以做搜索引擎么?
Redis 是可以实现全文搜索引擎功能的,需要借助 **RediSearch** ,这是一个基于 Redis 的搜索引擎模块。
RediSearch 支持中文分词、聚合统计、停用词、同义词、拼写检查、标签查询、向量相似度查询、多关键词搜索、分页搜索等功能,算是一个功能比较完善的全文搜索引擎了。
相比较于 Elasticsearch 来说RediSearch 主要在下面两点上表现更优异一些:
1. 性能更优秀:依赖 Redis 自身的高性能基于内存操作Elasticsearch 基于磁盘)。
2. 内存占用更低RediSearch 内部使用压缩的倒排索引,所以可以用较低的内存占用来实现索引的快速构建。
对于小型项目的简单搜索场景来说,使用 RediSearch 来作为搜索引擎还是没有问题的(搭配 RedisJSON 使用)。
对于比较复杂或者数据规模较大的搜索场景还是不太建议使用 RediSearch 来作为搜索引擎,主要是因为下面这些限制和问题:
1. 数据量限制Elasticsearch 可以支持 PB 级别的数据量可以轻松扩展到多个节点利用分片机制提高可用性和性能。RedisSearch 是基于 Redis 实现的,其能存储的数据量受限于 Redis 的内存容量,不太适合存储大规模的数据(内存昂贵,扩展能力较差)。
2. 分布式能力较差Elasticsearch 是为分布式环境设计的,可以轻松扩展到多个节点。虽然 RedisSearch 支持分布式部署,但在实际应用中可能会面临一些挑战,如数据分片、节点间通信、数据一致性等问题。
3. 聚合功能较弱Elasticsearch 提供了丰富的聚合功能,而 RediSearch 的聚合功能相对较弱,只支持简单的聚合操作。
4. 生态较差Elasticsearch 可以轻松和常见的一些系统/软件集成比如 Hadoop、Spark、Kibana而 RedisSearch 则不具备该优势。
Elasticsearch 适用于全文搜索、复杂查询、实时数据分析和聚合的场景,而 RediSearch 适用于快速数据存储、缓存和简单查询的场景。
## Redis 数据类型 ## Redis 数据类型
关于 Redis 5 种基础数据类型和 3 种特殊数据类型的详细介绍请看下面这两篇文章以及 [Redis 官方文档](https://redis.io/docs/data-types/) 关于 Redis 5 种基础数据类型和 3 种特殊数据类型的详细介绍请看下面这两篇文章以及 [Redis 官方文档](https://redis.io/docs/data-types/)
@ -639,6 +680,7 @@ Redis 提供 6 种数据淘汰策略:
- 《Redis 开发与运维》 - 《Redis 开发与运维》
- 《Redis 设计与实现》 - 《Redis 设计与实现》
- Redis 命令手册https://www.redis.com.cn/commands.html - Redis 命令手册https://www.redis.com.cn/commands.html
- RedisSearch 终极使用指南,你值得拥有!:<https://mp.weixin.qq.com/s/FA4XVAXJksTOHUXMsayy2g>
- WHY Redis choose single thread (vs multi threads): [https://medium.com/@jychen7/sharing-redis-single-thread-vs-multi-threads-5870bd44d153](https://medium.com/@jychen7/sharing-redis-single-thread-vs-multi-threads-5870bd44d153) - WHY Redis choose single thread (vs multi threads): [https://medium.com/@jychen7/sharing-redis-single-thread-vs-multi-threads-5870bd44d153](https://medium.com/@jychen7/sharing-redis-single-thread-vs-multi-threads-5870bd44d153)
<!-- @include: @article-footer.snippet.md --> <!-- @include: @article-footer.snippet.md -->

View File

@ -98,7 +98,7 @@ COMMIT;
如果我们可以批量获取,然后存在在内存里面,需要用到的时候,直接从内存里面拿就舒服了!这也就是我们说的 **基于数据库的号段模式来生成分布式 ID。** 如果我们可以批量获取,然后存在在内存里面,需要用到的时候,直接从内存里面拿就舒服了!这也就是我们说的 **基于数据库的号段模式来生成分布式 ID。**
数据库的号段模式也是目前比较主流的一种分布式 ID 生成方式。像滴滴开源的[Tinyid](https://github.com/didi/tinyid/wiki/tinyid%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D) 就是基于这种方式来做的。不过TinyId 使用了双号段缓存、增加多 db 支持等方式来进一步优化。 数据库的号段模式也是目前比较主流的一种分布式 ID 生成方式。像滴滴开源的[Tinyid](https://github.com/didi/tinyid/wiki/tinyid原理介绍) 就是基于这种方式来做的。不过TinyId 使用了双号段缓存、增加多 db 支持等方式来进一步优化。
以 MySQL 举例,我们通过下面的方式即可。 以 MySQL 举例,我们通过下面的方式即可。
@ -186,7 +186,7 @@ OK
除了高可用和并发之外,我们知道 Redis 基于内存我们需要持久化数据避免重启机器或者机器故障后数据丢失。Redis 支持两种不同的持久化方式:**快照snapshottingRDB**、**只追加文件append-only file, AOF**。 并且Redis 4.0 开始支持 **RDB 和 AOF 的混合持久化**(默认关闭,可以通过配置项 `aof-use-rdb-preamble` 开启)。 除了高可用和并发之外,我们知道 Redis 基于内存我们需要持久化数据避免重启机器或者机器故障后数据丢失。Redis 支持两种不同的持久化方式:**快照snapshottingRDB**、**只追加文件append-only file, AOF**。 并且Redis 4.0 开始支持 **RDB 和 AOF 的混合持久化**(默认关闭,可以通过配置项 `aof-use-rdb-preamble` 开启)。
关于 Redis 持久化,我这里就不过多介绍。不了解这部分内容的小伙伴,可以看看 [JavaGuide 对于 Redis 知识点的总结](https://snailclimb.gitee.io/javaguide/#/docs/database/Redis/redis-all) 关于 Redis 持久化,我这里就不过多介绍。不了解这部分内容的小伙伴,可以看看 [Redis 持久化机制详解](https://javaguide.cn/database/redis/redis-persistence.html)这篇文章
**Redis 方案的优缺点:** **Redis 方案的优缺点:**
@ -228,7 +228,7 @@ UUID.randomUUID()
我们这里重点关注一下这个 Version(版本),不同的版本对应的 UUID 的生成规则是不同的。 我们这里重点关注一下这个 Version(版本),不同的版本对应的 UUID 的生成规则是不同的。
5 种不同的 Version(版本)值分别对应的含义(参考[维基百科对于 UUID 的介绍](https://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E5%94%AF%E4%B8%80%E8%AF%86%E5%88%AB%E7%A0%81) 5 种不同的 Version(版本)值分别对应的含义(参考[维基百科对于 UUID 的介绍](https://zh.wikipedia.org/wiki/通用唯一识别码)
- **版本 1** : UUID 是根据时间和节点 ID通常是 MAC 地址)生成; - **版本 1** : UUID 是根据时间和节点 ID通常是 MAC 地址)生成;
- **版本 2** : UUID 是根据标识符(通常是组或用户 ID、时间和节点 ID 生成; - **版本 2** : UUID 是根据标识符(通常是组或用户 ID、时间和节点 ID 生成;
@ -270,10 +270,10 @@ Snowflake 是 Twitter 开源的分布式 ID 生成算法。Snowflake 由 64 bit
![Snowflake 组成](https://oss.javaguide.cn/github/javaguide/system-design/distributed-system/snowflake-distributed-id-schematic-diagram.png) ![Snowflake 组成](https://oss.javaguide.cn/github/javaguide/system-design/distributed-system/snowflake-distributed-id-schematic-diagram.png)
- **sign(1bit)**符号位(标识正负),始终为 0代表生成的 ID 为正数。 - **sign(1bit)**:符号位(标识正负),始终为 0代表生成的 ID 为正数。
- **timestamp (41 bits)**一共 41 位,用来表示时间戳,单位是毫秒,可以支撑 2 ^41 毫秒(约 69 年) - **timestamp (41 bits)**:一共 41 位,用来表示时间戳,单位是毫秒,可以支撑 2 ^41 毫秒(约 69 年)
- **datacenter id + worker id (10 bits)**一般来说,前 5 位表示机房 ID后 5 位表示机器 ID实际项目中可以根据实际情况调整。这样就可以区分不同集群/机房的节点。 - **datacenter id + worker id (10 bits)**:一般来说,前 5 位表示机房 ID后 5 位表示机器 ID实际项目中可以根据实际情况调整。这样就可以区分不同集群/机房的节点。
- **sequence (12 bits)**一共 12 位,用来表示序列号。 序列号为自增值,代表单台机器每毫秒能够产生的最大 ID 数(2^12 = 4096),也就是说单台机器每毫秒最多可以生成 4096 个 唯一 ID。 - **sequence (12 bits)**:一共 12 位,用来表示序列号。 序列号为自增值,代表单台机器每毫秒能够产生的最大 ID 数(2^12 = 4096),也就是说单台机器每毫秒最多可以生成 4096 个 唯一 ID。
在实际项目中,我们一般也会对 Snowflake 算法进行改造,最常见的就是在 Snowflake 算法生成的 ID 中加入业务类型信息。 在实际项目中,我们一般也会对 Snowflake 算法进行改造,最常见的就是在 Snowflake 算法生成的 ID 中加入业务类型信息。
@ -299,10 +299,10 @@ Snowflake 是 Twitter 开源的分布式 ID 生成算法。Snowflake 由 64 bit
![UidGenerator 生成的 ID 组成](https://oss.javaguide.cn/github/javaguide/system-design/distributed-system/uidgenerator-distributed-id-schematic-diagram.png) ![UidGenerator 生成的 ID 组成](https://oss.javaguide.cn/github/javaguide/system-design/distributed-system/uidgenerator-distributed-id-schematic-diagram.png)
- **sign(1bit)**符号位(标识正负),始终为 0代表生成的 ID 为正数。 - **sign(1bit)**:符号位(标识正负),始终为 0代表生成的 ID 为正数。
- **delta seconds (28 bits)**当前时间,相对于时间基点"2016-05-20"的增量值,单位:秒,最多可支持约 8.7 年 - **delta seconds (28 bits)**:当前时间,相对于时间基点"2016-05-20"的增量值,单位:秒,最多可支持约 8.7 年
- **worker id (22 bits)** 机器 id最多可支持约 420w 次机器启动。内置实现为在启动时由数据库分配,默认分配策略为用后即弃,后续可提供复用策略。 - **worker id (22 bits)**:机器 id最多可支持约 420w 次机器启动。内置实现为在启动时由数据库分配,默认分配策略为用后即弃,后续可提供复用策略。
- **sequence (13 bits)** 每秒下的并发序列13 bits 可支持每秒 8192 个并发。 - **sequence (13 bits)**:每秒下的并发序列13 bits 可支持每秒 8192 个并发。
可以看出,和原始 Snowflake(雪花算法)生成的唯一 ID 的组成不太一样。并且,上面这些参数我们都可以自定义。 可以看出,和原始 Snowflake(雪花算法)生成的唯一 ID 的组成不太一样。并且,上面这些参数我们都可以自定义。
@ -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>