Redis 中存在五种值类型,别离是 string(字符串),list(列表),hash(散列),set(汇合)和 sorted set(有序汇合)。上面咱们对每一种值类型进行剖析了解。
RedisObject
在介绍 redis 值类型之前,咱们得先理解一下 redisObject。redisObject 是 redis 中封装 value 对象的数据结构。任何一个 value 都会被包装成一个 redisObject。redisObject 能指定 value 的类型,编码格局,内存回收,数据指针等。这样设计的益处是在 5 种罕用类型设置多种不同的的数据结构实现,优化对象在不同场景下的效率。
typedef struct redisObject {
// 刚刚好 32 bits
// 对象的类型,字符串 / 列表 / 汇合 / 哈希表
unsigned type:4;
// 未应用的两个位
unsigned notused:2; /* Not used */
// 编码的形式,Redis 为了节俭空间,提供多种形式来保留一个数据
// 譬如:“123456789”会被存储为整数 123456789
unsigned encoding:4;
// 当内存缓和,淘汰数据的时候用到
unsigned lru:22; /* lru time (relative to server.lruclock) */
// 援用计数
int refcount;
// 数据指针
void *ptr;
} robj
这里介绍几个比拟要害的属性:
-
type:标记了 value 对象的数据类型,应用
type
命令来获取。所有数据类型如下所示:/* Object types */ #define REDIS_STRING 0 #define REDIS_LIST 1 #define REDIS_SET 2 #define REDIS_ZSET 3 #define REDIS_HASH 4
- encoding:标记了 value 对象的编码,也就是应用了什么数据结构,应用
object encoding
命令来获取。编码如下所示:
/* Objects encoding. Some kind of objects like Strings and Hashes can be
* internally represented in multiple ways. The 'encoding' field of the object
* is set to one of this fields for this object. */
#define REDIS_ENCODING_INT /* Encoded as integer */
#define REDIS_ENCODING_EMBSTR /* Encoded as embstr */
#define REDIS_ENCODING_RAW /* Raw representation */
#define REDIS_ENCODING_HT /* Encoded as hash table */
#define REDIS_ENCODING_LINKEDLIST /* Encoded as regular linked list */
#define REDIS_ENCODING_ZIPLIST /* Encoded as ziplist */
#define REDIS_ENCODING_INTSET /* Encoded as intset */
#define REDIS_ENCODING_SKIPLIST /* Encoded as skiplist */
redis 为优化内存,对数据类型提供了多种底层实现形式,type 和 encoding 对应关系如下表格所示:
类型(type 属性) | 编码(encoding 属性) | 正文 |
---|---|---|
REDIS_STRING | REDIS_ENCODING_INT | 整数值实现的字符串 |
REDIS_STRING | REDIS_ENCODING_EMBSTR | embstr 编码的简略动静字符串实现的字符串 |
REDIS_STRING | REDIS_ENCODING_RAW | 简略动静字符串实现的字符串 |
REDIS_LIST | REDIS_ENCODING_ZIPLIST | 压缩列表实现的列表 |
REDIS_LIST | REDIS_ENCODING_LINKEDLIST | 双向链表实现的列表 |
REDIS_HASH | REDIS_ENCODING_ZIPLIST | 压缩列表实现的哈希表 |
REDIS_HASH | REDIS_ENCODING_HT | 字典实现的哈希表 |
REDIS_SET | REDIS_ENCODING_INTSET | 整数汇合实现的汇合 |
REDIS_SET | REDIS_ENCODING_HT | 字典实现的汇合 |
REDIS_ZSET | REDIS_ENCODING_ZIPLIST | 压缩列表实现的有序汇合 |
REDIS_ZSET | REDIS_ENCODING_SKIPLIST | 应用跳跃表 + 字典实现的有序汇合 |
- lru:redis 对数据集占用内存的大小由周期性的计算,当超出限度时,会淘汰超时的数据。即淘汰的规范为:oversize & overtime。
举个栗子,当 set hello world 时会有以下数据模型:
- dictEntry:Redis 给每个 key-value 键值对调配一个 dictEntry,外面有着 key 和 val 的指针,next 指向下一个 dictEntry 造成链表,这个指针能够将多个哈希值雷同的键值对链接在一起,由此来解决哈希抵触问题(链地址法)。
- sds:键 key “hello” 是以 SDS(简略动静字符串)存储。
- redisObject:值 val 是存储在 redisObject。
简略动静字符串:长度动静可变,可类比为 Java 中的 ArrayLIst。Redis 中不仅 Key 是以 SDS 模式存储,String 类型 value 对象也有以 SDS 存储。
struct sdshdr {
int len; // buf 数组中曾经应用的字节的数量,也就是 SDS 字符串长度
int free; // buf 数组中未应用的字节的数量
char buf[]; // 字节数组,字符串就保留在这外面};
- 常数复杂度获取字符串长度:len 字段存储字符串长度
-
预空间调配:
- SDS 长度(len 的值)小于 1MB,那么程序将调配和 len 属性同样大小的未应用空间,这时 free 和 len 属性值雷同。
- SDS 长度(len 的值)大于等于 1MB,程序会调配 1MB 的未应用空间。
- 惰性开释空间:当执行 sdstrim(截取字符串)之后,SDS 不会立马开释多进去的空间,如果下次再进行拼接字符串操作,且拼接的没有方才开释的空间大,则那些未应用的空间就会排上用场。通过惰性开释空间防止了特定状况下操作字符串的内存重新分配操作。
-
杜绝缓冲区溢出:应用 C 字符串的操作时,如果字符串长度减少(如 strcat 操作)而遗记从新分配内存,很容易造成缓冲区的溢出;而 SDS 因为记录了长度,相应的操作在可能造成缓冲区溢出时会主动从新分配内存,杜绝了缓冲区溢出。
String
String 类型是咱们最罕用的一种 value 数据类型,在上文中咱们看到 string 的 encoding 有三种类型,即对应的三种数据结构实现(int,embstr,raw)。embstr 和 raw 都是 SDS 存储(上文已介绍),但 embstr 只须要一次内存调配空间,而 raw 须要两次。
int 编码字符串对象和 embstr 编码字符串对象在肯定条件下会转化为 raw 编码字符串对象。如下所示:
当你存储的是中文时,因为 redis 是二进制平安的,所以在不同编码下数据的长度是不同的,有趣味的能够看看这篇文章 redis 是二进制平安。
字符串
String 数据类型中比拟罕用的就是作为字符串应用,能够作为缓存存储一些信息,比方登录用户的一些信息等。如果对命令不太熟悉的前提下咱们在 Linux 零碎中能够在连贯 redis 客户端的前提下应用help @String
来获取各个命令的作用和语法或者在 redis 命令核心查看。
API
作为字符串罕用的命令包含以下:
## ex(秒)和 px(毫秒)示意 key 的过期工夫 nx 示意不存在才操作 xx 示意存在才操作
SET key value [EX seconds|PX milliseconds] [NX|XX] [KEEPTTL]
summary: Set the string value of a key
since: 1.0.0
## set 多个 key value
MSET key value [key value ...]
summary: Set multiple keys to multiple values
since: 1.0.1
## 在原 value 后追加字符串
APPEND key value
summary: Append a value to a key
since: 2.0.0
## 在 value 的某个偏移量上重写新的 value 值
SETRANGE key offset value
summary: Overwrite part of a string at key starting at the specified offset
since: 2.2.0
## 获取 value 的值长度
STRLEN key
summary: Get the length of the value stored in a key
since: 2.2.0
## 获取旧值并设置新值
GETSET key value
summary: Set the string value of a key and return its old value
since: 1.0.0
数值
当作为数值应用时,其操作都是原子性,故能够作为躲避并发的一种伎俩,其 利用场景包含 秒杀、点赞、珍藏,抢购等。
API
作为数值罕用的命令如下:
## value + 1
INCR key
summary: Increment the integer value of a key by one
since: 1.0.0
## value - 1
DECR key
summary: Decrement the integer value of a key by one
since: 1.0.0
## value + increment
INCRBY key increment
summary: Increment the integer value of a key by the given amount
since: 1.0.0
## value - increment
DECRBY key decrement
summary: Decrement the integer value of a key by the given number
since: 1.0.0
## value + increment(浮点型)INCRBYFLOAT key increment
summary: Increment the float value of a key by the given amount
since: 2.6.0
bitmap
bitmap 不是理论的数据类型,而是在 String 类型上定义的一组面向位的操作。依据官网给出的文档提醒,位图最大的劣势就是在存储时能节俭大量空间。其罕用的 利用场景包含统计沉闷用户或用户登录天数 等。
API
## 统计 key 从 start 到 end 的被设置的为 1 的 bit 数 start end 是字节索引
BITCOUNT key [start end]
summary: Count set bits in a string
since: 2.6.0
## 设置或者清空 key 的 value(字符串)在 offset 处的 bit 值 offset 为二进制的索引
SETBIT key offset value
summary: Sets or clears the bit at offset in the string value stored at key
since: 2.2.0
## 返回位图中第一个值为 bit(0 或 1)的二进制位的地位 start end 是字节索引
BITPOS key bit [start] [end]
summary: Find first bit set or clear in a string
since: 2.8.7
## 对一个或多个保留二进制位的字符串 key 进行位元操作,并将后果保留到 destkey 上
## operation 能够是 AND(并)、OR(或)、NOT(非)、XOR(异或)这四种操作中的任意一种
## 当 key 不同长度 较短的那个 key 默认以 0 补位
BITOP operation destkey key [key ...]
summary: Perform bitwise operations between strings
since: 2.6.0
## 参考 http://redis.cn/commands/bitfield.html
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
summary: Perform arbitrary bitfield integer operations on strings
since: 3.2.0
这里对 bitmap 进行简略演示:
别离在 key 为 bit 的二进制索引地位 1 和二进制地位 7 设置为 1,这样实际上就是 01000001 依据 ASCII 编码该值就是 A。
上图示意有 2 个位被设置为 1,当增加 start 和 end 参数时 该值示意字节索引,如下所示:
首先在第二进制索引地位 16 设置为 1 即 01000001 00000000 10000000 当统计第 1 个字节到第 2 个字节的被设置为 1 的数量时则是 2 个,当不增加则示意所有字节上述实例就是 3 个。
首先在二进制索引 5 设置为 1 即 00000100,而后别离获取第一个为 0 和第一个为 1 的索引地位;而后再二进制索引 8 设置 1 即 00000100 10000000,当设置 start 和 end 时 该值示意字节索引 开始索引别离从第一个字节和第二个字节开始,后果即为 5 和 8。
利用场景
用处咱们在下面介绍时别离都有提及到,不过作为字符串和数值的用处比拟常见,此处不做撰述。咱们来认真看看作为 bitmap 时的利用场景如何应用。
首先就是 统计用户登录天数。假如你用关系型数据库去解决,每个用户登录一天你有相干的登录记录表去录,如果你有 1 千万的沉闷用户每天都在登录你的零碎那么你每个人都去记录一条数据,一年 365 天光数据存储都占用了十分多的资源。如果是应用 bitmap 你能够这样做,登录人的 id 作为 key,每一位示意一天,即如下表。(1 示意登录过,0 示意未登录)
用户 \ 天数 | 1 | 2 | 3 | 4 | 5 | … | 364 | 365 |
---|---|---|---|---|---|---|---|---|
userId1 | 0 | 1 | 1 | 0 | 1 | … | 0 | 1 |
userId2 | 1 | 1 | 0 | 1 | 1 | … | 1 | 0 |
… | … | … | … | … | … | … | … | … |
userId99 | 1 | 1 | 1 | 1 | 0 | … | 1 | 1 |
当用户登录应用 setbit userId offset(哪一天)1
就能够记录该用户当天登录,而后应用bitcount
即能够得出用户登录天数,或者你须要获取某个工夫周期内的登录天数只有在bitcount
加上start
和 end
即可, 最最重要的是它占用的空间非常少比起关系型数据库少太多。
其次就是 沉闷用户统计,比方你要统计日🔥用户,那么你也能够应用 bitmap 来做,思路和下面差不多,只不过当初是把日期作为 key,用户的 id 映射为位,即如下表。(1 示意沉闷,0 示意不沉闷)
日期 \ 用户 | 1 | 2 | 3 | 4 | 5 | … | 364 | 365 |
---|---|---|---|---|---|---|---|---|
20200818 | 0 | 1 | 1 | 0 | 1 | … | 0 | 1 |
20200819 | 1 | 1 | 0 | 1 | 0 | … | 1 | 1 |
当用户沉闷时,应用 setbit 20200818 offset(用户 id 映射的位)1
即示意用户沉闷,而后应用bitcount
即能够得出当天的沉闷用户;如果你须要对某个工夫周期内进行统计且须要去重则可应用 bitop or destkey 工夫 key1 工夫 key...
而后再对destKey
进行bitcount
即可。
假如每个用户存储须要 20B 空间,那么 1 亿个用户所占用的空间就是 20 * 100000000 = 20000000000B ≈ 18G,看起来也是个不小的内存耗费;如果你对精确度不是很高的要求那么能够思考 Redis 提供的 Hypeloglog,能够参考下 Redis HyperLogLog 介绍及利用。
List
List 数据类型就是有序(插入程序)元素的序列,其对应的 encoding 为上文表格中的 ziplist 和 linkelist。Redis 中的列表反对两端插入和弹出,并且可指定地位获取元素,能够充当数组,队列,栈等。因而,其利用场景包含微博的时间轴列表,阻塞队列 等。
这里不对底层数据结构进行剖析,若想理解 zipList 和 linkedList 可参考 Redis 为何这么快 – 数据存储角度的 List 篇。
API
罕用的命令如下:
## 获取列表 index 的值(从左开始)LINDEX key index
summary: Get an element from a list by its index
since: 1.0.0
## 列表插入某个元素
LINSERT key BEFORE|AFTER pivot value
summary: Insert an element before or after another element in a list
since: 2.2.0
## 获取列表长度
LLEN key
summary: Get the length of a list
since: 1.0.0
## 从列表左侧弹出(删除并获取)LPOP key
summary: Remove and get the first element in a list
since: 1.0.0
## 从列表左侧插入多个元素
LPUSH key value [value ...]
summary: Prepend one or multiple values to a list
since: 1.0.0
## 当列表存在时 插入元素
LPUSHX key value
summary: Prepend a value to a list, only if the list exists
since: 2.2.0
## 获取列表指定范畴的元素值 start 和 end 为元素索引
LRANGE key start stop
summary: Get a range of elements from a list
since: 1.0.0
## 移除列表 count 数量的 value 元素 (从左开始) count 为 0 示意全删
LREM key count value
summary: Remove elements from a list
since: 1.0.0
## 设置列表 index 下的值(从左开始)LSET key index value
summary: Set the value of an element in a list by its index
since: 1.0.0
## 截取列表指定范畴的 list start 和 end 为元素索引
LTRIM key start stop
summary: Trim a list to the specified range
since: 1.0.0
## 右侧弹出 左侧插入 source 和 destination 都为列表 可为同一个
RPOPLPUSH source destination
summary: Remove the last element in a list, prepend it to another list and return it
since: 1.2.0
以上列举的是从 list 的左侧开始,同样的 redis 也提供了从 list 的右侧开始。redis 同样提供了阻塞式的一些命令。如下所示:
## 阻塞获取列表元素并删除(左侧)可指定多个列表 同时可设置 timeout 工夫(单位秒)BLPOP key [key ...] timeout
summary: Remove and get the first element in a list, or block until one is available
since: 2.0.0
## 阻塞获取列表元素并删除(右侧)可指定多个列表 同时可设置 timeout 工夫(单位秒)BRPOP key [key ...] timeout
summary: Remove and get the last element in a list, or block until one is available
since: 2.0.0
## RPOPLPUSH source destination 阻塞版本 timeout 工夫(单位秒)BRPOPLPUSH source destination timeout
summary: Pop a value from a list, push it to another list and return it; or block until one is available
since: 2.2.0
这里要留神的是当有多个连贯对同一个 list 进行阻塞监听时,redis 的解决办法是保护了一个阻塞队列,提供 先阻塞先服务,当多个阻塞同时满足唤醒条件时,先阻塞的优先唤醒。
利用场景
下面咱们说 List 能够充当栈,队列。栈的特色是先进后出,那么在应用 Redis 的同一个方向命令(lpush lpop
)时就能够实现栈的特点;队列的特色是先进先出,那么同样的在应用 Redis 的反向命令(lpush rpop
或 rpush lpop
)时就能够实现队列的特点。
微博的时间轴列表也比较简单,每次新增一个微博时只须要 lpush
进去即可,通过lrange
来获取最新的微博音讯。
阻塞队列的实现就须要应用blpop
或 brpop
,首先肯定要先调用blpop
监听,而后再另外一个客户端进行lpush
操作,如果先lpush
再 blpop
那么先lpush
的数据就不会被监听到。
Hash
Hash 数据类型就是 key-value 键值对,对应的 encoding 能够是 ziplist 或者 hashtable。Hash 对象只有同时满足上面两个条件时,才会应用 ziplist(压缩列表):1. 哈希中元素数量小于 512 个;2. 哈希中所有键值对的键和值字符串长度都小于 64 字节。这样会十分节约内存。其利用场景包含点赞,珍藏等。
对其数据结构有趣味的依然能够理解 Redis 为何这么快 – 数据存储角度的 Hash 篇。
API
罕用的命令如下:
## 设置多个键值对
HSET key field value [field value ...]
summary: Set the string value of a hash field
since: 2.0.0
## 设置键值对 不存在才设置
HSETNX key field value
summary: Set the value of a hash field, only if the field does not exist
since: 2.0.0
## 设置多个键值对 4.0 被弃用
HMSET key field value [field value ...]
summary: Set multiple hash fields to multiple values
since: 2.0.0
## 获取 key 下某个键对应的值
HGET key field
summary: Get the value of a hash field
since: 2.0.0
## 获取 key 下多个键对应的值
HMGET key field [field ...]
summary: Get the values of all the given hash fields
since: 2.0.0
## 获取所有 key-value 键值对
HGETALL key
summary: Get all the fields and values in a hash
since: 2.0.0
## 获取所有的键
HKEYS key
summary: Get all the fields in a hash
since: 2.0.0
## 获取所有的值
HVALS key
summary: Get all the values in a hash
since: 2.0.0
## hash 下键所对应的值加 increment 值
HINCRBY key field increment
summary: Increment the integer value of a hash field by the given number
since: 2.0.0
## hash 下键所对应的值加 increment 值(浮点)HINCRBYFLOAT key field increment
summary: Increment the float value of a hash field by the given amount
since: 2.6.0
## 迭代 hash 下匹配 pattern 的键 count 指定个数 cursor 示意从第几个开始
HSCAN key cursor [MATCH pattern] [COUNT count]
summary: Incrementally iterate hash fields and associated values
since: 2.8.0
利用场景
Hash 的数据类型能够用作点赞,珍藏,阅读数等。比方你有一个帖子,你须要为它统计点赞,珍藏,浏览。如果你应用 string 类型的话 你必定是要设置 3 个 key 别离对应点赞,珍藏,浏览,这样在无形中也节约了存储空间;然而如果你应用 hash 的话 一个 key 就搞定,应用 hset 帖子 id 点赞数 0 珍藏数 0 浏览 0
,当每减少一个变动时 应用HINCRBY key field increment
对 field 进行数值计算就能够解决。
其次就是当你缓存一些数据时,比如说用户如果你应用 string 缓存,那么必然是个 json 对象,当你只须要某个值时你须要把整个对象取出来而后解决,但 hash 就能够间接取出对应的值。
Set
Set 是 String 的无序去重排列,对应的 encoding 是 intset(整数汇合)或 hashtable。intset(整数汇合)当一个汇合只含有整数,并且元素不多时会应用 intset(整数汇合)作为 Set 汇合对象的底层实现。其利用场景包含独特关注,随机事件等。
API
其罕用的命令如下所示:
# 汇合内操作
## 增加元素
SADD key member [member ...]
summary: Add one or more members to a set
since: 1.0.0
## 汇合大小
SCARD key
summary: Get the number of members in a set
since: 1.0.0
## 随机获取汇合内 count 个元素
## count 为正 取出一个去重的后果集
## count 为负 取出一个不去重的后果集
##
SRANDMEMBER key [count]
summary: Get one or multiple random members from a set
since: 1.0.0
## 随机弹出(获取并删除)汇合内 count 个元素
SPOP key [count]
summary: Remove and return one or multiple random members from a set
since: 1.0.0
## 取出所有元素
SMEMBERS key
summary: Get all the members in a set
since: 1.0.0
## 判断 member 是否在汇合中
SISMEMBER key member
summary: Determine if a given value is a member of a set
since: 1.0.0
## 移除元素
SREM key member [member ...]
summary: Remove one or more members from a set
since: 1.0.0
# 汇合间操作
## 汇合间差集
SDIFF key [key ...]
summary: Subtract multiple sets
since: 1.0.0
## 汇合间差集并存储到 destination
SDIFFSTORE destination key [key ...]
summary: Subtract multiple sets and store the resulting set in a key
since: 1.0.0
## 迭代汇合下匹配 pattern 的键 count 指定个数 cursor 示意从第几个开始
SSCAN key cursor [MATCH pattern] [COUNT count]
summary: Incrementally iterate Set elements
since: 2.8.0
## 汇合间交加
SINTER key [key ...]
summary: Intersect multiple sets
since: 1.0.0
## 汇合间交加并存储到 destination
SINTERSTORE destination key [key ...]
summary: Intersect multiple sets and store the resulting set in a key
since: 1.0.0
## 汇合间并集
SUNION key [key ...]
summary: Add multiple sets
since: 1.0.0
## 汇合间并集并存储到 destination
SUNIONSTORE destination key [key ...]
summary: Add multiple sets and store the resulting set in a key
since: 1.0.0
## 把 member 从 source 汇合挪动到 destination 汇合
SMOVE source destination member
summary: Move a member from one set to another
since: 1.0.0
利用场景
Set 的利用场景包含随机事件,公共好友。这其实就对应了 Set 的汇合内命令和汇合间命令。汇合内命令的spop key
和 srandmember key count
就能够应答随机事件,比方抽奖零碎,key 为奖品,member 为用户 id,如果心愿中奖的人不会再中就能够应用spop
,如果心愿反复中奖就能够应用srandmember
;汇合间命令获取交加sinter
就能够应答独特好友,独特关注,key 为用户,member 别离为用户的关注。
Sorted Set
Sorted Set 是在 Set 上增加一个分数(score)维度的汇合,通过分数来为汇合中的元素进行排序。相比于 Set 来说 Sorted Set 可了解为一个有序无反复的序列,其 encoding 为 ziplist 或 skiplist。当一个有序汇合的元素数量比拟多或者成员是比拟长的字符串时,Redis 就应用 skiplist(跳跃表)作为 ZSet 对象的底层实现。其利用场景次要包含排行榜等。
API
常用命令如下:
## 增加汇合元素 NX 不更新 只增加 XX 只更新 不增加 CH 返回值为批改总数(默认是新增总数)INCR 分值增加
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
summary: Add one or more members to a sorted set, or update its score if it already exists
since: 1.2.0
## 删除汇合元素
ZREM key member [member ...]
summary: Remove one or more members from a sorted set
since: 1.2.0
## 指定分数区间删除汇合元素
ZREMRANGEBYSCORE key min max
summary: Remove all members in a sorted set within the given scores
since: 1.2.0
## 指定成员区间删除汇合元素
ZREMRANGEBYLEX key min max
summary: Remove all members in a sorted set between the given lexicographical range
since: 2.8.9
## 指定排名区间删除汇合元素
ZREMRANGEBYRANK key start stop
summary: Remove all members in a sorted set within the given indexes
since: 2.0.0
## 获取汇合元素分数
ZSCORE key member
summary: Get the score associated with the given member in a sorted set
since: 1.2.0
## 减少汇合元素分数
ZINCRBY key increment member
summary: Increment the score of a member in a sorted set
since: 1.2.0
## 返回汇合个数
ZCARD key
summary: Get the number of members in a sorted set
since: 1.2.0
## 返回元素排名 默认升序
ZRANK key member
summary: Determine the index of a member in a sorted set
since: 2.0.0
## 返回元素排名 降序
ZREVRANK key member
summary: Determine the index of a member in a sorted set, with scores ordered from high to low
since: 2.0.0
## 指定元素索引返回汇合值 WITHSCORES 示意是否带分值 升序
ZRANGE key start stop [WITHSCORES]
summary: Return a range of members in a sorted set, by index
since: 1.2.0
## 依据元素分值大小返回汇合值 WITHSCORES 示意是否带分值 LIMIT 指定索引和数量 升序
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
summary: Return a range of members in a sorted set, by score
since: 1.0.5
## 指定元素索引返回汇合值 WITHSCORES 示意是否带分值 降序
ZREVRANGE key start stop [WITHSCORES]
summary: Return a range of members in a sorted set, by index, with scores ordered from high to low
since: 1.2.0
## 指定元素分值大小返回汇合值 WITHSCORES 示意是否带分值 LIMIT 指定索引和数量 降序
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
summary: Return a range of members in a sorted set, by score, with scores ordered from high to low
since: 2.2.0
## 指定元素区间返回汇合值 LIMIT 指定索引和数量 降序
ZREVRANGEBYLEX key max min [LIMIT offset count]
summary: Return a range of members in a sorted set, by lexicographical range, ordered from higher to lower strings.
since: 2.8.9
## 依据分数区间返回汇合元素数量
ZCOUNT key min max
summary: Count the members in a sorted set with scores within the given values
since: 2.0.0
## 返回成员区间返回汇合元素数量
ZLEXCOUNT key min max
summary: Count the number of members in a sorted set between a given lexicographical range
since: 2.8.9
## 返回汇合下成员在 min 到 max 的数量 Limit 指定索引和数量
ZRANGEBYLEX key min max [LIMIT offset count]
summary: Return a range of members in a sorted set, by lexicographical range
since: 2.8.9
## 弹出汇合中分数最低元素
ZPOPMIN key [count]
summary: Remove and return members with the lowest scores in a sorted set
since: 5.0.0
## 弹出汇合中分数最高元素
ZPOPMAX key [count]
summary: Remove and return members with the highest scores in a sorted set
since: 5.0.0
## 汇合间并集 WEIGHTS 应用聚合函数前的乘法因子 AGGREGATE 指定聚合形式
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
summary: Add multiple sorted sets and store the resulting sorted set in a new key
since: 2.0.0
## 汇合间交加 WEIGHTS 应用聚合函数前的乘法因子 AGGREGATE 指定聚合形式
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
summary: Intersect multiple sorted sets and store the resulting sorted set in a new key
since: 2.0.0
## 依照参数中 key 的程序,返回第一个非空 key 中分数最大的成员和对应的分数 timeout 为阻塞工夫 单位秒
BZPOPMAX key [key ...] timeout
summary: Remove and return the member with the highest score from one or more sorted sets, or block until one is available
since: 5.0.0
## 依照参数中 key 的程序,返回第一个非空 key 中分数最小的成员和对应的分数 timeout 为阻塞工夫 单位秒
BZPOPMIN key [key ...] timeout
summary: Remove and return the member with the lowest score from one or more sorted sets, or block until one is available
since: 5.0.0
## 迭代汇合下匹配 pattern 的键 count 指定个数 cursor 示意从第几个开始
ZSCAN key cursor [MATCH pattern] [COUNT count]
summary: Incrementally iterate sorted sets elements and associated scores
since: 2.8.0
利用场景
Sorted Set 最常见的利用场景便是排行榜,应用 zadd key score member
就能够实现主动排序,默认依照从小到大排序,如果你心愿倒序那就应用zrevrangebyscore
依据分数倒序即可,想获取某一个元素的排名应用zrank
,但要记住这仍是正序的, 因为 sorted set 物理内存不随命令变动,想要倒序的排名应用zrevrank
。
参考链接
Redis 源码钻研之 redisObject
总结 redis 中对象的类型与编码
Redis 为何这么快 – 数据存储角度