添加图片注释,不超过 140 字(可选)
Redis官网推出了一款新产品Redis Stack,那么什么是Redis Stack呢,今天我们来看一看。
一、什么是Redis Stack?
Redis Stack 是使用 Redis 的最佳起点。我们将我们必须提供的最好的技术捆绑在一起,形成一个易于使用的软件包。Redis Stack 扩展了 Redis OSS 的核心功能,并为调试等提供了完整的开发人员体验。
除了Redis OSS的所有功能之外,Redis Stack还支持:
- Probabilistic data structures
- Queryable JSON documents
- Querying across hashes and JSON documents
- Time series data support (ingestion & querying), including full-text search
可以看到Redis 是我们非常熟悉的内存键值对数据库,它有着丰富的数据结构,能够满足我们平时的绝大部分数据存储要求。然而,有些时候我们还希望可以对搜索,文档,图形,时间序列等进行数据建模,这个时候我们就可以使用 Redis Stack。
- Redis Stack是Redis的扩展,它添加了现代数据模型和处理引擎,以提供完整的开发人员体验。
- Redis Stack 是一组软件套件,它主要由三部分组成。一个是 Redis Stack Server,一个是 RedisInsight,一个是 Redis Stack 客户端 SDK。其中 Redis Stack Server 由 Redis,RedisSearch,RedisJSON,RedisGraph,RedisTimeSeries 和 RedisBloom 组成。
- Redis和Redis Stack 的区别在于Redis 更加通用,而Redis Stack更加专注于构建实时应用程序。需要注意的是,Redis Stack并不是 Redis 的替代品,它们将会一同发展。当您准备好运行 Redis Stack时,您可以使用 Redis 复制机制或通过加载您的 RDB 或 AOF 文件来轻松迁移数据。
二、为什么选择 Redis 堆栈?
Redis Stack 的创建是为了让开发人员能够使用后端数据平台构建实时应用程序,该平台可以在几毫秒或更短的时间内可靠地处理请求。Redis Stack 以原始 Redis OSS 为核心,并通过现代数据模型、数据处理工具对其进行增强,并不断对抗复杂性来做到这一点。最终,Redis Stack 的目标是构建一个实时数据平台,继续履行 Redis OSS 的理念:简单、性能和可靠性。
Redis Stack 通过提供领先的 Redis 功能提供的所有尖端功能,统一并简化了 Redis 的开发人员体验。Redis Stack绑定了五个Redis模块:RedisJSON、RedisSearch、RedisGraph、RedisTimeSeries和RedisBloom。
总体愿景是为开发人员提供适用于所有实时数据用例的强大平台。随着我们继续推进 Redis 缓存以外的功能,Redis Stack 是我们的起点。Redis Stack 提供了开发人员喜爱的 Redis 核心功能,并进一步帮助您构建性能至关重要的现代应用程序。
三、Redis Stack安装与使用
3.1、安装
直接安装
sudo apt install lsb-release curl gpg curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list sudo apt-get update sudo apt-get install redis-stack-server
Docker安装
- redis/redis-stack-server
要使用redis-stack-server镜像启动Redis Stack服务器,请在终端中运行以下命令:
docker run -d --name redis-stack-server -p 6379:6379 redis/redis-stack-server:latest
- Redis/Redis-stack
要使用redis-stack镜像启动Redis Stack容器,请在终端中运行以下命令:
docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest
上面的docker run命令也会在端口8001上暴露RedisInsight。您可以通过将浏览器指向localhost:8001来使用RedisInsight。
3.2、使用
远程连接的方式与Redis是一样的,端口还是6379。当然如果你安装了redis-stack中自带了RedisInsight的话,就可以通过将浏览器指向localhost:8001来使用RedisInsight。
四、Redis Stack数据类型
4.1、JSON
Redis JSON 模块提供了一些用于处理 JSON 数据的命令。以下是一些常见的 Redis JSON 命令、语法和示例:
JSON.SET
JSON.SET 用于设置指定键的 JSON 值。
语法:
JSON.SET key path value [NX | XX]
- key: Redis 键。
- path: JSON 路径,表示 JSON 文档中的位置。
- value: 要设置的 JSON 值。
- NX | XX: 用于指定行为,类似于 SET 命令中的 NX 和 XX 选项。
示例:
JSON.SET user:2 $ '{"name": "John", "age": 30, "city": "New York"}'
请注意命令如何包含美元符号字符$。这是JSON 文档中值的路径(在本例中它仅表示根)。
JSON.GET
JSON.GET 用于获取指定键的 JSON 值。
语法:
JSON.GET key [path]
- key: Redis 键。
- path: JSON 路径,可选,表示 JSON 文档中的位置。
示例:
> JSON.GET user:2 $.name "[\"John\"]"
JSON.DEL
JSON.DEL 用于删除指定键的 JSON 值。
语法:
JSON.DEL key [path]
- key: Redis 键。
- path: JSON 路径,可选,表示 JSON 文档中的位置。
示例:
#删除前 > JSON.GET user:2 "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}" #执行删除命令 > JSON.DEL user:2 $.city #删除后 > JSON.GET user:2 $ "[{\"name\":\"John\",\"age\":30}]"
4.2、Bloom filter
RedisBloom 是 Redis 的一个模块,提供了布隆过滤器(Bloom Filter)等数据结构的支持。布隆过滤器是一种用于判断一个元素是否可能属于一个集合的数据结构,它允许有一定的误判率,但能够高效地进行元素的查询。
以下是 RedisBloom 模块中与布隆过滤器相关的命令的介绍:
BF.RESERVE
BF.RESERVE 用于创建一个新的布隆过滤器或更新现有布隆过滤器的参数。
语法:
BF.RESERVE key error_rate initial_size [EXPANSION expansion]
- key: 布隆过滤器的键。
- error_rate: 允许的误判率(false positive rate),即查询结果可能错误的概率。
- initial_size: 初始大小,即布隆过滤器的预期最大元素数量。
- EXPANSION expansion: (可选)扩展参数,用于设置布隆过滤器的动态扩展。
示例:
BF.RESERVE myfilter 0.1 1000
BF.ADD
BF.ADD 用于向布隆过滤器添加一个元素。
语法:
BF.ADD key element [element ...]
- key: 布隆过滤器的键。
- element: 要添加到布隆过滤器的元素。
示例:
BF.ADD myfilter user123
BF.EXISTS
BF.EXISTS 用于检查布隆过滤器中是否存在指定的元素。
语法:
BF.EXISTS key element
- key: 布隆过滤器的键。
- element: 要检查的元素。
示例:
BF.EXISTS myfilter user123
这个命令返回一个布尔值,指示查询的元素是否可能存在于布隆过滤器中。请注意,由于布隆过滤器的特性,存在误判率,即可能存在一定的 false positive。
添加图片注释,不超过 140 字(可选)
4.3、Cuckoo filter
Cuckoo 过滤器与 Bloom 过滤器一样,是 Redis Stack 中的一种概率数据结构,使您能够以非常快速且节省空间的方式检查集合中是否存在某个元素。
- 布隆过滤器通常会表现出更好的性能和可扩展性。
- Cuckoo 过滤器的检查操作速度更快,并且还允许删除。
在 RedisBloom 模块中,没有专门的 BF.DEL 命令用于删除布隆过滤器或 Cuckoo 过滤器。删除操作通常是通过使用 Redis 的通用 DEL 命令来完成的,该命令用于删除存储在 Redis 中的任何键,包括布隆过滤器或 Cuckoo 过滤器的键。
CF.DEL 命令:
语法:
CF.DEL key element [element ...]
- key: 要删除的键的名称。
示例:
CF.DEL myfilter user123
其它命令与布隆过滤器命令类似把BF改成CF就可以。
#RESERVE没有容错率 > CF.RESERVE bikes:models 1000000 OK > CF.ADD bikes:models "Smoky Mountain Striker" (integer) 1 > CF.EXISTS bikes:models "Smoky Mountain Striker" (integer) 1 > CF.EXISTS bikes:models "Terrible Bike Name" (integer) 0 > CF.DEL bikes:models "Smoky Mountain Striker" (integer) 1
4.4、Search
- 使用以下语法创建 JSON 索引:
FT.CREATE {index_name} ON JSON SCHEMA {json_path} AS {attribute} {type}
例如,此命令创建一个索引,该索引对表示库存商品的每个 JSON 文档的名称、描述、价格和图像向量嵌入进行索引:
FT.CREATE itemIdx ON JSON PREFIX 1 item: SCHEMA $.name AS name TEXT $.description as description TEXT $.price AS price NUMERIC $.embedding AS embedding VECTOR FLAT 6 DIM 4 DISTANCE_METRIC L2 TYPE FLOAT32
- 添加 JSON 文档
创建索引后,Redis Stack 会自动为数据库中存储的任何现有、修改或新创建的 JSON 文档编制索引。对于现有文档,索引在后台异步运行,因此可能需要一些时间文档才可用。修改的文档和新创建的文档会同步索引,因此在添加或修改命令完成时文档将可用。
第 1 项 JSON 文档:
{ "name": "Noise-cancelling Bluetooth headphones", "description": "Wireless Bluetooth headphones with noise-cancelling technology", "connection": { "wireless": true, "type": "Bluetooth" }, "price": 99.98, "stock": 25, "colors": [ "black", "silver" ], "embedding": [0.87, -0.15, 0.55, 0.03] }
第 2 项 JSON 文档:
{ "name": "Wireless earbuds", "description": "Wireless Bluetooth in-ear headphones", "connection": { "wireless": true, "type": "Bluetooth" }, "price": 64.99, "stock": 17, "colors": [ "black", "white" ], "embedding": [-0.7, -0.51, 0.88, 0.14] }
用于JSON.SET将这些文档存储在数据库中:
127.0.0.1:6379> JSON.SET item:1 $ '{"name":"Noise-cancelling Bluetooth headphones","description":"Wireless Bluetooth headphones with noise-cancelling technology","connection":{"wireless":true,"type":"Bluetooth"},"price":99.98,"stock":25,"colors":["black","silver"],"embedding":[0.87,-0.15,0.55,0.03]}' "OK" 127.0.0.1:6379> JSON.SET item:2 $ '{"name":"Wireless earbuds","description":"Wireless Bluetooth in-ear headphones","connection":{"wireless":true,"type":"Bluetooth"},"price":64.99,"stock":17,"colors":["black","white"],"embedding":[-0.7,-0.51,0.88,0.14]}' "OK"
由于在这种情况下索引是同步的,因此一旦JSON.SET命令返回,文档将在索引上可用。任何与索引内容匹配的后续查询都将返回该文档。
- 搜索索引
要搜索 JSON 文档的索引,请使用以下FT.SEARCH命令。您可以搜索SCHEMA.
例如,使用以下查询来搜索名称中含有“earbuds”一词的商品:
127.0.0.1:6379> FT.SEARCH itemIdx '@name:(earbuds)' 1) "1" 2) "item:2" 3) 1) "$" 2) "{\"name\":\"Wireless earbuds\",\"description\":\"Wireless Bluetooth in-ear headphones\",\"connection\":{\"wireless\":true,\"connection\":\"Bluetooth\"},\"price\":64.99,\"stock\":17,\"colors\":[\"black\",\"white\"],\"embedding\":[-0.7,-0.51,0.88,0.14]}"