js素材网站,wordpress linux 建站,广州网站建设有限公司,扁平化网站 psd文章目录 前言String字符串作为计数器限制 List限制列表阻塞列表自动创建和删除聚合类型键限制 Set限制 Hash限制 Sorted Set范围操作字典操作更新分数 JSON路径限制 BitMapBitfieldProbabilisticHyperLogLogBloom filterCuckoo filtert-digestTop-KCount-min sketchConfigurat… 文章目录 前言String字符串作为计数器限制 List限制列表阻塞列表自动创建和删除聚合类型键限制 Set限制 Hash限制 Sorted Set范围操作字典操作更新分数 JSON路径限制 BitMapBitfieldProbabilisticHyperLogLogBloom filterCuckoo filtert-digestTop-KCount-min sketchConfiguration Parameters Time series 前言
由于Redis官方文档的编写水平实在是难以恭维因此本文翻译难度极大。阅读本文前须知
有一些类型会有标题占位但不会有内容因为实在是不常用如果有一天用到了或者可以给我留言我会补充上。不会特意提供操作数据类型的API翻译如有需要请查阅官网。
String
Redis的字符串存储字节序列包括文本、序列化对象和二进制数组。因此字符串是您可以与Redis键关联的最简单类型的值。它们通常用于缓存但它们还支持额外的功能使您能够实现计数器并执行位操作。
由于Redis键是字符串当我们将字符串类型用作值时实际上是将一个字符串映射到另一个字符串。 SET bike:1 Deimos
OKGET bike:1
DeimosSET命令具有一些有趣的选项这些选项作为附加参数提供。例如我可以要求SET在键已经存在时失败或者相反只有在键已经存在时才成功 set bike:1 bike nx
(nil)set bike:1 bike xx
OK在单个命令中设置或检索多个键的值的能力对于降低延迟也很有用。因此有MSET和MGET命令 mset bike:1 Deimos bike:2 Ares bike:3 Vanth
OKmget bike:1 bike:2 bike:3
1) Deimos
2) Ares
3) Vanth当使用MGET时Redis返回一个值数组。
字符串作为计数器
即使字符串是Redis的基本值您仍然可以执行一些有趣的操作。例如其中之一是原子递增 set total_crashes 0
OKincr total_crashes
(integer) 1incrby total_crashes 10
(integer) 11INCR命令将字符串值解析为整数将其递增1最后将得到的值设置为新值。还有其他类似的命令如INCRBY、DECR和DECRBY。
什么是原子递增的含义呢即使多个客户端针对相同的键发出INCR命令它们也永远不会陷入竞态条件。
限制
默认情况下单个Redis字符串的最大容量为512MB。
List
Redis lists是字符串值的链表经常用于
实现栈和队列。为后台工作系统构建队列管理。
LPUSH 命令在 Redis 中将新元素添加到列表的左侧头部而 RPUSH 命令将新元素添加到列表的右侧尾部。最后LRANGE 命令从列表中提取元素的范围 RPUSH bikes:repairs bike:1
(integer) 1RPUSH bikes:repairs bike:2
(integer) 2LPUSH bikes:repairs bike:important_bike
(integer) 3LRANGE bikes:repairs 0 -1
1) bike:important_bike
2) bike:1
3) bike:2在Redis列表上定义的一个重要操作是弹出元素。弹出元素是从列表中检索元素并同时将其从列表中删除的操作。您可以从左侧和右侧弹出元素类似于您可以在列表的两侧推送元素。我们将添加三个元素并弹出三个元素因此在这系列命令结束时列表将为空不再有元素可以弹出 RPUSH bikes:repairs bike:1 bike:2 bike:3
(integer) 3RPOP bikes:repairs
bike:3LPOP bikes:repairs
bike:1RPOP bikes:repairs
bike:2RPOP bikes:repairs
(nil)Redis返回一个NULL值表示列表中没有元素。
限制列表
在许多用例中我们只希望使用列表存储最新的项目无论这些项目是什么社交网络更新、日志或其他任何内容。
Redis 允许我们将列表用作有上限的集合仅记住最新的 N 个项目并使用 LTRIM 命令丢弃所有最旧的项目。
LTRIM 命令类似于 LRANGE但它不是显示指定范围的元素而是将此范围设置为新的列表值。给定范围之外的所有元素都将被移除。
例如如果您将自行车添加到维修列表的末尾但只关心列表中最久的前 3 辆自行车 RPUSH bikes:repairs bike:1 bike:2 bike:3 bike:4 bike:5
(integer) 5LTRIM bikes:repairs 0 2
OKLRANGE bikes:repairs 0 -1
1) bike:1
2) bike:2
3) bike:3阻塞列表
列表具有一项特殊功能使它们适用于实现队列并且通常作为进程间通信系统的构建块阻塞操作。
假设您希望使用一个进程将项目推送到列表中并使用另一个进程实际处理这些项目。这是通常的生产者/消费者设置可以以以下简单的方式实现
要将项目推送到列表中生产者调用 LPUSH。要从列表中提取/处理项目消费者调用 RPOP。
然而有时可能列表是空的没有可处理的内容因此 RPOP 只会返回 NULL。在这种情况下消费者被迫等待一段时间然后使用 RPOP 再次重试。这被称为轮询但在这个上下文中不是一个好主意因为它有一些缺点
强制 Redis 和客户端处理无用的命令当列表为空时所有请求都不会执行实际的工作它们只会返回 NULL。在处理项目时添加了延迟因为在工作进程收到 NULL 后它会等待一段时间。为了使延迟更小我们可以在调用 RPOP 之间等待时间较短这会放大问题 1即对 Redis 的更多无用调用。
因此Redis 实现了名为 BRPOP 和 BLPOP 的命令它们是 RPOP 和 LPOP 的版本如果列表为空它们将阻塞它们只在向列表添加新元素时或达到用户指定的超时时才向调用者返回。
请注意您可以使用 0 作为超时永远等待元素并且还可以指定多个列表而不仅仅是一个以便同时等待多个列表并在第一个列表接收到元素时得到通知。
关于 BRPOP 的一些要点
客户端按顺序提供服务等待列表的第一个客户端在其他客户端推送元素时首先得到服务依此类推。返回值与 RPOP 不同它是一个包含两个元素的数组因为 BRPOP 和 BLPOP 还包括键的名称因为它们能够等待来自多个列表的元素。如果达到超时则返回 NULL。
自动创建和删除聚合类型键
Redis会在列表为空时自动删除键或者在尝试向空列表中添加元素时创建空列表。这适用于所有由多个元素组成的Redis数据类型。
这不仅适用于列表还适用于由多个元素组成的所有 Redis 数据类型包括 Streams、Sets、Sorted Sets 和 Hashes。
基本上我们可以用三条规则总结这种行为
当向聚合数据类型添加元素时如果目标键不存在则在添加元素之前创建一个空的聚合数据类型。当从聚合数据类型中移除元素时如果值保持为空则键将自动销毁。Stream 数据类型是这一规则的唯一例外。调用只读命令例如返回列表长度的 LLEN 命令或删除元素的写命令对于一个空键总是产生与键持有的聚合类型为空相同的结果该类型是命令期望找到的类型。
限制
Redis列表的最大长度是 2 32 − 1 2^{32} - 1 232−1个元素。
Set
Set是一组无序的唯一字符串。您可以使用Set来高效地
跟踪唯一项例如跟踪访问特定博文的所有唯一 IP 地址。表示关系例如具有特定角色的所有用户的集合。执行常见的集合操作如交集、并集和差集。
SADD 命令向集合添加新元素。还可以对集合执行许多其他操作例如测试给定元素是否已存在执行多个集合之间的交集、并集或差集等。 SADD bikes:racing:france bike:1 bike:2 bike:3
(integer) 3SMEMBERS bikes:racing:france
1) bike:3
2) bike:1
3) bike:2Redis 提供了用于测试集合成员身份的命令。这些命令可以用于单个项目以及多个项目 SISMEMBER bikes:racing:france bike:1
(integer) 1SMISMEMBER bikes:racing:france bike:2 bike:3 bike:4
1) (integer) 1
2) (integer) 1
3) (integer) 0我们还可以找到两个集合之间的差异。例如我们可能想知道哪些自行车在法国比赛但不在美国比赛 SADD bikes:racing:usa bike:1 bike:4
(integer) 2SDIFF bikes:racing:france bikes:racing:usa
1) bike:3
2) bike:2还有其他一些不太平凡的操作仍然可以使用正确的 Redis 命令轻松实现。例如我们可能想要列出在法国、美国和其他一些比赛中参赛的所有自行车。我们可以使用 SINTER 命令来执行不同集合之间的交集。除了交集之外您还可以执行并集、差集等操作。例如如果我们添加了第三场比赛我们可以看到其中一些命令的实际效果 SADD bikes:racing:france bike:1 bike:2 bike:3
(integer) 3SADD bikes:racing:usa bike:1 bike:4
(integer) 2SADD bikes:racing:italy bike:1 bike:2 bike:3 bike:4
(integer) 4SINTER bikes:racing:france bikes:racing:usa bikes:racing:italy
1) bike:1SUNION bikes:racing:france bikes:racing:usa bikes:racing:italy
1) bike:2
2) bike:1
3) bike:4
4) bike:3SDIFF bikes:racing:france bikes:racing:usa bikes:racing:italy
(empty array)SDIFF bikes:racing:france bikes:racing:usa
1) bike:3
2) bike:2SDIFF bikes:racing:usa bikes:racing:france
1) bike:4请注意当所有集合之间的差异为空时SDIFF 命令返回一个空数组。还要注意传递给 SDIFF 的集合顺序很重要因为差异不是可交换的。
当您想要从集合中删除项目时您可以使用 SREM 命令从集合中移除一个或多个项目或者您可以使用 SPOP 命令从集合中随机移除一个项目。您还可以使用 SRANDMEMBER 命令从集合中返回一个随机项目而不将其删除 SADD bikes:racing:france bike:1 bike:2 bike:3 bike:4 bike:5
(integer) 5SREM bikes:racing:france bike:1
(integer) 1SPOP bikes:racing:france
bike:3SMEMBERS bikes:racing:france
1) bike:2
2) bike:4
3) bike:5SRANDMEMBER bikes:racing:france
bike:2限制
Redis集合的最大大小是 2 32 − 1 个 2^{32} - 1个 232−1个成员。
Hash
Redis 哈希是一种记录类型结构化为键值对的集合。您可以使用哈希来表示基本对象以及存储计数器等内容的分组。 HSET bike:1 model Deimos brand Ergonom type Enduro bikes price 4972
(integer) 4HGET bike:1 model
DeimosHGET bike:1 price
4972HGETALL bike:1
1) model
2) Deimos
3) brand
4) Ergonom
5) type
6) Enduro bikes
7) price
8) 4972HSET 命令设置哈希的多个字段而 HGET 检索单个字段。HMGET 类似于 HGET但返回一个值数组 HMGET bike:1 model price no-such-field
1) Deimos
2) 4972
3) (nil)有些命令也能在单个字段上执行操作比如 HINCRBY HINCRBY bike:1 price 100
(integer) 5072HINCRBY bike:1 price -100
(integer) 4972限制
每个哈希可以存储多达 2 32 − 1 2^{32} - 1 232−1个键值对。实际上您的哈希受到托管 Redis 部署的 VM 上总内存的限制。
Sorted Set
Redis 有序集合是由关联分数排序的一组唯一字符串的集合。当多个字符串具有相同的分数时字符串按词典顺序排序。一些有序集合的用例包括
排行榜您可以使用有序集合轻松地维护大型在线游戏中最高分的有序列表。限流器您可以使用有序集合构建滑动窗口限流器防止过多的 API 请求。
有序集合通过一个双端口数据结构实现包含跳表和哈希表因此当我们要求排序元素时Redis 实际上根本不需要做任何工作它已经排序好了。
让我们从一个简单的例子开始将所有参赛者及他们在第一场比赛中获得的分数添加到有序集合中 ZADD racer_scores 10 Norem
(integer) 1ZADD racer_scores 12 Castilla
(integer) 1ZADD racer_scores 8 Sam-Bodden 10 Royce 6 Ford 14 Prickett
(integer) 4正如您所见ZADD 与 SADD 类似但多了一个额外的参数即分数。ZADD 也是可变参数的因此您可以自由指定多个分数-值对。
范围操作
让我们获取所有得分为 10 分或更少的赛车手。我们使用 ZRANGEBYSCORE 命令来完成 ZRANGEBYSCORE racer_scores -inf 10
1) Ford
2) Sam-Bodden
3) Norem
4) Royce要删除一个元素我们只需调用 ZREM 命令并提供赛车手的姓名。还可以删除一系列元素。让我们删除 Castilla 赛车手以及所有分数严格少于 10 分的赛车手 ZREM racer_scores Castilla
(integer) 1ZREMRANGEBYSCORE racer_scores -inf 9
(integer) 2ZRANGE racer_scores 0 -1
1) Norem
2) Royce
3) Prickett对于有序集合元素另一个非常有用的操作是获取排名。还可以使用 ZREVRANK 命令以便按降序排列的方式获取排名 ZRANK racer_scores Norem
(integer) 0ZREVRANK racer_scores Norem
(integer) 3字典操作
假设有序集合中的元素都以相同的分数插入Redis允许按字典顺序获取范围。操作词典范围的主要命令包括 ZRANGEBYLEX、ZREVRANGEBYLEX、ZREMRANGEBYLEX 和 ZLEXCOUNT。
这个特性很重要因为它允许我们将有序集合用作通用索引。例如如果要按照 128 位无符号整数参数对元素进行索引您只需将元素添加到具有相同分数的有序集合中但带有一个由 128 位数字组成的大端字节序的 16 字节前缀。由于大端序的数字在字典顺序排序时实际上也是按数值排序的所以您可以在 128 位空间中请求范围并且获取元素的值时舍弃前缀。
更新分数
可以对已包含在有序集合中的元素调用 ZADD来更新它们的分数。
由于这个特性常见的用例是排行榜。典型的应用是 Facebook 游戏其中您可以将按高分对用户进行排序的能力与获取排名操作结合使用以显示前 N 个用户和用户在排行榜中的排名。
JSON
Redis Stack的JSON功能为Redis提供了对JavaScript对象表示法JSON的支持。它使您能够在Redis数据库中存储、更新和检索JSON值就像处理其他Redis数据类型一样。Redis JSON还可以与搜索和查询无缝集成使您能够有效地对JSON文档进行索引和查询。
第一个要尝试的JSON命令是JSON.SET它使用JSON值设置Redis键。JSON.SET接受所有JSON值类型。以下是一个创建JSON字符串的示例 JSON.SET animal $ dog
OKJSON.GET animal $
[\dog\]JSON.TYPE animal $
1) string请注意命令中包含的美元符号字符$是JSON文档中值的路径在这种情况下它只是表示根。
JSON.DEL命令使用路径参数删除指定的任何JSON值 JSON.SET example $ [ true, { answer: 42 }, null ]
OKJSON.GET example $
[[true,{\answer\:42},null]]JSON.GET example $[1].answer
[42]JSON.DEL example $[-1]
(integer) 1JSON.GET example $
[[true,{\answer\:42}]]您可以使用一组专用的JSON命令来操作数组 JSON.SET arr $ []
OKJSON.ARRAPPEND arr $ 0
1) (integer) 1JSON.GET arr $
[[0]]JSON.ARRINSERT arr $ 0 -2 -1
1) (integer) 3JSON.GET arr $
[[-2,-1,0]]JSON.ARRTRIM arr $ 1 1
1) (integer) 1JSON.GET arr $
[[-1]]JSON.ARRPOP arr $
1) -1JSON.ARRPOP arr $
1) (nil)JSON对象也有自己的命令 JSON.SET obj $ {name:Leonard Cohen,lastSeen:1478476800,loggedOut: true}
OKJSON.OBJLEN obj $
1) (integer) 3JSON.OBJKEYS obj $
1) 1) name2) lastSeen3) loggedOut路径
路径帮助您在 JSON 文档中访问特定的元素。由于没有标准的 JSON 路径语法Redis JSON 实现了自己的路径语法。JSON 的语法基于常见的最佳实践且类似于 JSONPath。
返回的值是一个 JSON 字符串其中包含顶级数组数组中的元素是 JSON 序列化后的字符串。如果使用了多个路径则返回值是一个 JSON 字符串其中包含顶级对象对象的值是序列化后的 JSON 值数组。
以下 JSONPath 语法表格是根据 Goessner 的路径语法比较进行调整的
语法元素描述$根最外层的JSON元素. or []选择子元素..递归地遍历JSON文档*通配符[]下标操作符访问数组元素[,]联合选择多个元素[startstep]数组切片其中start、end和step是索引?()过滤JSON对象或数组。支持比较运算符 (, !, , , , , ~), 逻辑运算符 (,()表达式在过滤器或表达式中使用的当前元素
有关使用详情请查阅官方文档。
限制
传递给命令的JSON值的深度最多可以为128。如果传递给命令的JSON值包含嵌套级别超过128的对象或数组则命令将返回错误。
BitMap
Bitfield
Probabilistic
HyperLogLog
Bloom filter
Cuckoo filter
t-digest
Top-K
Count-min sketch
Configuration Parameters
Time series