欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-02 18:13:12
...

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

常用方法:

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

示例
  • 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。

常用命令如下:

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

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

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

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

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

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

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

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

  • getrange、setrange

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

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

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

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

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

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

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

  • 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 …]

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

    注意:如果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

常用方法:

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

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

这里做一下说明:

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

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

rpush 插入1 2 3 4示意图

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

示例

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不允许重复)

常用方法:

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

示例

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是一个键值对

常用方法:

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

示例

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进行排序

常用方法:

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

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

示例

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"