如需转载,请根据 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 许可,附上本文作者及链接。
本文作者: 执笔成念
作者昵称: zbcn
本文链接: https://1363653611.github.io/zbcn.github.io/2019/12/09/redis_01api/
- 启动命令:
redis-server.exe redis.windows.conf - 建立链接
:redis-cli.exe -h 127.0.0.1 -p 6379(这时候另启一个 cmd 窗口,原来的不要关闭,不然就无法访问服务端了。)
redis 支持数据类型
Strings(字符串)
- character:
- Redis 字符串是二进制安全的,也就是说,一个 Redis 字符串可以包含任意类型的数据,例如一张 JPEG 图像,或者一个序列化的 Ruby 对象。
- 一个字符串最大为 512M 字节。
- 使用:
- 使用
INCR命令族 (INCR,DECR,INCRBY),将字符串作为原子计数器。 - 使用
APPEND命令追加字符串。 - 使用
GETRANGE和SETRANGE命令,使字符串作为随机访问向量 (vectors)。 - 编码大量数据到很小的空间,或者使用
GETBIT和SETBIT命令,创建一个基于 Redis 的布隆 (Bloom) 过滤器。
- 使用
- character:
Lists(列表)
- Redis 列表仅仅是按照插入顺序排序的字符串列表。
LPUSH命令用于插入一个元素到列表的头部,RPUSH命令用于插入一个元素到列表的尾部。- 列表的最大长度是 2^23-1 个元素 (4294967295,超过 40 亿个元素)。
- 使用:
1.为社交网络时间轴 (timeline) 建模,使用
LPUSH命令往用户时间轴插入元素,使用LRANGE命令获得最近事项。
2.使用LPUSH和LTRIM命令创建一个不会超出给定数量元素的列表,只存储最近的 N 个元素。
3.列表可以用作消息传递原语,例如,众所周知的用于创建后台任务的 Ruby 库 Resque。
4.你可以用列表做更多的事情,这种数据类型支持很多的命令,包括阻塞命令,如 BLPOP。
Sets(无需集合)
Redis 集合是没有顺序的字符串集合 (collection)。可以在 O(1) 的时间复杂度添加、删除和测试元素存在与否 (不管集合中有多少元素都是常量时间)。
Redis 集合具有你需要的不允许重复成员的性质。
支持很多服务器端的命令,可以在很短的时间内和已经存在的集合一起计算并集,交集和差集。
使用
1.你可以使用 Redis 集合追踪唯一性的事情。你想知道访问某篇博客文章的所有唯一 IP 吗?只要 每次页面访问时使用 SADD 命令就可以了。你可以放心,重复的 IP 是不会被插入进来的。
2.Redis 集合可以表示关系。你可以通过使用集合来表示每个标签,来创建一个标签系统。然后你可以把所有拥有此标签的对象的 ID 通过 SADD 命令,加入到表示这个标签的集合中。你想获得同时拥有三个不同标签的对象的全部 ID 吗?用 SINTER 就可以了。
3.你可以使用 SPOP 或 SRANDMEMBER 命令来从集合中随机抽取元素。
Hashes(哈希/散列)
- Redis 哈希是字符串字段 (field) 与字符串值之间的映射,所以是表示对象的理想数据类型 (例如:一个用户对象有多个字段,像用户名,姓氏,年龄等等):
1@cli2HMSET user:1000 username antirez password P1pp0 age 343HGETALL user:10004HSET user:1000 password 123455HGETALL user:1000- 拥有少量字段 (少量指的是大约 100) 的哈希会以占用很少存储空间的方式存储,所以你可以在一个很小的 Redis 实例里存储数百万的对象。
- 由于哈希主要用来表示对象,对象能存储很多元素,所以你可以用哈希来做很多其他的事情
- 每个哈希可以存储多达 2^23-1 个字段值对 (field-value pair)(多于 40 亿个)。
- Redis 哈希是字符串字段 (field) 与字符串值之间的映射,所以是表示对象的理想数据类型 (例如:一个用户对象有多个字段,像用户名,姓氏,年龄等等):
Sorted sets (有序集合)
Redis 有序集合和 Redis 集合类似,是非重复字符串集合 (collection)。不同的是,每一个有序集合的成员都有一个关联的分数 (score),用于按照分数高低排序。尽管成员是唯一的,但是分数是可以重复的。
对有序集合我们可以通过很快速的方式添加,删除和更新元素 (在和元素数量的对数成正比的时间内)。由于元素是有序的而无需事后排序,你可以通过分数或者排名 (位置) 很快地来获取一个范围内的元素。访问有序集合的中间元素也是很快的,所以你可以使用有序集合作为一个无重复元素,快速访问你想要的一切的聪明列表:有序的元素,快速的存在性测试,快速的访问中间元素!
使用:
- 例如多人在线游戏排行榜,每次提交一个新的分数,你就使用 ZADD 命令更新。
- 你可以很容易地使用
ZRANGE命令获取前几名用户,你也可以用ZRANK命令,通过给定用户名返回其排行。 - 同时使用
ZRANK和ZRANGE命令可以展示与给定用户相似的用户及其分数。以上这些操作都非常的快。
位图 (Bitmaps) 和超重对数 (HyperLogLogs)
Redis 还支持位图和超重对数这两种基于字符串基本类型,但有自己语义的数据类型。
总结
- 二进制安全 (binary-safe) 的字符串。
- 列表:按照插入顺序排序的字符串元素 (element) 的集合 (collection)。通常是链表。
- 集合:唯一的,无序的字符串元素集合。
- 有序集合:和集合类似,但是每个字符串元素关联了一个称为分数 (score) 的浮点数。元素总是按照分数排序,所以可以检索一个范围的元素 (例如,给我前 10,或者后 10 个元素)。
- 哈希:由字段 (field) 及其关联的值组成的映射。字段和值都是字符串类型。这非常类似于 Ruby 或 Python 中的哈希 / 散列。
- 位数组 (位图):使用特殊的命令,把字符串当做位数组来处理:你可以设置或者清除单个位值,统计全部置位为 1 的位个数,寻找第一个复位或者置位的位,等等。
- 超重对数 (HyperLogLog):这是一个用于估算集合的基数 (cardinality,也称势,译者注) 的概率性数据结构。不要害怕,它比看起来要简单,稍后为你揭晓。
关键字
Redis键(Keys)
- Redis 键是二进制安全的,这意味着你可以使用任何二进制序列作为键,从像”foo” 这样的字符串到一个 JPEG 文件的内容。空字符串也是合法的键。
- 键值规则:
- 不要使用太长的键,例如,不要使用一个 1024 字节的键,不仅是因为内存占用,而且在数据集中查找键时需要多次耗时的键比较。即使手头需要匹配一个很大值的存在性,对其进行哈希 (例如使用 SHA1) 是个不错的主意,尤其是从内存和带宽的角度。
- 不要使用太短的键。用”u1000flw” 取代”user:1000:followers” 作为键并没有什么实际意义,后者更具有可读性,相对于键对象本身以及值对象来说,增加的空间微乎其微。然而不可否认,短的键会消耗少的内存,你的任务就是要找到平衡点。
- 坚持一种模式 (schema)。例如,
object-type:id就不错,就像user:1000。点或者横线常用来连接多单词字段,如comment:1234:reply.to,或者comment:1234:reply-to。 - 键的最大大小是 512MB。
Redis 字符串 (Strings)
- Redis 字符串是可以关联给 redis 键的最简单值类型。字符串是 Memcached 的唯一数据类型,所以新手使用起来也是很自然的。
- 由于 Redis 的键也是字符串,当我们使用字符串作为值的时候,我们是将一个字符串映射给另一个字符串。字符串数据类型适用于很多场景,例如,缓存 HTML 片段或者页面。
Redis(String)
set mykey somevalue 设置内容:
1 | 127.0.0.1:6379> set name zbcn |
2 | OK |
set key value [ex seconds] [ px millionseconds] [nx|xx]:为指定的键设置一个值,若键已存在值则覆盖,命令执行成功返回ok,添加nx或xx时命令执行失败返回nil
[ex seconds] 设置指定秒数后值失效[px millionseconds] 设置指定毫秒数后值失效
[nx|xx] nx表示只有键不存在才设置值,xx表示只有键存在才设置值
note: 如果键已经存在,SET 会替换掉该键已经存在的值,哪怕这个键关联的是一个非字符串类型的值。SET 执行的是赋值操作。
- 值可以是任何类型的字符串 (包括二进制数据),例如,你可以存储一个 JPEG 图像。值不能大于 512MB。
get mykey 获取内容
1 | 127.0.0.1:6379> get name |
2 | "zbcn" |
set mykey somevalue nx 和 set mykey somevalue xx
set mykey somevalue nx- 如果不存在则插入成功,如果存在则插入失败
set mykey somevalue xx- 如果存在则插入成功,如果不存在则插入失败
1 | 插入 name= zbcn |
2 | 127.0.0.1:6379> set name zbcn |
3 | OK |
4 | 查询 name 的值 |
5 | 127.0.0.1:6379> get name |
6 | "zbcn" |
7 | 插入失败: nx表示只有键不存在才设置值 |
8 | 127.0.0.1:6379> set name zbcn_1 nx |
9 | (nil) |
10 | 插入成功: xx表示只有键存在才设置值 |
11 | 127.0.0.1:6379> set name zbnc_02 xx |
12 | OK |
INCR, IINCRBY 和 DECR DECRBY
INCR命令将字符串值解析为整数,并增加一,最后赋值后作为新值INCRBY命令将字符串值解析为整数,命令将按照指定的整数增加DECR命令将字符串值解析为整数,并减 一 ,最后赋值后作为新值DECRBY命令将字符串值解析为整数,命令将按照指定的整数减少
示例:
1 | 127.0.0.1:6379> set count 100 |
2 | OK |
3 | 127.0.0.1:6379> get count |
4 | "100" |
5 | INCR 增加 1 |
6 | 127.0.0.1:6379> INCR count |
7 | (integer) 101 |
8 | 查看增加后的 count |
9 | 127.0.0.1:6379> get count |
10 | "101" |
11 | INCRBY 指定数量增加 |
12 | 127.0.0.1:6379> INCRBY count 2 |
13 | (integer) 103 |
14 | 查看增加后的值 |
15 | 127.0.0.1:6379> get count |
16 | "103" |
17 | DECR 自减1 |
18 | 127.0.0.1:6379> DECR count |
19 | (integer) 102 |
20 | DECRBY 指定数量减少 |
21 | 127.0.0.1:6379> DECRBY count 5 |
22 | (integer) 97 |
MSET 和 MGET 命令:
MESET表示同时设置多个值, MGET 表示同时获取多个值
1 | 127.0.0.1:6379> mset a 1 b 2 c 3 |
2 | OK |
3 | 127.0.0.1:6379> mget a b c |
4 | 1) "1" |
5 | 2) "2" |
6 | 3) "3" |
改变和查询键空间 (key space)
EXISTS命令返回 1(存在) 或者 0(不存在),来表示键在数据库中是否存在。DEL命令删除键及其关联的值,无论值是什么。TYPE命令返回某个键的值的类型。1set mykey hello2OK3exists mykey4(integer) 15del mykey6(integer) 17exists mykey8(integer) 09set mykey x10OK11type mykey12string13del mykey14(integer) 115type mykey16none
Redis 过期 (expires):有限生存时间的键
在我们继续更复杂的数据结构之前,我们先抛出一个与类型无关的特性, 称为 Redis 过期 。你可以给键设置超时,也就是一个有限的生存时间。当生存时间到了,键就会自动被销毁,就像用户调用 DEL 命令一样。
note :
过期时间可以设置为秒或者毫秒精度。
过期时间分辨率总是 1 毫秒。
过期信息被复制和持久化到磁盘,当 Redis 停止时时间仍然在计算 (也就是说 Redis 保存了过期时间)。
EXPIRE命令设置过期PERSIST命令可以删除过期时间使键永远存在TTL命令检查键的生存剩余时间。1127.0.0.1:6379> set expire_key 'hello redis'2OK3127.0.0.1:6379> expire expire_key 104(integer) 15127.0.0.1:6379> get expire_key6"hello redis"710 秒后8127.0.0.1:6379> get expire_key9(nil)1011另一种方式12127.0.0.1:6379> set expire_key 'hello word' EX 10013OK14检查剩余时间15127.0.0.1:6379> ttl expire_key16(integer) 9317127.0.0.1:6379> get expire_key18"hello word"19删除过期时间,持久化到redis20127.0.0.1:6379> PERSIST expire_key21(integer) 1
Redis 列表(Lists)
操作
LPUSH命令从左边 (头部) 添加一个元素到列表,RPUSH命令从右边(尾部)添加一个元素的列表。LRANGE命令从列表中提取一个范围内的元素。rpop从左侧弹出元素lpop从右侧弹出1从左边插入 一个 值 A2rpush mylist A3(integer) 14从右边插入一个值 B5rpush mylist B6(integer) 27从左边插入一个 值 first8lpush mylist first9(integer) 310获取 mylist 列表 中的全部值11lrange mylist 0 -1121) "first"132) "A"143) "B"15从右边依次插入 : 1 2 3 4 5 "foo bar"16rpush mylist 1 2 3 4 5 "foo bar"17(integer) 918获取list 中的全部值19lrange mylist 0 -1201) "first"212) "A"223) "B"234) "1"245) "2"256) "3"267) "4"278) "5"289) "foo bar"29从左边弹出 first30127.0.0.1:6379> lpop mylist31"first"32从左边弹出 "foo bar"33127.0.0.1:6379> rpop mylist34"foo bar"
列表的通用场景(Common use cases)
- 记住社交网络中用户最近提交的更新。
- 使用生产者消费者模式来进程间通信,生产者添加项(item)到列表,消费者(通常是 worker)消费项并执行任务。Redis 有专门的列表命令更加可靠和高效的解决这种问题。
- 使用
LTRIM命令仅仅只记住最新的 N 项,丢弃掉所有老的项。 LTRIM命令类似于LRANGE,但是不同于展示指定范围的元素,而是将其作为列表新值存储
自动创建和删除键
- 当我们向聚合(aggregate)数据类型添加一个元素,如果目标键不存在,添加元素前将创建一个空的聚合数据类型。
- 当我们从聚合数据类型删除一个元素,如果值为空,则键也会被销毁。
- 调用一个像
LLEN的只读命令(返回列表的长度),或者一个写命令从空键删除元素,总是产生和操作一个持有空聚合类型值的键一样的结果。
Redis 哈希/散列 (Hashes)
HMSET添加元素HGET获取元素hgetall获取所有元素HINCRBY针对单个字段的操作1同时将多个 field-value (域-值)对设置到哈希表 key 中。2127.0.0.1:6379> hmset user username zbcn age 23 gender 1 addr beijing3OK4获取在哈希表中指定 key 的所有字段和值5127.0.0.1:6379> hgetall user61) "username"72) "zbcn"83) "age"94) "23"105) "gender"116) "1"127) "addr"138) "beijing"14获取所有哈希表中的字段15127.0.0.1:6379> hkeys user161) "username"172) "age"183) "gender"194) "addr"205) "money"21获取哈希表中字段的数量22127.0.0.1:6379> hlen user23(integer) 524获取存储在哈希表中指定字段的值。25127.0.0.1:6379> hget user username26"zbcn"27获取所有给定字段的值28127.0.0.1:6379> hmget user username age291) "zbcn"302) "26"31将哈希表 key 中的字段 field 的值设为 value 。32127.0.0.1:6379> hset user pc mac33(integer) 13435只有在字段 field 不存在时,设置哈希表字段的值。36127.0.0.1:6379> hsetnx user pc win37(integer) 038127.0.0.1:6379> hsetnx user phone iphone39(integer) 14041查看哈希表 key 中,指定的字段是否存在。42127.0.0.1:6379> hexists user name43(integer) 0 # 表示不存在44127.0.0.1:6379> hexists user username45(integer) 1 # 表示存在4647为哈希表 key 中的指定字段的整数值加上增量 increment48127.0.0.1:6379> hincrby user age 349(integer) 2650为哈希表 key 中的指定字段的浮点数值加上增量 increment 。51127.0.0.1:6379> hincrbyfloat user money 20.352"40.799999999999997"5354获取哈希表中所有值。55127.0.0.1:6379> hvals user561) "zbcn"572) "26"583) "1"594) "beijing"605) "40.799999999999997"616) "mac"627) "iphone"63迭代哈希表中的键值对。64127.0.0.1:6379> hscan user 0 match "age"651) "0"662) 1) "age"672) "26"
Redis 集合 (Sets)
- Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
- Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
- 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
SADD命令添加元素到集合。1向集合添加一个或多个成员2127.0.0.1:6379> sadd db redis3(integer) 14127.0.0.1:6379> sadd db mysql es mongodb5(integer) 36获取集合的成员数7127.0.0.1:6379> scard db8(integer) 4910获取集合中的所有成员:SMEMBERS key11127.0.0.1:6379> smembers db121) "mongodb"132) "es"143) "mysql"154) "redis"1617添加db2 集合18127.0.0.1:6379> sadd db2 oracle mq es19(integer) 320返回第一个集合与其他集合之间的差异。21127.0.0.1:6379> sdiff db db2221) "mongodb"232) "mysql"243) "redis"2526给定所有集合的差集并存储在 destination 中27127.0.0.1:6379> sdiffstore destination db db228(integer) 329获取 destination30127.0.0.1:6379> smembers destination311) "mongodb"322) "mysql"333) "redis"3435返回给定所有集合的交集36127.0.0.1:6379> sinter db db2371) "es"38删除 destination39127.0.0.1:6379> del destination40(integer) 141返回给定所有集合的交集并存储在 destination 中42127.0.0.1:6379> sinterstore destination db db243(integer) 144判断 member 元素是否是集合 key 的成员: SISMEMBER key member45127.0.0.1:6379> sismember db es46(integer) 147将 member 元素从 source 集合移动到 destination 集合48127.0.0.1:6379> smove db destination mysql49(integer) 150127.0.0.1:6379> smembers db511) "mongodb"522) "es"533) "redis"54127.0.0.1:6379> smembers destination551) "mysql"562) "es"5758移除并返回集合中的一个随机元素59127.0.0.1:6379> spop destination60"mysql"61返回集合中一个或多个随机数62127.0.0.1:6379> srandmember db 2631) "mongodb"642) "redis"65移除集合中一个或多个成员66127.0.0.1:6379> srem db mongodb redis67(integer) 268返回所有给定集合的并集69127.0.0.1:6379> sunion db distination701) "es"71所有给定集合的并集存储在 destination 集合中72127.0.0.1:6379> sunionstore destination db db273(integer) 374迭代集合中的元素75127.0.0.1:6379> sscan db 0 MATCH my*761) "0"772) 1) "mysql"
Redis 有序集合 (Sorted sets)
1 | zadd key [NX|XX] [CH] [INCR] score member [score member ...] |
排序规则:
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
如果 A 和 B 是拥有不同分数的元素,A.score > B.score,则 A > B。
合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
如果 A 和 B 是有相同的分数的元素,如果按字典顺序 A 大于 B,则 A > B。A 和 B 不能相同,因为排序集合只能有唯一元素。
1向有序集合添加一个或多个成员,或者更新已存在成员的分数2127.0.0.1:6379> zadd score 90 zbcn3(integer) 14127.0.0.1:6379> zadd score 79 zhangsan 80 lisi 60 wangwu5(integer) 36获取有序集合的成员数7127.0.0.1:6379> zcard score8(integer) 49计算在有序集合中指定区间分数的成员数10127.0.0.1:6379> zcount score 80 9011(integer) 212有序集合中对指定成员的分数加上增量 increment13127.0.0.1:6379> zincrby score 5 zbcn14"95"15计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中16ZINTERSTORE destination numkeys key [key ...]17添加集合 midd_test18127.0.0.1:6379> zadd midd_test 70 "Li Lei" 70 "Han Meimei" 99.5 "Tom"19(integer) 320添加集合 fin_test21127.0.0.1:6379> ZADD fin_test 88 "Li Lei" 75 "Han Meimei" 99.5 "Tom"22(integer) 323求 midd_test 和fin_test 的交集 并且存储到 sum_point 中24127.0.0.1:6379> zinterstore sum_point 2 midd_test fin_test25(integer) 32627查看 sum_point 中的内容 ZRANGE key start stop [WITHSCORES]28以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推29127.0.0.1:6379> zrange sum_point 0 -1301) "Han Meimei"312) "Li Lei"323) "Tom"33带score 值查看 sum_ponit 中的值 分数由小到大34127.0.0.1:6379> zrange sum_point 0 -1 withscores351) "Han Meimei"362) "145"373) "Li Lei"384) "158"395) "Tom"406) "199"4142返回指定区间内的成员,成员的位置按分数值递减(从大到小)来排列43127.0.0.1:6379> zrevrange sum_point 0 -1 withscores441) "Tom"452) "199"463) "Li Lei"474) "158"485) "Han Meimei"496) "145"5051返回有序集合中指定成员的索引52127.0.0.1:6379> zrank score zbcn53(integer) 45455返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序56127.0.0.1:6379> zrevrank score zbcn57(integer) 05859返回有序集中,成员的分数值60127.0.0.1:6379> zscore score zbcn61"95"6263计算给定的一个或多个有序集的并集,并存储在新的 key 中64127.0.0.1:6379> zunionstore union_point 2 midd_test fin_test65(integer) 366127.0.0.1:6379> zrange union_point 0 -1671) "Han Meimei"682) "Li Lei"693) "Tom"707172移除有序集合中的一个或多个成员73127.0.0.1:6379> zrem score lisi74(integer) 17576移除有序集合中给定的字典区间的所有成员 ZREMRANGEBYLEX key min max77127.0.0.1:6379> zremrangebylex myzset [a [b78(integer) 279移除有序集合中给定的排名区间的所有成员: ZREMRANGEBYRANK key start stop80127.0.0.1:6379> zremrangebyrank myzset 0 281(integer) 38283移除有序集合中给定的分数区间的所有成员84127.0.0.1:6379> zremrangebyscore score 60 (8085(integer) 28687迭代有序集合中的元素(包括元素成员和元素分值)88127.0.0.1:6379> zscan union_point 0 match "Li Lei"891) "0"902) 1) "Li Lei"912) "158"ZRANGEBYLEX
ZRANGEBYLEX key min max [LIMIT offset count]当以相同的分数插入排序集中的所有元素时,为了强制按字典顺序排序,此命令将返回键中排序集中的所有元素,且其值介于min和max之间。如果排序集中的元素具有不同的分数,则返回的元素未指定.
min 和 max 说明:
有效的开始和停止必须以(或[,为了指定范围项目是分别是排他性还是包含性。
+和-的特殊值(对于开始和停止)具有特殊含义,或者是正无限和负无限字符串,因此,例如,命令
ZRANGEBYLEX myzset-+保证返回排序集中的所有元素,如果所有元素都具有相同的分数.1127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e2(integer) 53127.0.0.1:6379> ZADD myzset 0 f 0 g4(integer) 25移除有序集合中给定的字典区间的所有成员6127.0.0.1:6379> zrangebylex myzset [a [g71) "a"82) "b"93) "c"104) "d"115) "e"126) "f"137) "g"14127.0.0.1:6379> zrangebylex myzset [a (g151) "a"162) "b"173) "c"184) "d"195) "e"206) "f"21127.0.0.1:6379> zrangebylex myzset - +221) "a"232) "b"243) "c"254) "d"265) "e"276) "f"287) "g"
ZLEXCOUNT
ZLEXCOUNT key min max
当以相同的分数插入排序集中的所有元素时,为了强制按字典顺序排序,此命令返回键中排序集中的元素数,其值介于min和max之间。min和max参数的含义与对ZRANGEBYLEX的描述相同。
1 | 在有序集合中计算指定字典区间内成员数量 |
2 | 127.0.0.1:6379> ZLEXCOUNT myzset - + |
3 | (integer) 7 |
4 | 127.0.0.1:6379> ZLEXCOUNT myzset [a [b |
5 | (integer) 2 |
ZRANGEBYSCORE
Zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。
具有相同分数值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。
默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 (符号来使用可选的开区间 (小于或大于)。
1 | 127.0.0.1:6379> zrangebyscore score 60 90 |
2 | 1) "wangwu" |
3 | 2) "zhangsan" |
4 | 3) "lisi" |
5 | 4) "zhaoliu" |
6 | 127.0.0.1:6379> zrangebyscore score 60 90 withscores |
7 | 1) "wangwu" |
8 | 2) "60" |
9 | 3) "zhangsan" |
10 | 4) "79" |
11 | 5) "lisi" |
12 | 6) "80" |
13 | 7) "zhaoliu" |
14 | 8) "80" |
15 | 显示整个有序集 |
16 | 127.0.0.1:6379> zrangebyscore score -inf +inf |
17 | 1) "wangwu" |
18 | 2) "zhangsan" |
19 | 3) "lisi" |
20 | 4) "zhaoliu" |
21 | 5) "zbcn" |
22 | 127.0.0.1:6379> zrangebyscore score -inf +inf withscores |
23 | 1) "wangwu" |
24 | 2) "60" |
25 | 3) "zhangsan" |
26 | 4) "79" |
27 | 5) "lisi" |
28 | 6) "80" |
29 | 7) "zhaoliu" |
30 | 8) "80" |
31 | 9) "zbcn" |
32 | 10) "95" |
33 | |
34 | 显示分数 <=95 的所有成员 |
35 | 127.0.0.1:6379> zrangebyscore score -inf 95 |
36 | 1) "wangwu" |
37 | 2) "zhangsan" |
38 | 3) "lisi" |
39 | 4) "zhaoliu" |
40 | 5) "zbcn" |
41 | |
42 | 显示分数 >= 60 的所有成员 |
43 | 127.0.0.1:6379> zrangebyscore score 60 +inf withscores |
44 | 1) "wangwu" |
45 | 2) "60" |
46 | 3) "zhangsan" |
47 | 4) "79" |
48 | 5) "lisi" |
49 | 6) "80" |
50 | 7) "zhaoliu" |
51 | 8) "80" |
52 | 9) "zbcn" |
53 | 10) "95" |
54 | |
55 | 显示分数大于 60 小于 95 的成员 |
56 | 127.0.0.1:6379> zrangebyscore score (60 (95 |
57 | 1) "zhangsan" |
58 | 2) "lisi" |
59 | 3) "zhaoliu" |