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_STRINGREDIS_ENCODING_INT整数值实现的字符串
REDIS_STRINGREDIS_ENCODING_EMBSTRembstr编码的简略动静字符串实现的字符串
REDIS_STRINGREDIS_ENCODING_RAW简略动静字符串实现的字符串
REDIS_LISTREDIS_ENCODING_ZIPLIST压缩列表实现的列表
REDIS_LISTREDIS_ENCODING_LINKEDLIST双向链表实现的列表
REDIS_HASHREDIS_ENCODING_ZIPLIST压缩列表实现的哈希表
REDIS_HASHREDIS_ENCODING_HT字典实现的哈希表
REDIS_SETREDIS_ENCODING_INTSET整数汇合实现的汇合
REDIS_SETREDIS_ENCODING_HT字典实现的汇合
REDIS_ZSETREDIS_ENCODING_ZIPLIST压缩列表实现的有序汇合
REDIS_ZSETREDIS_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 keysince: 1.0.0## set 多个 key valueMSET key value [key value ...]summary: Set multiple keys to multiple valuessince: 1.0.1## 在原value后追加字符串APPEND key valuesummary: Append a value to a keysince: 2.0.0## 在value的某个偏移量上重写新的value值SETRANGE key offset valuesummary: Overwrite part of a string at key starting at the specified offsetsince: 2.2.0## 获取value的值长度STRLEN keysummary: Get the length of the value stored in a keysince: 2.2.0## 获取旧值并设置新值GETSET key valuesummary: Set the string value of a key and return its old valuesince: 1.0.0

数值

当作为数值应用时,其操作都是原子性,故能够作为躲避并发的一种伎俩,其利用场景包含 秒杀、点赞、珍藏,抢购等。

API

作为数值罕用的命令如下:

## value + 1INCR keysummary: Increment the integer value of a key by onesince: 1.0.0## value - 1DECR keysummary: Decrement the integer value of a key by onesince: 1.0.0## value + incrementINCRBY key incrementsummary: Increment the integer value of a key by the given amountsince: 1.0.0## value - incrementDECRBY key decrementsummary: Decrement the integer value of a key by the given numbersince: 1.0.0## value + increment (浮点型)INCRBYFLOAT key incrementsummary: Increment the float value of a key by the given amountsince: 2.6.0

bitmap

bitmap不是理论的数据类型,而是在String类型上定义的一组面向位的操作。依据官网给出的文档提醒,位图最大的劣势就是在存储时能节俭大量空间。其罕用的利用场景包含统计沉闷用户或用户登录天数等。

API

## 统计key从start到end的被设置的为1的bit数  start end 是字节索引BITCOUNT key [start end]summary: Count set bits in a stringsince: 2.6.0## 设置或者清空key的value(字符串)在offset处的bit值 offset 为二进制的索引SETBIT key offset valuesummary: Sets or clears the bit at offset in the string value stored at keysince: 2.2.0## 返回位图中第一个值为 bit(0或1) 的二进制位的地位 start end 是字节索引BITPOS key bit [start] [end]summary: Find first bit set or clear in a stringsince: 2.8.7## 对一个或多个保留二进制位的字符串 key 进行位元操作,并将后果保留到 destkey 上## operation 能够是 AND(并)、OR(或)、NOT(非)、XOR(异或)这四种操作中的任意一种## 当key不同长度 较短的那个key默认以0补位BITOP operation destkey key [key ...]summary: Perform bitwise operations between stringssince: 2.6.0## 参考 http://redis.cn/commands/bitfield.htmlBITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]summary: Perform arbitrary bitfield integer operations on stringssince: 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示意未登录)

用户\天数12345...364365
userId101101...01
userId211011...10
...........................
userId9911110...11

当用户登录应用setbit userId offset(哪一天)1 就能够记录该用户当天登录,而后应用bitcount 即能够得出用户登录天数,或者你须要获取某个工夫周期内的登录天数只有在bitcount加上startend 即可,最最重要的是它占用的空间非常少比起关系型数据库少太多。

其次就是沉闷用户统计,比方你要统计日用户,那么你也能够应用bitmap来做,思路和下面差不多,只不过当初是把日期作为key,用户的id映射为位,即如下表。(1示意沉闷,0示意不沉闷)

日期\用户12345...364365
2020081801101...01
2020081911010...11

当用户沉闷时,应用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 indexsummary: Get an element from a list by its indexsince: 1.0.0## 列表插入某个元素 LINSERT key BEFORE|AFTER pivot valuesummary: Insert an element before or after another element in a listsince: 2.2.0## 获取列表长度LLEN keysummary: Get the length of a listsince: 1.0.0## 从列表左侧弹出(删除并获取)LPOP keysummary: Remove and get the first element in a listsince: 1.0.0## 从列表左侧插入多个元素LPUSH key value [value ...]summary: Prepend one or multiple values to a listsince: 1.0.0## 当列表存在时 插入元素LPUSHX key valuesummary: Prepend a value to a list, only if the list existssince: 2.2.0## 获取列表指定范畴的元素值 start和end为元素索引LRANGE key start stopsummary: Get a range of elements from a listsince: 1.0.0## 移除列表count数量的value元素 (从左开始) count为0示意全删 LREM key count valuesummary: Remove elements from a listsince: 1.0.0## 设置列表index下的值(从左开始)LSET key index valuesummary: Set the value of an element in a list by its indexsince: 1.0.0## 截取列表指定范畴的list start和end为元素索引LTRIM key start stopsummary: Trim a list to the specified rangesince: 1.0.0## 右侧弹出 左侧插入 source 和 destination 都为列表 可为同一个RPOPLPUSH source destinationsummary: Remove the last element in a list, prepend it to another list and return itsince: 1.2.0

以上列举的是从list的左侧开始,同样的redis也提供了从list的右侧开始。redis同样提供了阻塞式的一些命令。如下所示:

## 阻塞获取列表元素并删除(左侧) 可指定多个列表 同时可设置timeout工夫(单位秒)BLPOP key [key ...] timeoutsummary: Remove and get the first element in a list, or block until one is availablesince: 2.0.0## 阻塞获取列表元素并删除(右侧) 可指定多个列表 同时可设置timeout工夫(单位秒)BRPOP key [key ...] timeoutsummary: Remove and get the last element in a list, or block until one is availablesince: 2.0.0## RPOPLPUSH source destination 阻塞版本 timeout工夫(单位秒)BRPOPLPUSH source destination timeoutsummary: Pop a value from a list, push it to another list and return it; or block until one is availablesince: 2.2.0

这里要留神的是当有多个连贯对同一个list进行阻塞监听时,redis的解决办法是保护了一个阻塞队列,提供先阻塞先服务,当多个阻塞同时满足唤醒条件时,先阻塞的优先唤醒。

利用场景

下面咱们说List能够充当栈,队列。栈的特色是先进后出,那么在应用Redis的同一个方向命令(lpush lpop)时就能够实现栈的特点;队列的特色是先进先出,那么同样的在应用Redis的反向命令(lpush rpoprpush lpop )时就能够实现队列的特点。
微博的时间轴列表也比较简单,每次新增一个微博时只须要lpush 进去即可,通过lrange 来获取最新的微博音讯。
阻塞队列的实现就须要应用blpopbrpop ,首先肯定要先调用blpop 监听,而后再另外一个客户端进行lpush 操作,如果先lpushblpop 那么先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 fieldsince: 2.0.0## 设置键值对 不存在才设置HSETNX key field valuesummary: Set the value of a hash field, only if the field does not existsince: 2.0.0## 设置多个键值对 4.0被弃用HMSET key field value [field value ...]summary: Set multiple hash fields to multiple valuessince: 2.0.0## 获取key下某个键对应的值HGET key fieldsummary: Get the value of a hash fieldsince: 2.0.0## 获取key下多个键对应的值HMGET key field [field ...]summary: Get the values of all the given hash fieldssince: 2.0.0## 获取所有key-value键值对HGETALL keysummary: Get all the fields and values in a hashsince: 2.0.0## 获取所有的键HKEYS keysummary: Get all the fields in a hashsince: 2.0.0## 获取所有的值HVALS keysummary: Get all the values in a hashsince: 2.0.0## hash下键所对应的值加 increment值HINCRBY key field incrementsummary: Increment the integer value of a hash field by the given numbersince: 2.0.0## hash下键所对应的值加 increment值(浮点)HINCRBYFLOAT key field incrementsummary: Increment the float value of a hash field by the given amountsince: 2.6.0## 迭代hash下匹配pattern的键 count指定个数 cursor示意从第几个开始HSCAN key cursor [MATCH pattern] [COUNT count] summary: Incrementally iterate hash fields and associated valuessince: 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 setsince: 1.0.0## 汇合大小SCARD keysummary: Get the number of members in a setsince: 1.0.0## 随机获取汇合内count个元素 ## count为正 取出一个去重的后果集## count为负 取出一个不去重的后果集## SRANDMEMBER key [count]summary: Get one or multiple random members from a setsince: 1.0.0## 随机弹出(获取并删除)汇合内count个元素SPOP key [count]summary: Remove and return one or multiple random members from a setsince: 1.0.0## 取出所有元素SMEMBERS keysummary: Get all the members in a setsince: 1.0.0## 判断member是否在汇合中SISMEMBER key membersummary: Determine if a given value is a member of a setsince: 1.0.0## 移除元素SREM key member [member ...]summary: Remove one or more members from a setsince: 1.0.0# 汇合间操作## 汇合间差集SDIFF key [key ...]summary: Subtract multiple setssince: 1.0.0## 汇合间差集并存储到destinationSDIFFSTORE destination key [key ...]summary: Subtract multiple sets and store the resulting set in a keysince: 1.0.0## 迭代汇合下匹配pattern的键 count指定个数 cursor示意从第几个开始SSCAN key cursor [MATCH pattern] [COUNT count]summary: Incrementally iterate Set elementssince: 2.8.0## 汇合间交加SINTER key [key ...]summary: Intersect multiple setssince: 1.0.0## 汇合间交加并存储到destinationSINTERSTORE destination key [key ...]summary: Intersect multiple sets and store the resulting set in a keysince: 1.0.0## 汇合间并集SUNION key [key ...]summary: Add multiple setssince: 1.0.0## 汇合间并集并存储到destinationSUNIONSTORE destination key [key ...]summary: Add multiple sets and store the resulting set in a keysince: 1.0.0## 把member从source汇合挪动到destination汇合SMOVE source destination membersummary: Move a member from one set to anothersince: 1.0.0

利用场景

Set的利用场景包含随机事件,公共好友。这其实就对应了Set的汇合内命令和汇合间命令。汇合内命令的spop keysrandmember 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 existssince: 1.2.0## 删除汇合元素ZREM key member [member ...]summary: Remove one or more members from a sorted setsince: 1.2.0## 指定分数区间删除汇合元素ZREMRANGEBYSCORE key min maxsummary: Remove all members in a sorted set within the given scoressince: 1.2.0## 指定成员区间删除汇合元素 ZREMRANGEBYLEX key min maxsummary: Remove all members in a sorted set between the given lexicographical rangesince: 2.8.9## 指定排名区间删除汇合元素ZREMRANGEBYRANK key start stopsummary: Remove all members in a sorted set within the given indexessince: 2.0.0## 获取汇合元素分数ZSCORE key membersummary: Get the score associated with the given member in a sorted setsince: 1.2.0## 减少汇合元素分数ZINCRBY key increment membersummary: Increment the score of a member in a sorted setsince: 1.2.0## 返回汇合个数ZCARD keysummary: Get the number of members in a sorted setsince: 1.2.0## 返回元素排名 默认升序ZRANK key membersummary: Determine the index of a member in a sorted setsince: 2.0.0## 返回元素排名 降序ZREVRANK key membersummary: Determine the index of a member in a sorted set, with scores ordered from high to lowsince: 2.0.0## 指定元素索引返回汇合值 WITHSCORES示意是否带分值 升序ZRANGE key start stop [WITHSCORES]summary: Return a range of members in a sorted set, by indexsince: 1.2.0## 依据元素分值大小返回汇合值 WITHSCORES示意是否带分值 LIMIT 指定索引和数量 升序ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]summary: Return a range of members in a sorted set, by scoresince: 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 lowsince: 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 lowsince: 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 maxsummary: Count the members in a sorted set with scores within the given valuessince: 2.0.0## 返回成员区间返回汇合元素数量ZLEXCOUNT key min maxsummary: Count the number of members in a sorted set between a given lexicographical rangesince: 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 rangesince: 2.8.9## 弹出汇合中分数最低元素ZPOPMIN key [count]summary: Remove and return members with the lowest scores in a sorted setsince: 5.0.0## 弹出汇合中分数最高元素ZPOPMAX key [count]summary: Remove and return members with the highest scores in a sorted setsince: 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 keysince: 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 keysince: 2.0.0## 依照参数中key的程序,返回第一个非空key中分数最大的成员和对应的分数 timeout为阻塞工夫 单位秒BZPOPMAX key [key ...] timeoutsummary: Remove and return the member with the highest score from one or more sorted sets, or block until one is availablesince: 5.0.0## 依照参数中key的程序,返回第一个非空key中分数最小的成员和对应的分数 timeout为阻塞工夫 单位秒BZPOPMIN key [key ...] timeoutsummary: Remove and return the member with the lowest score from one or more sorted sets, or block until one is availablesince: 5.0.0## 迭代汇合下匹配pattern的键 count指定个数 cursor示意从第几个开始ZSCAN key cursor [MATCH pattern] [COUNT count]summary: Incrementally iterate sorted sets elements and associated scoressince: 2.8.0

利用场景

Sorted Set最常见的利用场景便是排行榜,应用zadd key score member 就能够实现主动排序,默认依照从小到大排序,如果你心愿倒序那就应用zrevrangebyscore 依据分数倒序即可,想获取某一个元素的排名应用zrank ,但要记住这仍是正序的,因为sorted set物理内存不随命令变动,想要倒序的排名应用zrevrank

参考链接

Redis源码钻研之redisObject
总结redis中对象的类型与编码
Redis为何这么快--数据存储角度