最全Redis - 2、5大数据类型_redis -2(1),2024年最新大数据开发基础语言教程

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  1. “v3”
  2. “v2”
  3. “v1”

####  3.2.9、lset:替换指定位置的值



> 
> 将列表 key 下标为 index 的元素的值设置为 value 。  
>  当 index 参数超出范围,或对一个空列表( key 不存在)进行lset时,返回一个错误。  
>  返回值:  
>  操作成功返回 ok ,否则返回错误信息。
> 
> 
> 



lset


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> rpush name tom jack ready #name集合中放入3个元素
(integer) 3
127.0.0.1:6379> lrange name 0 -1 #输出name集合元素

  1. “tom”
  2. “jack”
  3. “ready”
    127.0.0.1:6379> lset name 1 lily #将name集合中第2个元素替换为liy
    OK
    127.0.0.1:6379> lrange name 0 -1 #输出name集合元素
  4. “tom”
  5. “lily”
  6. “ready”
    127.0.0.1:6379> lset name 10 lily #索引超出范围,报错
    (error) ERR index out of range
    127.0.0.1:6379> lset course 1 java #course集合不存在,报错
    (error) ERR no such key

### 3.4、数据结构


List的数据结构为快速链表quickList  
 首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也就是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当就比较多的时候才会改成quickList。  
 因为普通的链表需要的附加指针空间太大,会比较浪费空间,比如这个列表里存储的只是int类型的书,结构上还需要2个额外的指针prev和next。


![](https://img-blog.csdnimg.cn/ca08a3c688d5455dada8a99d2c3d6fd0.png)


 redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用,这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。


## 4、redis集合(Set)


### 4.1、简介


redis set对外提供的功与list类似,是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择。


redis的set是string类型的无序集合,他的底层实际是一个value为null的hash表,收益添加,删除,查找复杂度都是O(1)。


一个算法,如果时间复杂度是O(1),那么随着数据的增加,查找数据的时间不变,也就是不管数据多少,查找时间都是一样的。


### 4.2、常用命令


#### 4.2.1、sadd:添加一个或多个元素



sadd …


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd k1 v1 v2 v1 v3 v2 #k1中放入5个元素,会自动去重,成功插入3个
(integer) 3


#### 4.2.2、smembers:取出所有元素



smembers


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd k1 v1 v2 v1 v3 v2
(integer) 3
127.0.0.1:6379> smembers k1

  1. “v2”
  2. “v1”
  3. “v3”

#### 4.2.3、sismember:判断集合中是否有某个值



> 
> 判断集合key中是否包含元素value,1:有,0:没有
> 
> 
> 



sismember


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd k1 v1 v2 v1 v3 v2 #k1集合中成功放入3个元素[v1,v2,v3]
(integer) 3
127.0.0.1:6379> sismember k1 v1 #判断k1中是否包含v1,1:有
(integer) 1
127.0.0.1:6379> sismember k1 v5 #判断k1中是否包含v5,0:无
(integer) 0


#### 4.2.4、scard:返回集合中元素的个数



> 
> 返回集合 key 的基数(集合中元素的数量)  
>  返回值:  
>  集合的基数。  
>  当 key 不存在时,返回 0 。
> 
> 
> 



scard


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd k1 v1 v2 v1 v3 v2
(integer) 3
127.0.0.1:6379> scard k1
(integer) 3


#### 4.2.5、srem:删除多个元素



> 
> 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。  
>  当 key 不是集合类型,返回一个错误。  
>  返回值:  
>  被成功移除的元素的数量,不包括被忽略的元素。
> 
> 
> 



srem key member [member …]


示例



127.0.0.1:6379> flushdb #清空db,方测试
OK
127.0.0.1:6379> sadd course java c c++ python #集合course中添加4个元素
(integer) 4
127.0.0.1:6379> smembers course #获取course集合所有元素

  1. “python”
  2. “java”
  3. “c++”
  4. “c”
    127.0.0.1:6379> srem course java c #删除course集合中的java和c
    (integer) 2
    127.0.0.1:6379> smembers course #获取course集合所有元素,剩下2个了
  5. “python”
  6. “c++”

#### 4.2.6、spop:随机弹出多个值



> 
> 随机从key集合中弹出count个元素,count默认值为1  
>  返回值:  
>  被移除的随机元素。  
>  当 key 不存在或 key 是空集时,返回 nil
> 
> 
> 



spop


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd course java c c++ python #course集合中添加4个元素
(integer) 4
127.0.0.1:6379> smembers course #获取course集合中所有元素

  1. “python”
  2. “java”
  3. “c++”
  4. “c”
    127.0.0.1:6379> spop course #随机弹出1个元素,被弹出的元素会被删除
    “c++”
    127.0.0.1:6379> spop course 2 #随机弹出2个元素
  5. “java”
  6. “python”
    127.0.0.1:6379> smembers course #输出剩下的元素
  7. “c”

#### 4.2.7、srandmember:随机获取多个元素,不会从集合中删除



> 
> 从key指定的集合中随机返回count个元素,count可以不指定,默认值是1。  
>  srandmember 和 spop的区别:  
>  都可以随机获取多个元素,srandmember 不会删除元素,而spop会删除元素。  
>  返回值:  
>  只提供 key 参数时,返回一个元素;如果集合为空,返回 nil 。  
>  如果提供了 count 参数,那么返回一个数组;如果集合为空,返回空数组。
> 
> 
> 



srandmember


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> sadd course java c c++ python #course中放入5个元素
(integer) 4
127.0.0.1:6379> smembers course #输出course集合中所有元素

  1. “python”
  2. “java”
  3. “c++”
  4. “c”
    127.0.0.1:6379> srandmember course 3 #随机获取3个元素,元素并不会被删除
  5. “python”
  6. “c++”
  7. “c”
    127.0.0.1:6379> smembers course #输出course集合中所有元素,元素个数未变
  8. “python”
  9. “java”
  10. “c++”
  11. “c”

#### 4.2.8、smove:将某个原创从一个集合移动到另一个集合



> 
> 将 member 元素从 source 集合移动到 destination 集合。  
>  smove 是原子性操作。  
>  如果 source 集合不存在或不包含指定的 member 元素,则 smove 命令不执行任何操作,仅返  
>  回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。  
>  当 destination 集合已经包含 member 元素时,smove 命令只是简单地将 source 集合中的  
>  member 元素删除。  
>  当 source 或 destination 不是集合类型时,返回一个错误。 
> 
> 
> 返回值:  
>  如果 member 元素被成功移除,返回 1 。  
>  如果 member 元素不是 source 集合的成员,并且没有任何操作对 destination 集合执行,那  
>  么返回 0 。
> 
> 
> 



smove member


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> sadd course1 java php js #集合course1中放入3个元素[java,php,js]
(integer) 3
127.0.0.1:6379> sadd course2 c c++ #集合course2中放入2个元素[c,c++]
(integer) 2
127.0.0.1:6379> smove course1 course2 js #将course1中的js移动到course2
(integer) 1
127.0.0.1:6379> smembers course1 #输出course1中的元素

  1. “java”
  2. “php”
    127.0.0.1:6379> smembers course2 #输出course2中的元素
  3. “js”
  4. “c++”
  5. “c”

#### 4.2.9、sinter:取多个集合的交集



sinter key [key …]


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd course1 java php js #集合course1:[java,php,js]
(integer) 3
127.0.0.1:6379> sadd course2 c c++ js #集合course2:[c,c++,js]
(integer) 3
127.0.0.1:6379> sadd course3 js html #集合course3:[js,html]
(integer) 2
127.0.0.1:6379> sinter course1 course2 course3 #返回三个集合的交集,只有:[js]

  1. “js”

#### 4.2.10、sinterstore:将多个集合的交集放到一个新的集合中



> 
> 这个命令类似于 sinter 命令,但它将结果保存到 destination 集合,而不是简单地返回结果  
>  集。  
>  返回值:  
>  结果集中的成员数量。
> 
> 
> 



sinterstore destination key [key …]


#### 4.2.11、sunion:取多个集合的并集,自动去重



sunion key [key …]


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd course1 java php js #集合course1:[java,php,js]
(integer) 3
127.0.0.1:6379> sadd course2 c c++ js #集合course2:[c,c++,js]
(integer) 3
127.0.0.1:6379> sadd course3 js html #集合course3:[js,html]
(integer) 2
127.0.0.1:6379> sunion course1 course2 course3 #返回3个集合的并集,会自动去重

  1. “php”
  2. “js”
  3. “java”
  4. “html”
  5. “c++”
  6. “c”

#### 4.2.12、sunionstore:将多个集合的并集放到一个新的集合中



> 
> 这个命令类似于 sunion 命令,但它将结果保存到 destination 集合,而不是简单地返回结果  
>  集。  
>  返回值:  
>  结果集中的成员数量。
> 
> 
> 



sinterstore destination key [key …]


####  4.2.13、sdiff:取多个集合的差集



> 
> 返回一个集合的全部成员,该集合是所有给定集合之间的差集。  
>  不存在的 key 被视为空集。
> 
> 
> 



SDIFF key [key …]


示例



127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd course1 java php js #集合course1:[java,php,js]
(integer) 3
127.0.0.1:6379> sadd course2 c c++ js #集合course2:[c,c++,js]
(integer) 3
127.0.0.1:6379> sadd course3 js html #集合course3:[js,html]
(integer) 2
127.0.0.1:6379> sdiff course1 course2 course3 #返回course1中有的而course2和course3
中都没有的元素

  1. “java”
  2. “php”

####  4.2.14、sdiffstore:将多个集合的差集放到一个新的集合中



> 
> 这个命令类似于 sdiff 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。  
>  返回值:  
>  结果集中的成员数量。
> 
> 
> 



sdiffstore destination key [key …]


### 4.3、数据结构


set数据结构是字典,字典是用hash表实现的。  
 Java中的HashSet的内部实现使用HashMap,只不过所有的value都指向同一个对象。  
 Redis的set结构也是一样的,它的内部也使用hash结构,所有的value都指向同一个内部值。


## 5、redis哈希(Hash)


### 5.1、简介


Redis hash是一个键值对集合。  
 Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。  
 类似于java里面的Map<String,Object>


### 5.2、常用命令


#### 5.2.1、hset:设置多个field的值



> 
> 将哈希表 key 中的域 field 的值设为 value 。  
>  如果 key 不存在,一个新的哈希表被创建并进行 hset 操作。  
>  如果域 field 已经存在于哈希表中,旧值将被覆盖。  
>  返回值:  
>  如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。  
>  如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。
> 
> 
> 



hset key field value [field value …]


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的
值为ready,age的值为30
(integer) 2


#### 5.2.2、hget:获取指定filed的值



hget key field


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的
值为ready,age的值为30
(integer) 2
127.0.0.1:6379> hget user name #获取user中的name
“ready”


#### 5.2.3、hgetall:返回hash表所有的域和值



hgetall key


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的
值为ready,age的值为30
(integer) 2
127.0.0.1:6379> hgetall user #获取user所有信息

  1. “name”
  2. “ready”
  3. “age”
  4. “30”

#### 5.2.4、hmset:和hset类似(已弃用)



hmset key field value [field value …]


#### 5.2.5、hexists:判断给定的field是否存在,1:存在,0:不存在



> 
> 查看哈希表 key 中,给定域 field 是否存在。  
>  返回值:  
>  如果哈希表含有给定域,返回 1 。  
>  如果哈希表不含有给定域,或 key 不存在,返回 0 。
> 
> 
> 



hexists key field


 示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的
值为ready,age的值为30
(integer) 2
127.0.0.1:6379> hexists user name #user中存在name域
(integer) 1
127.0.0.1:6379> hexists user address #user中不存在address域,返回0
(integer) 0
127.0.0.1:6379> hexists user1 address #user1这个key不存在,返回0
(integer) 0


#### 5.2.6、hkeys:列出所有的filed



hkeys key


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的
值为ready,age的值为30
(integer) 2
127.0.0.1:6379> hkeys user #获取user中的所有filed

  1. “name”
  2. “age”

#### 5.2.7、hvals:列出所有的value



hvals key


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的
值为ready,age的值为30
(integer) 2
127.0.0.1:6379> hvals user #获取user中的所有filed的值列表

  1. “ready”
  2. “30”

#### 5.2.8、hlen:返回filed的数量



> 
> 返回哈希表 key 中域的数量。  
>  返回值:
> 
> 
> 哈希表中域的数量。  
>  当 key 不存在时,返回 0 。
> 
> 
> 



HLEN key


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的
值为ready,age的值为30
(integer) 2
127.0.0.1:6379> hlen user
(integer) 2


#### 5.2.9、hincrby:filed的值加上指定的增量



> 
> 为哈希表 key 中的域 field 的值加上增量 increment 。  
>  增量也可以为负数,相当于对给定域进行减法操作。  
>  如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。  
>  如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。  
>  对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。  
>  返回值:  
>  执行 hincrby 命令之后,哈希表 key 中域 field 的值。
> 
> 
> 



hincrby key field increment


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset siteInfo site itsoku.com pv 1000 #hash表siteInfo中有2个域:
{site:“itsoku.com”
,pv:1000}
(integer) 2
127.0.0.1:6379> hget siteInfo pv #获取siteInfo中pv的值
“1000”
127.0.0.1:6379> hincrby siteInfo pv 10 #siteInfo中的pv值增加10
(integer) 1010
127.0.0.1:6379> hget siteInfo pv #获取siteInfo中的pv
“1010”
127.0.0.1:6379> hincrby siteInfo uv 500 #siteInfo中的uv值增加500,uv这个域不存在,则会
先添加,然后再执行hincrby
(integer) 500


#### 5.2.10、hsetnx:当filed不存在的时候,设置filed的值



> 
> 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。  
>  若域 field 已经存在,该操作无效。  
>  如果 key 不存在,一个新哈希表被创建并执行 hsetnx 命令。  
>  返回值:  
>  设置成功,返回 1 。  
>  如果给定域已经存在且没有操作被执行,返回 0 。
> 
> 
> 



hsetnx key field value


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> hset user name ready age 30 #创建user,包含2个域:name、age
(integer) 2
127.0.0.1:6379> hsetnx user name tom #name已存在,设置失败,返回0
(integer) 0
127.0.0.1:6379> hget user name #name依旧是ready
“ready”
127.0.0.1:6379> hsetnx user address shanghai #address不存在,设置成功
(integer) 1
127.0.0.1:6379> hget user address #输出address的值
“shanghai”


### 5.3、数据结构


Hash类型对应的数据结构是2中:ziplist(压缩列表),hashtable(哈希表)。  
 当field-value长度较短个数较少时,使用ziplist,否则使用hashtable。


## 6、redis有序集合zset(sorted set)


### 6.1、简介


redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。


不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。


集合的成员是唯一的,但是评分是可以重复的。


因为元素是有序的,所以你可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。


访问有序集合中的中间元素也是非常快的,因为你能够使用有序集合作为一个没有重复成员你的智能列表。


### 6.2、常用命令


#### 6.2.1、zadd:添加元素



> 
> 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。  
>  如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入  
>  这个 member 元素,来保证该 member 在正确的位置上。  
>  score 值可以是整数值或双精度浮点数。  
>  如果 key 不存在,则创建一个空的有序集并执行 zadd 操作。  
>  当 key 存在但不是有序集类型时,返回一个错误。  
>  返回值:  
>  被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。
> 
> 
> 



zadd …


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> zadd topn 100 java 80 c 90 c++ 50 php 70 js #创建名称为topn的zset,
添加了5个元素
(integer) 5


#### 6.2.2、zrange:score升序,获取指定索引范围的元素



> 
> * 返回存储在有序集合 key 中的指定范围的元素。 返回的元素可以认为是按score从最低到最高排列,如果得分相同,将按字典排序。
> * 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
> * 你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。zrange key 0 -1:可以获取所有元素
> * withscores:让成员和它的 score 值一并返回,返回列表以 value1,score1, ...,valueN,scoreN 的格式表示
> 
> 
> 可用版本:>= 1.2.0  
>  时间复杂度:O(log(N)+M), N 为有序集的基数,而 M 为结果集的基数。  
>  返回值:指定区间内,带有 score 值(可选)的有序集成员的列表。 
> 
> 
> 



zrange key start top [withscores]


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> zadd topn 100 java 80 c 90 c++ 50 php 70 js #创建名称为topn的zset,
添加了5个元素
(integer) 5
127.0.0.1:6379> zrange topn 0 -1 #按score升序,返回topn中所有元素的值

  1. “php”
  2. “js”
  3. “c”
  4. “c++”
  5. “java”
    127.0.0.1:6379> zrange topn 0 -1 withscores #按score升序,返回所有元素的值以及score
  6. “php”
  7. “50”
  8. “js”
  9. “70”
  10. “c”
  11. “80”
  12. “c++”
  13. “90”
  14. “java”
  15. “100”
    127.0.0.1:6379> zrange topn 2 4 #返回索引范围[2,4]内的3个元素
  16. “c”
  17. “c++”
  18. “java”

#### 6.2.3、zrevrange:score降序,获取指定索引范围的元素



> 
> * 返回存储在有序集合 key 中的指定范围的元素。 返回的元素可以认为是按score最高到最低排列, 如果得分相同,将按字典排序。
> * 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
> * withscores:让成员和它的 score 值一并返回,返回列表以 value1,score1, ...,valueN,scoreN 的格式表示
> 
> 
> 



zrevrange key start stop [WITHSCORES]


 示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> zadd topn 100 java 80 c 90 c++ 50 php 70 js #创建名称为topn的zset,
添加了5个元素
(integer) 5
127.0.0.1:6379> zrevrange topn 0 -1 #按照score降序获取所有元素

  1. “java”
  2. “c++”
  3. “c”
  4. “js”
  5. “php”
    127.0.0.1:6379> zrevrange topn 0 2 #按照score降序获取前3名
  6. “java”
  7. “c++”
  8. “c”

#### 6.2.4、zrangebyscore:按照score升序,返回指定score范围内的数据



> 
> * 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。具有相同 score 值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。
> * 可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为O(N) 时间。
> * 可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score值一起返回。
> 
> 
> 



zrangebyscore key min max [WITHSCORES] [LIMIT offset count]


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> zadd topn 100 java 80 c 90 c++ 50 php 70 js #创建名称为topn的zset,
添加了5个元素
(integer) 5
127.0.0.1:6379> zrangebyscore topn 70 90 #score升序,获取score位于[70,90]区间中的元素

  1. “js”
  2. “c”
  3. “c++”
    127.0.0.1:6379> zrangebyscore topn 70 90 withscores #score升序,获取score位于
    [70,90]区间中的元素值及score
  4. “js”
  5. “70”
  6. “c”
  7. “80”
  8. “c++”
  9. “90”
    127.0.0.1:6379> zrangebyscore topn 70 90 withscores limit 1 2 #相当于:select
    value,score from topn集合 where score>=70 and score<=90 order by score asc limit
    1,2
  10. “c”
  11. “80”
  12. “c++”
  13. “90”

#### 6.2.5、zrevrangebyscore:按照score降序,返回指定score范围内的数据



> 
> * 返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。
> * 具有相同 score 值的成员按字典序的逆序排列。
> * 除了成员按 score 值递减的次序排列这一点外, zrevrangebyscore 命令的其他方面和zrangebyscore 命令一样。
> 
> 
> 



zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> zadd topn 100 java 80 c 90 c++ 50 php 70 js #创建名称为topn的zset,
添加了5个元素
(integer) 5
127.0.0.1:6379> zrevrangebyscore topn 100 90 #score降序,获取score位于[70,90]区间中
的元素值

  1. “java”
  2. “c++”
    127.0.0.1:6379> zrevrangebyscore topn 100 90 withscores #score降序,获取score位于
    [70,90]区间中的元素值及score
  3. “java”
  4. “100”
  5. “c++”
  6. “90”

#### 6.2.6、zincrby:为指定元素的score加上指定的增量



> 
> 为有序集 key 的成员 member 的 score 值加上增量 increment 。  
>  可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。  
>  当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于ZADD key increment member 。  
>  当 key 不是有序集类型时,返回一个错误。  
>  score 值可以是整数值或双精度浮点数。
> 
> 
> 



zincrby key increment member


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ #集合topx中添加3个元素:java、c、c++,
对应的score分别是:90、70、80
(integer) 3
127.0.0.1:6379> zrevrange topx 0 -1 withscores #输出集合topx中的元素,包含score

  1. “java”
  2. “90”
  3. “c++”
  4. “80”
  5. “c”
  6. “70”
    127.0.0.1:6379> zincrby topx 5 java #对topx中的元素java的score加5,变成95了
    “95”
    127.0.0.1:6379> zrevrange topx 0 -1 withscores # 输出集合元素,注意java的score是95了
  7. “java”
  8. “95”
  9. “c++”
  10. “80”
  11. “c”
  12. “70”

#### 6.2.7、zrem:删除集合中多个元素



> 
> 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。  
>  当 key 存在但不是有序集类型时,返回一个错误。
> 
> 
> 



zrem key member [member …]


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ #集合topx中添加3个元素:java、c、c++,
对应的score分别是:90、70、80
(integer) 3
127.0.0.1:6379> zrange topx 0 -1 #输出集合topx中所有元素

  1. “c”
  2. “c++”
  3. “java”
    127.0.0.1:6379> zrem topx c c++ #删除集合topx中的2个元素:c、c++
    (integer) 2
    127.0.0.1:6379> zrange topx 0 -1 #输出集合topx中所有元素
  4. “java”

#### 6.2.8、zremrangebyrank:根据索引范围删除元素



> 
> 移除有序集 key 中,指定排名(rank)区间内的所有成员。  
>  区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。  
>  下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。  
>  你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
> 
> 
> 



zremrangebyrank key start stop


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ #集合topx中添加3个元素:java、c、c++,
对应的score分别是:90、70、80
(integer) 3
127.0.0.1:6379> zrange topx 0 -1 #输出集合topx中所有元素

  1. “c”
  2. “c++”
  3. “java”
    127.0.0.1:6379> zremrangebyrank topx 0 1 #删除索引范围[0,1]的数据
    (integer) 2
    127.0.0.1:6379> zrange topx 0 -1 #输出鞂topx中所有元素
  4. “java”

#### 6.2.9、zremrangebyscore:根据score的范围删除元素



> 
> 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员
> 
> 
> 



zremrangebyscore key min max


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ 50 php #topx集合中添加4个元素
(integer) 4
127.0.0.1:6379> zrange topx 0 -1 withscores #输出topx中所有元素值、score

  1. “php”
  2. “50”
  3. “c”
  4. “70”
  5. “c++”
  6. “80”
  7. “java”
  8. “90”
    127.0.0.1:6379> zremrangebyscore topx 70 80 #删除score位于[70,80]区间的元素
    (integer) 2
    127.0.0.1:6379> zrange topx 0 -1 withscores #输出剩下的元素
  9. “php”
  10. “50”
  11. “java”
  12. “90”

#### 6.2.10、zcount:统计指定score范围内元素的个数



> 
> 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量
> 
> 
> 



zcount key min max


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ 50 php #topx集合中添加4个元素
(integer) 4
127.0.0.1:6379> zcount topx 80 100 #统计score位于[80,100]区间中的元素个数
(integer) 2


#### 6.2.11、zrank:按照score升序,返回某个元素在集合中的排名



> 
> 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。  
>  排名以 0 为底,也就是说, score 值最小的成员排名为 0 。
> 
> 
> 



zrank key member


示例



127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ 50 php #topx集合中添加4个元素
(integer) 4
127.0.0.1:6379> zrank topx c #获取元素c的排名,返回1表示排名第2
(integer) 1
127.0.0.1:6379> zrange topx 0 -1 #输出集合中所有元素,看一下c的位置确实是2

  1. “php”
  2. “c”
  3. “c++”
  4. “java”

#### 6.2.12、zrevrank:按照score降序,返回某个元素在集合中的排名




![img](https://img-blog.csdnimg.cn/img_convert/e5b2b4ef43220b9f4442d4a781c2a011.png)
![img](https://img-blog.csdnimg.cn/img_convert/0702a3d01a37b64c0567c9880b4cc599.png)
![img](https://img-blog.csdnimg.cn/img_convert/0e2b6fa06c5a349b34c3a5f5c5dc7fbc.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

.0.0.1:6379> zrange topx 0 -1 withscores #输出剩下的元素
1) "php"
2) "50"
3) "java"
4) "90"

6.2.10、zcount:统计指定score范围内元素的个数

返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量

zcount key min max

示例

127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ 50 php #topx集合中添加4个元素
(integer) 4
127.0.0.1:6379> zcount topx 80 100 #统计score位于[80,100]区间中的元素个数
(integer) 2

6.2.11、zrank:按照score升序,返回某个元素在集合中的排名

返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
排名以 0 为底,也就是说, score 值最小的成员排名为 0 。

zrank key member

示例

127.0.0.1:6379> flushdb #清空db,方便测试
OK
127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ 50 php #topx集合中添加4个元素
(integer) 4
127.0.0.1:6379> zrank topx c #获取元素c的排名,返回1表示排名第2
(integer) 1
127.0.0.1:6379> zrange topx 0 -1 #输出集合中所有元素,看一下c的位置确实是2
1) "php"
2) "c"
3) "c++"
4) "java"

6.2.12、zrevrank:按照score降序,返回某个元素在集合中的排名

[外链图片转存中…(img-Zf2vxAxD-1715797142432)]
[外链图片转存中…(img-7mcf6BoN-1715797142433)]
[外链图片转存中…(img-zpZAjugq-1715797142433)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值