常用五种数据类型
Redis 键(key)
1、查看当前库所有 key
keys *
2、判断某个 key 是否存在
exists <key>
(1)若存在,则返回 1
(2)若不存在,则返回 0
3、返回 key 所存储 value 的数据结构类型
type <key>
(1)如果 key 不存在时,返回 none
4、删除指定 key
DEL key [key ...]
(1)如果删除中的某些 key 不存在,则直接忽略
(2)返回被删除 key 的数量
5、非阻塞删除指定 key
unlink <key>
(1)仅将 key 从 keyspace 元数据中删除,在后续异步进行真正删除
(2)如果删除中的某些 key 不存在,则直接忽略
(3)返回被删除 key 的数量
6、为指定 key 设置过期时间
expire <key> 时间
(1)单位为秒
(2)对已经有过期时间的 key ,执行 EXPIRE 操作,将会更新它的过期时间
(3)如果成功设置过期时间,返回 1
(4)如果 key 不存在,或者不能设置过期时间,返回 0
7、查看 key 剩余过期时间
ttl <key>
(1)若成功, 返回 key 有效的秒数
(2)如果 key 不存在,或者已过期,返回 -2
(3)如果 key 存在并且没有设置过期时间(永久有效),返回 -1
8、切换数据库
select <dbid>
9、查看当前数据库 key 数量
dbsize
10、清空当前库
flushdb
11、清空全部库
flushall
Key 结构
1、Redis 没有类似 MySQL 中的 Table 概念
2、可以通过给 key 添加前缀,加以区分
3、前缀规范
(1)Redis 的 key 允许有多个单词形成层级结构,多个单词之间用 : 隔开
(2)格式
项目名:业务名:类型:id
(3)并非固定格式,可以根据需求来删除或添加词条
(4)把不同类型的数据区分开,避免 key 冲突问题
4、如果 value 是一个 Java 对象,则可以将对象序列化为 JSON 字符串后存储
Redis 字符串
1、String
2、是 value 最基本的类型
3、根据字符串的格式不同,分为 3 类
(1)string:普通字符串
(2)int:整数类型,可以做自增、自减操作
(3)float:浮点类型,可以做自增、自减操作
(4)不管是何种格式,底层都以字节数组形式存储,只不过是编码方式不同,字符串类型的最大空间不能超过 512MB
4、二进制安全
(1)Redis 的 String 可以包含任何数据
(2)如:图片、序列化对象
5、将 key 设定为指定 String 类型的 value
SET key value [EX seconds] [PX milliseconds] [NX|XX]
(1)EX seconds:设置 key 过期时间,单位时秒
(2)PX milliseconds:设置 key 过期时间,单位时毫秒
(3)NX:只有 key 不存在时,才会设置 key 值,即只添加不更新
(4)XX – 只有 key 存在时,才会设置 key 值,即只更新不添加
(5)由于 SET 命令加上选项,已经可以完全取代 SETNX、SETEX、PSETEX 功能,所以在将来的版本中,redis 可能会不推荐使用,并且最终抛弃这几个命令
(6)如果 SET 命令正常执行,那么回返回 OK
(7)否则如果加 NX 或 XX,但是没有设置条件,那么会返回 nil
6、返回 key 的 value
GET key
(1)如果 key 不存在,返回特殊值 nil
(2)如果 key 的 value 不是 String,就返回错误,因为 GET 只处理 String 类型的 value
7、如果 key 已经存在,并且值为字符串,那么这个命令会把 value,追加到原来值(value)的结尾
APPEND key value
(1)返回 append 后,字符串值(value)的长度
(2)如果 key 不存在,那么它将首先创建一个空字符串 key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作
8、返回 key 的 String 类型 value 长度
STRLEN key
(1)如果 key 对应非 String 类型,就返回错误
(2)key 不存在,返回 0
9、对存储在指定 key 的数值,执行原子的加 1 操作
INCR key
(1)如果指定 key 不存在,那么在执行 incr 操作之前,会先将它的值设定为 0
(2)如果指定 key 中存储的值,不是字符串类型,或者存储的字符串类型不能表示为一个整数,那么执行这个命令时,服务器会返回一个错误 (eq:(error) ERR value is not an integer or out of range)
(3)这个操作仅限于 64 位的有符号整型数据
(4)注意:由于 Redis 并没有一个明确类型,来表示整型数据,所以这个操作是一个字符串操作
(5)执行这个操作时,key 对应存储的字符串,被解析为 10 进制的 64 位有符号整型数据
(6)事实上,Redis 内部采用整数形式(Integer representation),来存储对应的整数值,所以对该类字符串值,实际上是用整数保存,也就不存在存储整数的字符串表示(String representation)所带来的额外消耗
(7)返回执行递增操作后 key 对应的值
10、对 key 对应的数字做减 1 操作
DECR key
(1)如果 key 不存在,那么在操作之前,这个 key 对应 value 被置为 0
(2)如果 key 有一个错误类型的 value,或者是一个不能表示成数字的字符串,就返回错误
(3)这个操作最大支持在 64 位有符号的整型数字
(4)返回减小之后的 value
11、将 key 对应的数字,加 decrement
INCRBY key increment
(1)如果 key 不存在,操作之前,key 就会被置为 0
(2)如果 key 的 value 类型错误,或是个不能表示成数字的字符串,就返回错误
(3)这个操作最多支持 64 位有符号的整型数字
(4)返回增加之后的 value
12、将 key 对应的数字,减 decrement
DECRBY key decrement
(1)如果 key 不存在,操作之前,key 就会被置为 0
(2)如果 key 的 value 类型错误,或是不能表示成数字的字符串,就返回错误
(3)这个操作最多支持 64 位有符号的整型数字
(4)返回减少之后的 value
13、原子性
(1)原子操作:不会被线程调度机制打断的操作
(2)这种操作一旦开始,就一直运行到结束,中间不会有任何上下文切换(切换到另一个线程)
(3)在单线程中,能够在单条指令中完成的操作,都可以认为是原子操作,因为中断只能发生于指令之间
(4)在多线程中,不能被其它进程(线程)打断的操作就叫原子操作
(5)Redis 单命令的原子性,是由于 Redis 的单线程
14、添加新的 key-value,或新的 value 替换已经存在的 value,如 SET 命令一样
MSET key value [key value ...]
(1)MSET 是原子操作,所以所有给定的 keys 是一次性 set 的
(2)客户端不可能看到,一部分 keys 被更新,而另外的没有改变的情况
(3)总是返回 OK,因为 MSET 不会失败
15、返回所有指定的 key 的 value
MGET key [key ...]
(1)对于每个不对应 String,或者不存在的 key,都返回特殊值 nil,所以这个操作从来不会失败
(2)返回指定的 key,对应的 values 的 list
16、只添加新的 key-value
MSETNX key value [key value ...]
(1)只要有一个 key 已经存在,MSETNX 一个操作都不会执行
(2)MSETNX 可以实现要么所有的操作都成功,要么一个都不执行,可以用来设置不同 key,来表示一个唯一的对象的不同字段
(3)MSETNX 为原子操作,所有给定的 key 是一次性 set,客户端不可能看到这种一部分 key 被更新,而另外的没有改变的情况
(4)如果所有 key 被 set,则返回 1
(5)如果没有 key 被 se((至少其中存在一个 key),返回 0
17、返回 key 对应的字符串 value 的子串
GETRANGE key start end
(1)子串由 start、end 位移决定,两者都在 string 内,即闭区间
(2)负的位移表示从 string 尾部开始数的下标,-1 为最后一个字符,-2 倒数第二个字符,以此类推
(3)这个函数处理超出范围的请求时,都把结果限制在 string 内
18、覆盖 key对应的string的一部分,从指定的offset处开始,覆盖value的长度
SETRANGE key offset value
(1)如果 offset 比当前 key 对应 string 还要长,那这个 string 后面就补 0,以达到 offset
(2)不存在的 key 被认为是空字符串,所以这个命令可以确保 key 有一个足够大的字符串,能在 offset 处设置 value
(3)offset 最大可以是 229 - 1(536870911),因为 redis 字符串限制在 512M 大小,如果需要超过这个大小,可以使用多个 key
19、设置 key 对应字符串 value,并且设置 key 在给定的 seconds 时间之后超时过期
SETEX key seconds value
(1)SETEX 为原子操作
(2)等价于
SET mykey value
EXPIRE mykey seconds
(3)可以通过把上面两个命令放到 MULTI/EXEC 块中执行的方式重现
(4)相比连续执行上面两个命令,它更快,因为当 Redis 做缓存使用时,这个操作更加常用
20、更新 key 对应 value,并且返回原 value
GETSET key value
(1)如果 key 存在,但是对应的 value 不是字符串,就返回错误
(2)如果 key 不存在,将返回 nil
21、数据结构
(1)SDS:Simple Dynamic String
(2)简单动态字符串,可以修改的字符串
(3)内部结构实现上类似 Java 的 ArrayList,采用预分配冗余空间的方式,来减少内存的频繁分配
(4)内部为当前字符串实际分配的空间 capacity,一般要高于实际字符串长度 len
(5)当字符串长度小于 1M 时,扩容都是加倍现有的空间
(6)如果超过 1M,扩容时,一次只会扩 1M 空间
(7)需要注意的是字符串最大长度为 512M
Redis 列表
1、List
2、单键多值
3、Redis 列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左边)或尾部(右边)
4、底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
5、将所有指定 value,插入到存于 key 的列表的头部
LPUSH key value [value ...]
(1)如果 key 不存在,那么在进行 push 操作前,会创建一个空列表
(2)如果 key 对应的值不是一个 list 的话,那么会返回一个错误
(3)可以使用一个命令把多个元素 push 进入列表,只需在命令末尾加上多个指定 value
(4)元素是从最左端的到最右端的、一个接一个被插入到 list 的头部,例:LPUSH mylist a b c,返回的列表是 c 为第一个元素, b 为第二个元素, a 为第三个元素
(5)返回在 push 操作后的 list 长度
6、向存于 key 的列表的尾部,插入所有指定 value
RPUSH key value [value ...]
(1)如果 key 不存在,那么会创建一个空的列表,然后再进行 push 操作
(2)当 key 保存的不是一个列表,那么会返回一个错误
(3)可以使用一个命令把多个元素压入队列,只需要在命令后面指定多个参数
(4)元素是从左到右、一个接一个从列表尾部插入,例:RPUSH mylist a b c,列表第一个元素是 a ,第二个元素是 b ,第三个元素是 c
(5)返回在 push 操作后的列表长度
7、移除并且返回 key 对应的 list 的第一个元素
LPOP key
(1)当 key 不存在时,返回 nil
8、移除并返回存于 key 的 list 的最后一个元素
RPOP key
(1)当 key 不存在的时,返回 nil
9、原子性地返回并移除存储在 source 的列表的最后一个元素(列表尾部元素), 并把该元素放入存储在 destination 的列表的第一个元素位置(列表头部)
RPOPLPUSH source destination
(1)如果 source 不存在,那么会返回 nil 值,并且不会执行任何操作
(2)如果 source 和 destination 是同样的,那么这个操作等同于移除列表最后一个元素,并且把该元素放在列表头部, 所以这个命令也可以当作是一个旋转列表的命令
(3)返回被移除和放入的元素
10、返回存储在 key 的列表里,指定范围内的元素
LRANGE key start stop
(1)start 和 end 偏移量都是基于0的下标,即 list 第一个元素下标是 0(list 的表头),第二个元素下标是 1,以此类推
(2)偏移量也可以是负数,表示偏移量是从 list 尾部开始计数,例如, -1 表示列表的最后一个元素,-2 是倒数第二个,以此类推
(3)当下标超过 list 范围时,不会产生error
(4)如果 start 比 list 尾部下标大时,会返回一个空列表
(5)如果 stop 比 list 实际尾部大时,Redis 会当它是最后一个元素的下标
11、返回索引 index 存储在 key 的列表的元素
LINDEX key index
(1)下标是从 0 开始索引的,所以 0 是表示第一个元素, 1 表示第二个元素,并以此类推
(2)负数索引用于指定从列表尾部开始索引的元素,-1 表示最后一个元素,-2 表示倒数第二个元素,并以此往前推
(3)当 key 的 value 不是一个列表时,会返回一个 error
(4)当 index 超过范围时,返回 nil
12、返回存储在 key 里的 list 的长度
LLEN key
(1)如果 key 不存在,那么就被看作是空 list,并且返回长度为 0
(2)当存储在 key 里的值不是一个 list,会返回error
13、把 value 插入存于 key 的列表中在基准值 pivot 的前面或后面
LINSERT key BEFORE|AFTER pivot value
(1)当 key 不存在时,这个 list 会被看作是空list,任何操作都不会发生
(2)当 key 存在,但保存的不是一个 list 时,会返回 error
(3)返回经过插入操作后的 list 长度
(4)当 pivot 值找不到时,返回 -1
14、从存于 key 的列表里移除前 count 次出现的值为 value 的元素
LREM key count value
(1)count > 0:从头往尾移除值为 value 的元素
(2)count < 0:从尾往头移除值为 value 的元素
(3)count = 0:移除所有值为 value 的元素
(4)所以当 key 不存在时,当作空 list 处理,这个命令会返回 0
(6)返回被移除的元素个数
15、设置 index 位置的 list 元素的值为 value
LSET key index value
(1)当 index 超出范围时,会返回一个 error
16、数据结构
(1)quickList:快速链表
(2)首先在列表元素较少的情况下,会使用一块连续的内存存储,结构为 ziplist,即压缩列表
(3)ziplist 将所有的元素紧挨着一起存储,分配的是一块连续的内存
(4)当数据量比较多时,改成 quicklist
(5)因为普通的链表需要的附加指针空间太大,会比较浪费空间
(6)Redis 将链表和 ziplist 结合,组成 quicklist,即将多个 ziplist 使用双向指针串起来使用,既满足快速的插入删除性能,又不会出现太大的空间冗余
Redis 集合
1、Set
2、与 list 类似,提供一个列表的功能,但 set 可以自动排重,并且提供判断某个成员是否在一个 set 集合内的重要接口
3、Redis 的 Set 是 string 类型的无序集合
(1)底层:一个 value 为 null 的 hash 表,所以添加,删除,查找的复杂度都是 O(1)
(2)随着数据的增加,数据增加,查找数据的执行时间不变
4、添加一个或多个指定的 member 元素到 key 的 set 中
SADD key member [member ...]
(1)指定的一个或多个元素 member,如果已经在集合 key 中存在,则忽略
(2)如果集合 key 不存在,则新建集合 key,并添加 member 元素到 set 中
(3)如果 key 的类型不是 set,则返回错误
(4)返回新成功添加到集合里元素的数量,不包括已经存在于集合中的元素
5、返回 key 集合所有的元素
SMEMBERS key
(1)该命令的作用,与使用一个参数的 SINTER 命令作用相同
6、查看成员 member,是否是存储的集合 key 的成员
SISMEMBER key member
(1)如果 member 元素是集合 key 的成员,则返回 1
(2)如果 member 元素不是 key 的成员,或者集合 key 不存在,则返回 0
7、返回集合存储的 key 的基数(集合元素的数量)
SCARD key
(1)如果 key 不存在,则返回 0
8、移除 key 集合中指定元素
SREM key member [member ...]
(1)如果指定的元素不是 key 集合中的元素,则忽略
(2)如果 key 集合不存在,则被视为一个空的集合,该命令返回 0
(3)如果 key 的类型不是一个集合,则返回错误
(4)返回从集合中移除元素的个数,不包括不存在的成员
9、从存储在 key 的集合中,移除并返回一个或多个随机元素
SPOP key [count]
(1)此操作与 SRANDMEMBER 类似,从一个集合中返回一个或多个随机元素,但不删除元素
(2)count 参数将在更高版本中提供,但是在 2.6、2.8、3.0 中不可用
(3)返回被删除的元素
(4)当 key 不存在时,返回 nil
10、仅提供 key 参数,那么随机返回 key 集合中的一个元素
SRANDMEMBER key [count]
(1)Redis 2.6 开始,可以接受 count 参数
(2)如果 count 是整数,且小于元素的个数,返回含有 count 个不同的元素的数组
(3)如果 count 是整数,且大于集合中元素的个数时,仅返回整个集合的所有元素
(4)当 count 是负数,则会返回一个包含 count 的绝对值的个数元素的数组
(5)如果 count 绝对值大于元素的个数,则返回的结果集里,会出现一个元素出现多次的情况
(6)仅提供 key参数时,该命令作用类似于 SPOP,SPOP 将被选择的随机元素从集合中移除,而 SRANDMEMBER 仅仅是返回该随记元素,而不做任何操作
(7)不使用 count 参数的情况下,该命令返回随机的元素,如果 key 不存在,则返回 nil
(8)使用 count 参数,则返回一个随机的元素数组,如果 key 不存在,则返回一个空的数组
11、将 member 从 source 集合,移动到 destination 集合中
SMOVE source destination member
(1)对于其他的客户端,在特定的时间,元素将会作为 source 或 destination 集合的成员出现
(2)如果 source 集合不存在,或者不包含指定的元素,smove 不执行任何操作,并且返回 0,否则对象将会从 source 集合中移除,并添加到 destination 集合中
(3)如果 destination 集合已经存在该元素,则 smove 仅将该元素从 source 集合中移除
(4)如果 source 和 destination 不是集合类型,则返回错误
(5)如果该元素成功移除,返回 1
(6)如果该元素不是 source 集合成员,无任何操作,则返回 0
12、返回指定所有的集合的成员的交集
SINTER key [key ...]
(1)如果 key 不存在,则被认为是一个空的集合
(2)当给定的集合为空时,结果也为空(一个集合为空,结果一直为空)
13、返回给定的多个集合的并集中的所有成员
SUNION key [key ...]
(1)不存在的 key,可以认为是空的集合
14、返回一个集合与给定集合的差集的元素
SDIFF key [key ...]
(1)不存在的 key,认为是空集
15、数据结构
(1)dict 字典,字典使用哈希表实现
(2)Java 中 HashSet 使用 HashMap 实现,只不过所有 value 都指向同一个对象
(3)Redis 的 set 内部使用 hash 结构,所有 value 都指向同一个内部值
Redis 哈希
1、Hash
2、一个键值对集合
3、一个 string 类型的 field 和 value 的映射表
4、适合存储对象
5、类似 Java 的 Map<String, Object>
6、设置 key 指定的哈希集中指定 field 的 value
HSET key field value
(1)如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联
(2)如果 field 在哈希集中存在,它将被重写
(3)如果 field 是一个新的字段,返回 1
(4)如果 field 在 map 中已经存在,返回 0
7、返回 key 指定的哈希集中该 fiel 所关联的 value
HGET key field
(1)当 filed 不存在,或 key 不存在时,返回 nil
8、设置 key 指定的哈希集中指定字段的值
HMSET key field value [field value ...]
(1)该命令将重写所有在哈希集中存在的字段
(2)如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联
9、检查 hash 里面 field 是否存在
HEXISTS key field
(1)hash 里面包含该 field,返回 1
(2)hash 里面不包含该 field,或 key不存在,返回 0
10、返回 key 指定的哈希集中所有字段(列表)
HKEYS key
(1)当 key 指定的哈希集不存在时,返回空列表
11、返回 key 指定的哈希集中所有字段的值(列表)
HVALS key
(1)当 key 指定的哈希集不存在时,返回空列表
12、增加 key 指定的哈希集中指定字段的数值
HINCRBY key field increment
(1)如果 key 不存在,会创建一个新的哈希集并与 key 关联
(2)如果字段不存在,则字段的值在该操作执行前被设置为 0
(3)HINCRBY 支持的值的范围限定在 64位 有符号整数
(4)返回增值操作执行后的该字段的值
13、只在 key 指定的哈希集中不存在指定的字段时,设置字段的值
HSETNX key field value
(1)如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联
(2)如果字段已存在,该操作无效果
(3)如果字段是个新的字段,并成功赋值,返回 1
(4)如果哈希集中已存在该字段,没有操作被执行,返回 0
14、数据结构
(1)Hash 类型对应的两种数据结构:ziplist(压缩列表),hashtable(哈希表)
(2)当 field-value 长度较短,且个数较少时,使用 ziplist,否则使用 hashtable
Redis 有序集合
1、Zset(sorted set)
2、Zset、Set
(1)相同:一个没有重复元素的字符串集合
(2)不同:有序集合的每个成员都关联一个评分(score),评分被用来按照从最低分到最高分的方式,排序集合中的成员,集合的成员是唯一的,但是评分可以重复
3、元素有序
(1)可以很快的根据评分(score)或者次序(position),来获取一个范围的元素
(2)访问有序集合的中间元素非常快,因此能够使用有序集合,作为一个没有重复成员的智能列表
4、将所有指定成员添加到键为 key 有序集合(sorted set)中
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
(1)添加时,可以指定多个分数 / 成员(score / member)对
(2)如果指定添加的成员,已经是有序集合里面的成员,则会更新改成员的分数(scrore),并更新到正确的排序位置
(3)如果 key 不存在,将会创建一个新的有序集合(sorted set),并将分数 / 成员(score / member)对,添加到有序集合,就像原来存在一个空的有序集合一样
(4)如果 key 存在,但是类型不是有序集合,将会返回一个错误应答
(5)分数值是一个双精度的浮点型数字字符串
(6)+inf、-inf 都是有效值
(7)XX:仅仅更新存在的成员,不添加新成员
(8)NX:不更新存在的成员,只添加新成员
(9)CH:修改返回值为发生变化的成员总数,原始返回新添加成员的总数(CH 为 changed 的意思),更改的元素指新添加的成员、已经存在的成员更新分数,所以在命令中指定的成员有相同的分数将不被计算在内
(10)INCR:当 ZADD 指定这个选项时,成员的操作就等同 ZINCRBY 命令,对成员的分数进行递增操作
(11)分数可以精确的表示的整数的范围,Redis 有序集合的分数使用双精度 64 位浮点数,表示为一个 IEEE 754 floating point number,包括的整数范围:-253 到 +253
(12)更大的整数在内部用指数形式表示,所以,如果为分数设置一个非常大的整数,得到的是一个近似的十进制数
(13)有序集合按照分数以递增的方式进行排序,排序位置会随着分数变化而改变
(14)相同的成员(member)只存在一次,有序集合不允许存在重复的成员
(15)有序集合里面的成员都是唯一的,但不同成员间有可能有相同的分数
(16)当多个成员有相同的分数时,他们将是有序的字典(ordered lexicographically),仍由分数作为第一排序条件,然后,相同分数的成员按照字典规则相对排序
(17)字典顺序排序用的是二进制,它比较的是字符串的字节数组
(18)返回添加到有序集合的成员数量,不包括已经存在更新分数的成员
(19)如果指定 INCR,返回成员的新分数(双精度的浮点型数字)字符串
5、返回存储在 key 有序集合中的指定范围的元素的列表
ZRANGE key start stop [WITHSCORES]
(1)返回的元素可以认为是按得分从最低到最高排列
(2)如果得分相同,将按字典排序
(3)start、stop 都是以 0 为起始索引,可以是负数,表示从有序集合的末尾的偏移量,其中 -1 是有序集合的最后一个元素,-2 是倒数第二个元素
(4)start、stop 都是闭区间
(5)超出范围的索引不会产生错误,如果 start 大于有序集合中的最大索引,或 start > stop,将会返回一个空列表;如果 stop 大于有序集合的末尾,Redis 会将其视为有序集合的最后一个元素
(6)可以传递 WITHSCORES 选项,以便将元素的分数与元素一起返回,返回的列表将包含 value1,score1,...,valueN,scoreN
(7)客户端类库可以自由地返回更合适的数据类型,建议:具有值和得分的数组或记录
6、返回 key 的有序集合中,分数在 min 和 max 之间的所有元素的列表(包括分数等于 max 或 min 的元素)
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
(1)元素被认为是从低分到高分排序
(2)具有相同分数的元素按字典序排列(根据 redis 对有序集合实现的情况而定,并不需要进一步计算)
(3)可选 LIMIT 指定返回结果的数量及区间(类似 SQL 中 SELECT LIMIT offset, count),注意,如果 offset 太大,定位 offset 就可能遍历整个有序集合,这会增加 O(N) 复杂度
(4)可选参数 WITHSCORES 会返回元素和其分数,而不只是元素
(5)min 和 max 可以是 -inf 和 +inf,可以在不知道有序集的最低和最高 score 值的情况下,使用 ZRANGEBYSCORE
(6)默认情况下,区间的取值使用闭区间,可以通过给参数前增加 ( 符号,使用可选的开区间(小于或大于)
7、返回有序集合中指定分数区间内的成员的列表,分数由高到低排序
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
指令 | 是否必须 | 说明 |
ZREVRANGEBYSCORE | 是 | 指令 |
key | 是 | 有序集合键名称 |
max | 是 | 最大分数值,可使用"+inf"代替 |
min | 是 | 最小分数值,可使用"-inf"代替 |
WITHSCORES | 否 | 将成员分数一并返回 |
LIMIT | 否 | 返回结果是否分页,指令中包含LIMIT后offset、count必须输入 |
offset | 否 | 返回结果起始位置 |
count | 否 | 返回结果数量 |
(1)max、min 前可以加 ( 符号作为开头,表示小于,( 符号与成员之间不能有空格
(2)可以使用 +inf、-inf 表示得分最大值、最小值
(3)max、min 不能相反,max 在后,min 在前,会导致返回结果为空
(4)计算成员之间的成员数量不加 ( 符号时,参数 min 和 max 的位置也计算在内
(5)ZREVRANGEBYSCORE 集合中按得分从高到底排序,所以 max 在前面,min 在后面;ZRANGEBYSCORE 集合中按得分从底到高排序,所以 min 在前面,max 在后面
8、为 key 有序集的成员 member 的 score 值,加上增量 increment
ZINCRBY key increment member
(1)如果 key 中不存在 member,就在 key 中添加一个 member,score 是 increment
(2)如果 key 不存在,就创建一个只含有指定 member 成员的有序集合
(3)当 key 不是有序集类型时,返回一个错误
(4)score 值必须是字符串表示的整数值或双精度浮点数,并且能接受 double 精度的浮点数
(5)返回 member 新 score 值,以字符串形式表示
9、返回从有序集合中删除的成员个数,不包括不存在的成员
ZREM key member [member ...]
(1)当 key 存在,但是其不是有序集合类型,就返回一个错误
10、返回 key 有序集中,score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max)成员个数
ZCOUNT key min max
11、返回 key 有序集中成员 member 的排名
ZRANK key member
(1)其中有序集成员按 score 值递增(从小到大)顺序排列
(2)排名以 0 为底,score值最小的成员排名为 0
(3)使用 ZREVRANK 命令,可以获得成员按 score 值递减(从大到小)排列的排名
(4)如果 member 是有序集 key 的成员,返回 member 排名
(5)如果 member 不是有序集 key 的成员,返回 nil
12、数据结构
(1)hash:关联元素 value、权重 score,保障元素 value 的唯一性,可以通过元素 value 找到相应 score 值
(2)跳跃表:给元素 value 排序,根据 score 范围获取元素列表
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战