[redis学习笔记]二、Redis入门及五种基本类型的使用

Redis概述和入门

概述

Redis是Remote Dictionary Server(远程字典服务器)的缩写。是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,也被称为数据结构服务器。

Redis与其他key-value缓存产品有以下特点:

  1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
  2. Redis支持的数据类型很丰富,不仅仅支持简单的key-value类型的数据,同时还提供list、set、zset、hash等数据结构的存储
  3. Redis支持数据的备份,即master-slave模式的数据备份。

Redis是以单进程模型来处理客户端请求的。对读写等事件的响应是通过对epoll函数的包装来做到的。Redis的实际处理速度完全依靠主进程的执行效率。

epoll是Linux内核为处理大批量文件描述符而做了改进的epoll,是Linux下多路复用IO接口select/poll的增强。它能显著提高程序在大量并发连接中只有少量活跃情况下的系统cpu的利用率。

Redis基础知识

  1. Redis默认有16个数据库,初始默认使用0号数据库,可以使用SELECT 命令在连接上指定数据库id来切换数据库。示例中切换到了1号库,随后切回到0号库

    127.0.0.1:6379> select 1
    OK
    127.0.0.1:6379[1]> select 0
    OK
    127.0.0.1:6379>
    
  2. dbsize查看当前数据库的key的数量

    127.0.0.1:6379> set name abc
    OK
    127.0.0.1:6379> set age 123
    OK
    127.0.0.1:6379> DBSIZE
    (integer) 2
    127.0.0.1:6379> keys *
    1) "age"
    2) "name"
    127.0.0.1:6379>
    
  3. flushdb 清空当前库 慎用

    127.0.0.1:6379> set name abc
    OK
    127.0.0.1:6379> set age 123
    OK
    127.0.0.1:6379> DBSIZE
    (integer) 2
    127.0.0.1:6379> keys *
    1) "age"
    2) "name"
    127.0.0.1:6379> FLUSHDB
    OK
    127.0.0.1:6379> keys *
    (empty list or set)
    127.0.0.1:6379> DBSIZE
    (integer) 0
    127.0.0.1:6379>
    
  4. flushall 清空全部库 慎用

    127.0.0.1:6379> set test test
    OK
    127.0.0.1:6379> select 1
    OK
    127.0.0.1:6379[1]> set id 1
    OK
    127.0.0.1:6379[1]> select 2
    OK
    127.0.0.1:6379[2]> set id 2
    OK
    127.0.0.1:6379[2]> FLUSHALL
    OK
    127.0.0.1:6379[2]> DBSIZE
    (integer) 0
    127.0.0.1:6379[2]> select 0
    OK
    127.0.0.1:6379> DBSIZE
    (integer) 0
    127.0.0.1:6379> select 1
    OK
    127.0.0.1:6379[1]> DBSIZE
    (integer) 0
    127.0.0.1:6379[1]>
    
  5. Redis 索引是从0开始的。

  6. 统一密码管理,Redis所有的库使用的密码相同。如查看登录密码

    127.0.0.1:6379> CONFIG GET requirepass
    1) "requirepass"
    2) "123456"
    127.0.0.1:6379>
    

    设置登录密码命令 config set requirepass xxx

    注意:实践结果发现 如果redis.conf中设置了requirepass,而在redis-cli中也使用命令设置了密码requirepass。那么当redis-server重启时,redis.conf中requirepass会覆盖在redis-cli中设置的密码

Redis数据类型

键 key

常用方法:

在这里插入图片描述

示例
  • keys pattern

    127.0.0.1:6379> keys *
    1) "age"
    2) "name"
    127.0.0.1:6379> keys na??
    1) "name"
    127.0.0.1:6379>
    
  • exists key

    127.0.0.1:6379> keys *
    1) "age"
    2) "name"
    127.0.0.1:6379> EXISTS age
    (integer) 1
    127.0.0.1:6379> EXISTS num
    (integer) 0
    127.0.0.1:6379>
    
  • move key db,把当前库的key移到别的库 当前库就没了

    127.0.0.1:6379> keys *
    1) "age"
    2) "name"
    127.0.0.1:6379> move age 1
    (integer) 1
    127.0.0.1:6379> keys *
    1) "name"
    127.0.0.1:6379> select 1
    OK
    127.0.0.1:6379[1]> keys *
    1) "age"
    127.0.0.1:6379[1]> get age
    "20"
    
  • expire key second & ttl key(查看key还有多久过期,-1表示永不过期,-2表示已过期。对于已过期的key会被移除,不再存在

    127.0.0.1:6379> keys *
    (empty list or set)
    127.0.0.1:6379> set name abc
    OK
    127.0.0.1:6379> set age 20
    OK
    127.0.0.1:6379> expire name 5
    (integer) 1
    127.0.0.1:6379> ttl name
    (integer) 2
    127.0.0.1:6379> ttl name
    (integer) -2
    127.0.0.1:6379> get name
    (nil)
    127.0.0.1:6379> ttl age
    (integer) -1
    127.0.0.1:6379> keys *
    1) "age"
    
  • type key 查看key的类型

    127.0.0.1:6379> keys *
    1) "age"
    127.0.0.1:6379> set name abcd
    OK
    127.0.0.1:6379> type age
    string
    127.0.0.1:6379> type name
    string
    

string(字符串) - 单值单value

string是redis最基本的类型,一个key对应一个value。并且是二进制安全的,redis的string可以包含任何数据,如jpg图片或序列化的对象等。一个redis中字符串value最多可以是512M。

常用命令如下:

在这里插入图片描述

在这里插入图片描述

示例
  • set/get/del/append/strlen

    在这里插入图片描述

  • incr/decr(每次加1或减1),incrby/decrby(每次加或减的步幅可以指定),但必须是数字类型的字符串才可使用这些方法

在这里插入图片描述

当incr/decr/incrby/decrby 操作一个不存在的key时,会默认创建一个key,该key初值0,并执行对应逻辑

在这里插入图片描述

  • getrange、setrange

    getrange:获取指定区间范围内的值,类似between…and的关系。从0到-1 表示全部

    setrange:设置指定区间范围内的值,格式为setrange key offset value

在这里插入图片描述

  • setex(set with expire)、setnx(set if not exist)

    setex 设置带过期时间的值,格式:setnx key seconds value

    setnx 只有在 key 不存在时设置 key 的值。格式:setnx key value

在这里插入图片描述

  • mset、mget、msetnx

    mset:同时设置一个或多个 key-value 对。格式:mset key value [key value …]

    mget:获取所有(一个或多个)给定 key 的值。格式: mget key [key …]

    msetnx:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。格式:msetnx key value [key value …]

    在这里插入图片描述

    注意:如果msetnx命令中有key已经存在了,如name,那么即使key=tool不存在,这条命令也会响应失败,即key=tool的也set不了

  • getset

    getset:将给定 key 的值设为 value ,并返回 key 的旧值(old value)。

    127.0.0.1:6379> keys *
    (empty list or set)
    127.0.0.1:6379> set name abcd
    OK
    127.0.0.1:6379> getset name newValue
    "abcd"
    127.0.0.1:6379> get name
    "newValue"
    127.0.0.1:6379>
    

List(列表) - 单值多value

常用方法:

在这里插入图片描述
在这里插入图片描述

注意:list是一个双向链表,因此在头和尾均可插入数据或取数据。也正是如此,所以lpush/rpush、lpop/rpop后元素的顺序可能会有所不同

这里做一下说明:

lpush 插入元素1 2 3 4 示意图

在这里插入图片描述

rpush 插入1 2 3 4示意图

在这里插入图片描述

示例

lpush/rpush/lrange

127.0.0.1:6379> lpush list1 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange list1 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> rpush list2 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> lrange list1 0 2
1) "4"
2) "3"
3) "2"
127.0.0.1:6379>

lpop/rpop 每次从列表的头或尾中获取一个元素,该元素也被列表移除了

127.0.0.1:6379> lpop list1
"4"
127.0.0.1:6379> lpop list1
"3"
127.0.0.1:6379> lrange list1 0 -1
1) "2"
2) "1"
127.0.0.1:6379> rpop list2
"4"
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379>

lindex 按照索引下标获得元素。按照从左到右的顺序

127.0.0.1:6379> lpush list1 1 2 3 4
(integer) 4
127.0.0.1:6379> lindex list1 -1
"1"
127.0.0.1:6379> lindex list1 0
"4"
127.0.0.1:6379> lindex list1 2
"2"
127.0.0.1:6379> rpush list2 1 2 3 4
(integer) 4
127.0.0.1:6379> lindex list2 -1
"4"
127.0.0.1:6379> lindex list2 0
"1"

注意:lpush list1 1 2 3 4 之后的顺序是 4 3 2 1。因此lindex list1 0 是4;同样的,rpush list2 1 2 3 4之后的顺序是 1 2 3 4。因为lindex 按照从左到右的顺序,因此lindex list2 0 是1。

ltrim key start stop 截取指定范围的值后再赋值给当前key

127.0.0.1:6379> lrange list1 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> ltrim list1 0 2
OK
127.0.0.1:6379> lrange list1 0 -1
1) "4"
2) "3"
3) "2"

lrem key count value

从左向右删除n个等于value的元素,返回的值是实际删除的数量。

127.0.0.1:6379> lpush list3 1 1 2 2 3 3 4 4 4
(integer) 9
## 删除2个值为5的元素 但是由于list中不含值为5的元素 因此实际删除0个
127.0.0.1:6379> lrem list3 2 5
(integer) 0
## 删除4个值为4的元素 但是由于list中只含有3个值为4的元素 因此实际删除3个
127.0.0.1:6379> lrem list3 4 4
(integer) 3
127.0.0.1:6379> lrem list3 0 3
(integer) 2
127.0.0.1:6379> lrange list3 0 -1
1) "2"
2) "2"
3) "1"
4) "1"

注意:count为0 表示删除全部值为value的元素

rpoplpush 源列表 目标列表

移除列表的最后一个元素,并将该元素添加到另一个列表并返回

127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> lpush list1 4 5 6
(integer) 3
127.0.0.1:6379> RPOPLPUSH list1 list2
"4"
127.0.0.1:6379> lrange list1 0 -1
1) "6"
2) "5"
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "1"
3) "2"
4) "3"

lset key index value 设置list中指定索引的value值

127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "1"
3) "2"
4) "3"
127.0.0.1:6379> lset list2 0 0
OK
127.0.0.1:6379> lrange list2 0 -1
1) "0"
2) "1"
3) "2"
4) "3"

linsert key BEFORE|AFTER pivot value 在指定值前或后插入指定的值

127.0.0.1:6379> lrange list2 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
127.0.0.1:6379> linsert list2 before 0 -1
(integer) 5
127.0.0.1:6379> lrange list2 0 -1
1) "-1"
2) "0"
3) "1"
4) "2"
5) "3"
127.0.0.1:6379> linsert list2 after 3 4
(integer) 6
127.0.0.1:6379> lrange list2 0 -1
1) "-1"
2) "0"
3) "1"
4) "2"
5) "3"
6) "4"
总结

list是一个字符串链表,left、right都可以插入添加;如果键不存在,创建新的链表;如果键已存在,则新增内容;如果值全移除,对应的键也就消失了。链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就不太高了。

Set - 单值多value(value不允许重复)

常用方法:

在这里插入图片描述

示例

sadd(添加元素)/smembers(遍历元素)/sismember/scard(获取集合里面的元素个数)

## 添加了多个重复的元素,结果只添加到4个 说明元素是不允许重复
127.0.0.1:6379> sadd set1 1 1 2 3 3 4
(integer) 4
127.0.0.1:6379> SMEMBERS set1
1) "1"
2) "2"
3) "3"
4) "4"
## 判断元素1 是否为集合set1的元素
127.0.0.1:6379> SISMEMBER set1 1
(integer) 1
127.0.0.1:6379> SISMEMBER set1 5
(integer) 0
127.0.0.1:6379> scard set1
(integer) 4

srem 删除集合中的元素

格式:srem key member [member …]

## 删除元素1
127.0.0.1:6379> srem set1 1
(integer) 1
## 删除元素4、5,由于元素5不存在 所以只删除了4
127.0.0.1:6379> srem set1 4 5
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "3"

sranmember 从集合中随机取出n个元素

格式:SRANDMEMBER key [count]

如果count超过集合的长度 则元素全部取出,如果count为负数,如-3 表示需要取出3个,但是可能会有重复值

127.0.0.1:6379> SMEMBERS set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
## 随机取出2个元素
127.0.0.1:6379> SRANDMEMBER set1 2
1) "1"
2) "4"
## 随机取出7个元素,超过了集合的长度
127.0.0.1:6379> SRANDMEMBER set1 7
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> SRANDMEMBER set1 -3
1) "6"
2) "4"
3) "2"
## 随机取出2个元素,此时出现重复值
127.0.0.1:6379> SRANDMEMBER set1 -2
1) "4"
2) "4"
127.0.0.1:6379> SRANDMEMBER set1 -4
1) "5"
2) "4"
3) "5"
4) "1"
127.0.0.1:6379>

spop 随机出栈n个元素,集合的长度-n

格式:spop key [count]

127.0.0.1:6379> scard set1
(integer) 6
127.0.0.1:6379> spop set1
"4"
127.0.0.1:6379> scard set1
(integer) 5
127.0.0.1:6379> spop set1  2
1) "3"
2) "5"
127.0.0.1:6379> scard set1
(integer) 3
127.0.0.1:6379> SMEMBERS set1
1) "1"
2) "2"
3) "6"
127.0.0.1:6379>

smove 将key1里的某个值赋值给key2

格式为:smove key1 key2 member;赋值后key1元素减少,key2元素可能增加(因为如果向key2中添加了一个key2中存在的元素,则key2元素不会变)

127.0.0.1:6379> SMEMBERS set1
1) "1"
2) "2"
3) "6"
127.0.0.1:6379> sadd set2 3 4 5
(integer) 3
## 将集合set1中的元素1 赋值给集合set2
127.0.0.1:6379> smove set1 set2 1
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "6"
127.0.0.1:6379> SMEMBERS set2
1) "1"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> smove set1 set2 7
(integer) 0
## 集合set2新增元素2
127.0.0.1:6379> sadd set2 2
(integer) 1
## 将集合set1中的元素2 赋值给集合set2;此时集合set2自身已经存在该元素。操作显示成功
127.0.0.1:6379> smove set1 set2 2
(integer) 1
127.0.0.1:6379> SMEMBERS set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> SMEMBERS set1
1) "6"

sdiff 差集

格式:sdiff key [key …] 表示在第一个set里面而不在后面任何一个set里面的元素,如果只有一个key,那么返回的是这个key中的所有元素

127.0.0.1:6379> SMEMBERS set1
1) "6"
127.0.0.1:6379> SMEMBERS set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
## 求出在集合set1中而不在set2中的元素
127.0.0.1:6379> sdiff set1 set2
1) "6"
## 求出在集合set2中而不在set1中的元素
127.0.0.1:6379> sdiff set2 set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
## 求出在集合set2中而不在set2中的元素
127.0.0.1:6379> sdiff set2 set2
(empty list or set)
127.0.0.1:6379> sdiff set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

sinter交集

格式: sinter key [key …],求集合中的交集。如果只有一个key,那么返回的是这个key中的所有元素

127.0.0.1:6379> SMEMBERS set1
1) "6"
127.0.0.1:6379> SMEMBERS set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
## 如果只有一个key,那么交集是这个key中的所有元素
127.0.0.1:6379> sinter set1
1) "6"
127.0.0.1:6379> sinter set1 set2
(empty list or set)
127.0.0.1:6379> sadd set1 2
(integer) 1
127.0.0.1:6379> sinter set1 set2
1) "2"
127.0.0.1:6379>

sunion 并集

格式:sunion key [key …],求集合中的并集,如果只有一个key,那么返回的是这个key中的所有元素

127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "6"
127.0.0.1:6379> SMEMBERS set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> sunion set1
1) "2"
2) "6"
127.0.0.1:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> sunion set2 set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"

hash

key-value模式不变,但value是一个键值对

常用方法:

在这里插入图片描述

示例

hset/hget/hmset/hmget/hgetall/hdel

hset命令格式:hset key field value

hget命令格式:hget key field

hmset命令格式:HMSET key field value [field value …] 同时将多个key-value设置到hash中

hmget命令格式:HMGET key field [field …] 获取所有给定字段的值

hgetall命令格式:HGETALL key 获取指定key的所有字段的key和value值

hdel命令格式:HDEL key field [field …] 删除一个或多个指定key的字段

## 设置值
127.0.0.1:6379> hset hash1 name wojiushiwo
(integer) 1
127.0.0.1:6379> hset hash1 age 20
(integer) 1
## 获取值
127.0.0.1:6379> hget hash1 name
"wojiushiwo"
127.0.0.1:6379> hget hash1 age
"20"
## 为名称为hash2的hash 同时设置多个值
127.0.0.1:6379> hmset hash2 nickname wojiushiwo age 24 day sunday
OK
127.0.0.1:6379> hmget hash1 name age
1) "wojiushiwo"
2) "20"
## 取出hash2中所有的数据
127.0.0.1:6379> hgetall hash2
1) "nickname"
2) "wojiushiwo"
3) "age"
4) "24"
5) "day"
6) "sunday"
## 获取hash2的长度
127.0.0.1:6379> hlen hash2
(integer) 3
## 删除hash2中名称为day、age的字段
127.0.0.1:6379> hdel hash2 day age
(integer) 2
127.0.0.1:6379> hgetall hash2
1) "nickname"
2) "wojiushiwo"

hkeys、hvals

hkeys 获取某hash中所有字段的键

hvals 获取某hash中所有字段的值

127.0.0.1:6379> HGETALL hash1
1) "name"
2) "wojiushiwo"
3) "age"
4) "20"
127.0.0.1:6379> hkeys hash1
1) "name"
2) "age"
127.0.0.1:6379> HVALS hash1
1) "wojiushiwo"
2) "20"

hexists 判断在指定hash中是否存在某key

命令格式:HEXISTS key field

127.0.0.1:6379> hkeys hash1
1) "name"
2) "age"
127.0.0.1:6379> HVALS hash1
1) "wojiushiwo"
2) "20"
127.0.0.1:6379> HEXISTS hash1 name
(integer) 1
127.0.0.1:6379> HEXISTS hash1 nickname
(integer) 0

hsetnx

命令格式: hsetnx key field value,若某key中不存在当前字段 则赋值,否则不赋值

127.0.0.1:6379> hkeys hash1
1) "name"
2) "age"
127.0.0.1:6379> hsetnx hash1 name zhangsan
(integer) 0
127.0.0.1:6379> hsetnx hash1 nickname zhangsan
(integer) 1
127.0.0.1:6379> hkeys hash1
1) "name"
2) "age"
3) "nickname"

zset - 有序集合

zset是在set基础上,加一个score值。以前set是k1 v2 v2 v3,现在zset是k1 score1 v1 score2 v2 score3 v3;会按照score进行排序

常用方法:

在这里插入图片描述

在这里插入图片描述

示例

zadd 添加元素/zrange 遍历

127.0.0.1:6379> zadd zset1 50 v1 60 v2 70 v3 80 v4
(integer) 4
127.0.0.1:6379> zrange zset1 0 3
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> zrange zset1 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "v1"
2) "50"
3) "v2"
4) "60"
5) "v3"
6) "70"
7) "v4"
8) "80"
127.0.0.1:6379> zrange zset1 0 2 withscores
1) "v1"
2) "50"
3) "v2"
4) "60"
5) "v3"
6) "70"

zrangebyscore

命令格式:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count];按照score范围进行遍历

minmax 可以是 -inf+inf ,这样一来,你就可以在不知道有序集的最低和最高 score 值的情况下,使用 ZRANGEBYSCORE 这类命令。

默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。

127.0.0.1:6379> zadd zset1 50 v1 60 v2 70 v3 80 v4
(integer) 4
## 取score [50-70]之间的元素
127.0.0.1:6379> ZRANGEBYSCORE zset1 50 70
1) "v1"
2) "v2"
3) "v3"
## 取score [50-70]之间的元素 包括score
127.0.0.1:6379> ZRANGEBYSCORE zset1 50 70 withscores
1) "v1"
2) "50"
3) "v2"
4) "60"
5) "v3"
6) "70"
## 取score [50-70)之间的元素+score(包括50 不包括70) 
127.0.0.1:6379> ZRANGEBYSCORE zset1 50 (70 withscores
1) "v1"
2) "50"
3) "v2"
4) "60"
## 取score [50-70)之间的元素(包括50 不包括70) 
127.0.0.1:6379> ZRANGEBYSCORE zset1 50 (70
1) "v1"
2) "v2"
## 取score (50-70)之间的元素+score(不包括50 不包括70) 
127.0.0.1:6379> ZRANGEBYSCORE zset1 (50 (70
1) "v2"
## 取score [50-最大值)]之间的元素
127.0.0.1:6379> ZRANGEBYSCORE zset1 50 +inf
1) "v1"
2) "v2"
3) "v3"
4) "v4"
## 取score [最小值-最大值)]之间的元素+score
127.0.0.1:6379> ZRANGEBYSCORE zset1 -inf +inf withscores
1) "v1"
2) "50"
3) "v2"
4) "60"
5) "v3"
6) "70"
7) "v4"
8) "80"

zrem

命令格式:zrem key member [member …],移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。

key 存在但不是有序集类型时,返回一个错误。

127.0.0.1:6379> zrange zset1 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> zrem zset1 v1 v2
(integer) 2
127.0.0.1:6379> zrange zset1 0 -1
1) "v3"
2) "v4"
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "v3"
2) "70"
3) "v4"
4) "80"

zcard、zcount、zrank、zscore

zcard 命令格式:zcard key。 当 key 存在,返回集合的长度。 当 key 不存在时,返回 0

zcount 命令格式:ZCOUNT key min max 返回集合中,score在[min-max]之间的元素个数

127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "v3"
2) "70"
3) "v4"
4) "80"
127.0.0.1:6379> zcard zset1
(integer) 2
127.0.0.1:6379> zcount zset1 10 60
(integer) 0
127.0.0.1:6379> zcount zset1 10 70
(integer) 1

zrank 命令格式:ZRANK key member,获取元素在有序集合中的下标(下标从0开始)

zscore 命令格式:ZSCORE key member,获取元素的score值,如果元素或key不存在,返回nil

127.0.0.1:6379> zadd zset2 80 v1 50 v2 90 v3 70 v4
(integer) 4
127.0.0.1:6379> zrange zset2 0 -1
1) "v2"
2) "v4"
3) "v1"
4) "v3"
127.0.0.1:6379> zrank zset2 v3
(integer) 3
127.0.0.1:6379> zrank zset2 v5
(nil)
127.0.0.1:6379> zscore zset2 v3
"90"

zrevrank、zrevrange、zrevrangebyscore

zrevrank 按照score值逆序 获取元素的下标,命令格式:ZREVRANK key member

127.0.0.1:6379> zrange zset2 0 -1
1) "v2"
2) "v4"
3) "v1"
4) "v3"
127.0.0.1:6379> ZREVRANK zset2 v2
(integer) 3
127.0.0.1:6379> ZREVRANK zset2 v3
(integer) 0

zrevrange 按照score值逆序遍历,命令格式:ZREVRANGE key start stop [WITHSCORES]

## 正序遍历
127.0.0.1:6379> zrange zset2 0 -1 withscores
1) "v2"
2) "50"
3) "v4"
4) "70"
5) "v1"
6) "80"
7) "v3"
8) "90"
## 逆序遍历
127.0.0.1:6379> ZREVRANGE zset2 0 -1 withscores
1) "v3"
2) "90"
3) "v1"
4) "80"
5) "v4"
6) "70"
7) "v2"
8) "50"

zrevrangebyscore 命令格式:ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count],按照score值逆序遍历

127.0.0.1:6379> zrange zset2 0 -1 withscores
1) "v2"
2) "50"
3) "v4"
4) "70"
5) "v1"
6) "80"
7) "v3"
8) "90"
127.0.0.1:6379> ZREVRANGEBYSCORE zset2 80 70 withscores
1) "v1"
2) "80"
3) "v4"
4) "70"
127.0.0.1:6379> ZREVRANGEBYSCORE zset2 80 (70 withscores
1) "v1"
2) "80"
127.0.0.1:6379> ZREVRANGEBYSCORE zset2 80 -inf withscores
1) "v1"
2) "80"
3) "v4"
4) "70"
5) "v2"
6) "50"
127.0.0.1:6379> ZREVRANGEBYSCORE zset2 +inf -inf withscores
1) "v3"
2) "90"
3) "v1"
4) "80"
5) "v4"
6) "70"
7) "v2"
8) "50"
发布了116 篇原创文章 · 获赞 23 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/zyxwvuuvwxyz/article/details/104163961