[redis学习笔记]二、Redis入门及五种基本类型的使用
Redis概述和入门
概述
Redis是Remote Dictionary Server(远程字典服务器)的缩写。是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,也被称为数据结构服务器。
Redis与其他key-value缓存产品有以下特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
- Redis支持的数据类型很丰富,不仅仅支持简单的key-value类型的数据,同时还提供list、set、zset、hash等数据结构的存储
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis是以单进程模型来处理客户端请求的。对读写等事件的响应是通过对epoll函数的包装来做到的。Redis的实际处理速度完全依靠主进程的执行效率。
epoll是Linux内核为处理大批量文件描述符而做了改进的epoll,是Linux下多路复用IO接口select/poll的增强。它能显著提高程序在大量并发连接中只有少量活跃情况下的系统cpu的利用率。
Redis基础知识
-
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>
-
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>
-
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>
-
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]>
-
Redis 索引是从0开始的。
-
统一密码管理,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范围进行遍历
min
和 max
可以是 -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"