抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Redis常用命令

全局命令

time

一个包含两个字符串的列表: 第一个字符串是当前时间(以 UNIX 时间戳格式表示),而第二个字符串是当前这一秒钟已经逝去的微秒数。

1
2
3
127.0.0.1:6379> time
1) "1561539827"
2) "938527"

dbsize

返回当前数据库的 key 的数量。

1
2
3
4
5
6
127.0.0.1:6379> dbsize
(integer) 3
127.0.0.1:6379> set age 26
OK
127.0.0.1:6379> dbsize
(integer) 4

exists

检查给定key是否存在,若存在返回1,否则返回0

1
2
3
4
5
6
27.0.0.1:6379> exists yhq
(integer) 0
127.0.0.1:6379> set yhq 1
OK
127.0.0.1:6379> exists yhq
(integer) 1

type key

返回键存储值的类型 : none(键不存在) string(字符串或者HyperLogLog) hash(散列)list(列表)set(无序集合)zset(有序集合)

1
2
3
4
5
6
7
8
127.0.0.1:6379> keys *
1) "hkey"
2) "name"
127.0.0.1:6379> type name
string
127.0.0.1:6379> type hkey
hash
127.0.0.1:6379>

select

切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。默认使用 0 号数据库。默认16个数据库,数据库之间互不相通。

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> dbsize
(integer) 4
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> dbsize
(integer) 0
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> dbsize
(integer) 4

MOVE key db

将当前数据库的 key 移动到给定的数据库 db 当中。如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。移动成功返回 1 ,失败则返回 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> set yhq qhh
OK
127.0.0.1:6379> move yhq 1
(integer) 1
127.0.0.1:6379> exists yhq
(integer) 0
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> exists yhq
(integer) 1
127.0.0.1:6379[1]> exists qhh
(integer) 0
127.0.0.1:6379[1]> move qhh 0
(integer) 0

flushdb

清空当前数据库

1
2
3
4
5
6
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> dbsize
(integer) 0

flushall

清空所有库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.0.0.1:6379> set yhq 1
OK
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> set yhq 2
OK
127.0.0.1:6379[1]> flushall
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
(empty list or set)

注: 如果不小心运行了flushall, 立即 shutdown nosave ,关闭服务器

然后 手工编辑aof文件, 去掉文件中的 “flushall ”相关行, 然后开启服务器,就可以导入回原来数据.

如果,flushall之后,系统恰好bgrewriteaof了,那么aof就清空了,数据丢失.

SHUTDOWN [NOSAVE] [SAVE]

这个命令执行如下操作:

  • 停止所有客户端.
  • 如果配置了save 策略 则执行一个阻塞的save命令.
  • 如果开启了AOF,则刷新aof文件
  • 关闭redis服务进程(redis-server).

​ 如果配置了持久化策略,那么这个命令将能够保证在关闭redis服务进程的时候数据不会丢失. 如果仅仅在客户端执行SAVE 命令,然后 执行QUIT 命令,那么数据的完整性将不会被保证,因为其他客户端可能在执行这两个命令的期间修改数据库的数据。

注意: 一个没有配置持久化策略的redis实例 (没有aof配置, 没有 “save” 命令) 将不会 在执行SHUTDOWN命令的时候转存一个rdb文件, 通常情况下你不想让一个仅用于缓存的rendis实例宕掉

SAVE 和 NOSAVE 修饰符

通过指定一个可选的修饰符可以改变这个命令的表现形式 比如:

  • SHUTDOWN SAVE能够在即使没有配置持久化的情况下强制数据库存储.
  • SHUTDOWN NOSAVE 能够在配置一个或者多个持久化策略的情况下阻止数据库存储. (你可以假想它为一个中断服务的 ABORT 命令).

返回值 : 当发生错误的时候返回状态码 . 当成功的时候不返回任何值,服务退出,链接关闭.

keys pattern

获得符合规则的键名列表

? 匹配一个字符

  • 匹配任意个(包括0个)字符

[]匹配括号间的任一字符,可以使用”-“符号表示一个范围,如a[b-d]可以匹配”ab”,”ac”,”ad”

\x匹配字符x,用于转义符号,例如?

1
2
> keys yh?
1) "yhq"

*配任意个(包括0个)字符

1
2
3
> keys yh*
1) "yhqqhh"
2) "yhq"

[] 匹配括号间的任一字符,可以用 - 表示一个范围

1
2
> keys y[h-z]q
1) "yhq"

\x 匹配字符x,用于转义符号,如匹配?就需要?

1
2
3
4
5
> keys qh?
1) "qhh"
2) "qh?"
> keys qh\?
1) "qh?"

rename

成功返回ok,失败返回错误(当旧名称和新名称相同,或者旧名称不存在时,返回一个错误。当新名称已存在时,将覆盖旧值)

1
2
3
4
5
6
7
8
> get qhh
"132"
> rename qhh yhq
OK
> get yhq
"132"
> rename yh yhq
(error) ERR no such key

renamenx

修改名称,和renamenx不同的是,修改成功返回1,如果新名称存在返回0

1
2
3
4
> renamenx yhq qhh
(integer) 0
> renamenx yhq qhhyhq
(integer) 1

randomkey

当数据库不为空时,随机返回key,当数据库为空时,返回nil

1
2
3
4
> randomkey
"qhhyhq"
> randomkey
"qhh"

del

删除键,可以删除多个键,返回值是删除键的个数

1
2
3
4
> del yhq
1
> del yhq
0

返回当前数据库的 key 的数量。

字符串指令Stirng

简介

​ 字符串类型: 实际上可以是字符串(包括 XML JSON) , 还有数字(整形 浮点数),二进制(图片 音频 视频),最大不能超过 512MB

使用场景

页面动态缓存

​ 比如生成一个动态页面,首次可以将后台数据生成页面,并且存储到redis 字符串中。再次访问,不再进行数据库请求,直接从redis中读取该页面。特点是:首次访问比较慢,后续访问快速。

数据缓存

​ 在前后分离式开发中,有些数据虽然存储在数据库,但是更改特别少。比如有个全国地区表。当前端发起请求后,后台如果每次都从关系型数据库读取,会影响网站整体性能。
我们可以在第一次访问的时候,将所有地区信息存储到redis字符串中,再次请求,直接从数据库中读取地区的json字符串,返回给前端

数据统计

​ redis整型可以用来记录网站访问量,某个文件的下载量。(自增自减)

时间内限制请求次数

​ 比如已登录用户请求短信验证码,验证码在5分钟内有效的场景。
​ 当用户首次请求了短信接口,将用户id存储到redis 已经发送短信的字符串中,并且设置过期时间为5分钟。当该用户再次请求短信接口,发现已经存在该用户发送短信记录,则不再发送短信。

分布式session

​ 当我们用nginx做负载均衡的时候,如果我们每个从服务器上都各自存储自己的session,那么当切换了服务器后,session信息会由于不共享而会丢失,我们不得不考虑第三应用来存储session。通过我们用关系型数据库或者redis等非关系型数据库。关系型数据库存储和读取性能远远无法跟redis等非关系型数据库。

​ 缓存,计数器,微博数,粉丝数,分布式锁

set指令

设置给定key的值,如果已存在覆盖,无视类型.set命令执行后,之前设置的过期时间失效.正常返回ok,如果加了nx或者xx,没有设置条件,返回nil

setxx

指定key存在,为key设置给定的值(成功1,失败0)

1
2
3
4
5
6
7
8
127.0.0.1:6379> set yhq qhh xx
(nil)
127.0.0.1:6379> set yhq qhh
OK
127.0.0.1:6379> set yhq qhh1 xx
OK
127.0.0.1:6379> get yhq
"qhh1"
setnx

指定的key不存在时,为key设置给定的值(成功1失败0)

1
2
3
4
> setnx yhq 123
(integer) 1
> setnx yhq 123
(integer) 0
ex

设置key的过期时间,单位秒

1
2
3
4
5
6
> set yhq qhh ex 10
OK
> get yhq
"qhh"
> get yhq # 超时
(nil)
setex

设置key的过期时间,如果值存在覆盖

1
2
3
4
5
6
7
8
9
10
> setex yhq 20 qhh
OK
> get yhq
"qhh"
> setex yhq 10 qqqq
OK
> get yhq
"qqqq"
> get yhq #超时
(nil)
expire

设置key的过期时间,成功返回1,失败或者key不存在返回0

1
2
3
4
5
6
7
8
> expire yhq 10
(integer) 0
> set yhq qhh
OK
> expire yhq 5
(integer) 1
> get yhq # 超时
(nil)
px

设置key的过期时间,单位毫秒

1
2
3
4
5
6
> set yhq qhh px 10000
OK
> get yhq
"qhh"
> get yhq #超时
(nil)
psetex

设置key的过期时间,单位毫秒

1
2
3
4
5
6
> psetex yhq 10000 qhh
OK
> get yhq
"qhh"
> get yhq #超时
(nil)
pexpire

设置key的过期时间,单位毫秒,成功返回1,失败或者不存在返回0

1
2
3
4
5
6
7
8
> pexpire yhq 10000
(integer) 0
> set yhq qhh
OK
> pexpire yhq 10000
(integer) 1
> get yhq
(nil)

ttl

以秒为单位返回key的剩余获取时间,当key不存在时返回-2,当key没有过期时间时返回-1

1
2
3
4
5
6
7
8
9
10
> set yhq 123
OK
> ttl yhq
(integer) -1
> expire yhq 10
(integer) 1
> ttl yhq
(integer) 7
> ttl yhq
(integer) -2

pttl

以毫秒为单位返回key的剩余获取时间,当key不存在时返回-2,当key没有过期时间时返回-1

1
2
3
4
5
6
7
8
> set yhq 123
OK
> pexpire yhq 10086
(integer) 1
> pttl yhq
(integer) 3263
> pttl yhq
(integer) -2

persist

移除给定key的过期时间,使其永不过期(成功移除返回1,key不存在或者没有过期时间返回0)

1
2
3
4
5
6
7
8
> expire qhhyhq 100
(integer) 1
> ttl qhhyhq
(integer) 96
> persist qhhyhq
(integer) 1
> ttl qhhyhq
(integer) -1

dump

序列化给定key,返回被序列化的值,使用restore反序列化,key不存在返回nil

  • 它带有64位的校验和,用于检测错误,restore在进行反序列化之前会先检查校验和
  • 值的编码和RDB文件保持一致
  • RDB版本会被编码在序列化值中,如果因为redis版本不用造成RDB格式不兼容,nameredis会拒绝对这个值进行反序列化操作
1
2
3
4
5
6
> dump yhq
(nil)
> set yhq qhh
OK
> dump yhq
"\x00\x03qhh\x06\x00\xa1\xc2\xcd\\\xe2\x96\xbd\xe3"

restore

反序列化给定的序列化值,并将它和给定的key关联,参数ttl以毫秒为单位为key设置生存时间,如果ttl为0,那么不设置生存时间(restore在执行反序列化之前会先对序列化值的RDB版和数据进行检查,如果RDB版本不完整的话,那么restore会拒绝进行反序列化,并返回一个错误)

1
2
3
4
> restore yhq-msg 0 "\x00\x03qhh\x06\x00\xa1\xc2\xcd\\\xe2\x96\xbd\xe3"
OK
> get yhq-msg
"qhh"

strlen

获取key的长度(key不存在返回0,key不是字符串类型返回一个错误)

1
2
3
4
> strlen yhq
(integer) 3
> strlen yhqqhh
(integer) 0

setrange

用给定的字符串覆盖key,从offset开始

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> setrange yhq 6 qhh
(integer) 9
> get yhq
"012345qhh"

> get yhq
"012345"
> setrange yhq 7 qhh
(integer) 10
> get yhq
"012345\x00qhh"
> set yhq 012345
OK
> get yhq
"012345"
> setrange yhq 2 yhqqhhhhh
(integer) 11
> get yhq
"01yhqqhhhhh"

getset

设置给定key的值,并返回key的旧值(没有旧值返回nil,当key存在但不是一个字符串类型时,返回一个错误)

1
2
3
4
5
6
> get yhq
"6"
> getset yhq 666
"6"
> get yhq
"666"

mset

设置一个或者多个键值对

1
2
> mset yhq 123 qhh 321
OK

mget

获取一个或者多个键值对(如果某个key不存在,返回nil)

1
2
3
4
> mget yhq qhh yhqqhh
1) "123"
2) "321"
3) (nil)

getrange

获取key的子字符串

1
2
3
4
5
6
> get yhq
"123"
> getrange yhq 0 1
"12"
> getrange yhq 0 -1
"123"

msetnx

设置多个key,当所有key设置成功(不存在)返回1,如果失败(至少有一个存在)返回0

1
2
3
4
> msetnx q 132 y 123
(integer) 1
> msetnx q 132 yhq 123
(integer) 0

append

给定key追加val,如果不存在则set,返回val的长度

1
2
3
4
5
6
7
8
> append yhq 123
(integer) 3
> get yhq
"123"
> append yhq '-666'
(integer) 7
> get yhq
"123-666"

incr

给定key数值+1,如果key不存在,先set key 0再+1

1
2
3
4
> incr yhq
(integer) 1
> incr qhh
(error) ERR value is not an integer or out of range

decr

给定key数值-1,如果key不存在,先set key 0再-1

1
2
3
4
> decr yhq
(integer) -1
> decr qhh
(error) ERR value is not an integer or out of range

incrby / decrby

增加/减少给定值

1
2
3
4
5
6
> get yhq 
"-1"
> incrby yhq 666
(integer) 665
> decrby yhq 555
(integer) 110

incrbyfloat

增加给定浮点值

1
2
3
4
> get yhq
"110"
> incrbyfloat yhq 6.6
"116.6"

位操作

一个字节由8个二进制位组成

bar 在ASCII码中分别是 01100010 , 01100001 , 01110010

1
2
3
4
> set yhq bar
OK
> get yhq
"bar"
getbit

获取字符串指定二进制位的值,索引从0开始,超出索引默认为0

1
2
3
4
> getbit yhq 6
(integer) 1
> getbit yhq 600
(integer) 0

将a转换为A A在ASCII码中是 65 0100 0001

setbit

设置字符串指定二进制位的值,返回值是该位置旧的值,索引从0开始,超出长度,自动将中间的二进制设置为0,不存在的键会将其前面的赋值0

1
2
3
4
> setbit yhq 10 0
(integer) 1
> get yhq
"bAr"

01100010 , 01000001 , 01110010

bitcount

统计二进制位是1的个数,可以指定范围(bA 0-1),不存在返回0

1
2
3
4
 bitcount yhq
(integer) 9
> bitcount yhq 0 1
(integer) 5

Hash(哈希)

简介

Hash是一个String类型的field和value之间的映射表,即redis的hash数据类型key(hash表名称)对应的value实际的内部存储结构为一个HashMap,因此Hash特别适合存储对象。相当于把一个对象的每个属相存储为String类型,将整个对象存储在hash类型中会占用更少内存。

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

使用场景

存储部分变更的数据,如用户信息等,存储表结构信息等。

hset

新建一个哈希表,设置成功返回1,如果已存在覆盖旧值,返回0(值可以为’’”)

1
2
3
4
27.0.0.1:6379> hset yhq name yhq
(integer) 1
127.0.0.1:6379> hset yhq name qhh
(integer) 0

hmset

新建一个哈希表,设置多个k-v,如果已存在会覆盖,成功返回ok(值可以为’’”)

1
2
127.0.0.1:6379> hmsetqhh name yhq age 24 sex 0
OK

hsetnx

当哈希表不存在时创建并设置且成功返回1,如果已存在无效,返回0

1
2
3
4
127.0.0.1:6379> hsetnx yhqqhh name qhh
(integer) 1
127.0.0.1:6379> hsetnx yhqqhh name yhq
(integer) 0

hstrlen

获取指定字段值的长度

1
2
3
4
5
6
7
8
127.0.0.1:6379> hmset myhash f1 HelloWorld f2 99 f3 -256
OK
127.0.0.1:6379> hstrlen myhash f1
(integer) 10
127.0.0.1:6379> hstrlen myhash f2
(integer) 2
127.0.0.1:6379> hstrlen myhash f3
(integer) 4

hget

获取哈希表字段的值,不存在返回nil

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> hget yhq name
"qhh"
127.0.0.1:6379> hget qhh name
"yhq"
127.0.0.1:6379> hget qhh age
"24"
127.0.0.1:6379> hget qhh sex
"0"
127.0.0.1:6379> hget yhq id
(nil)

hgetall

获取哈希表所有k-v,不存在返回空列表

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> hgetall qhh
1) "name"
2) "yhq"
3) "age"
4) "24"
5) "sex"
6) "0"
127.0.0.1:6379> hgetall q
(empty list or set)

hmget

获取一个或多个给定的值,不存在返回nil

1
2
3
4
127.0.0.1:6379> hmget qhh name age a
1) "yhq"
2) "24"
3) (nil)

hdel

删除一个或者多个哈希表字段,不存在忽略,返回删除字段的个数

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> hgetall qhh
1) "name"
2) "1"
3) "age"
4) "2"
127.0.0.1:6379> hdel qhh age a
(integer) 1
127.0.0.1:6379> hgetall qhh
1) "name"
2) "1"

hexists

查询哈希表字段是否存在,存在返回1,不存在返回0

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> hgetall must
1) "name"
2) ""
3) "age"
4) "1"
127.0.0.1:6379> hexists must name
(integer) 1
127.0.0.1:6379> hexists must na
(integer) 0

hkeys

返回哈希表所有的k,key不存在返回空列表

1
2
3
4
5
127.0.0.1:6379> hkeys must
1) "name"
2) "age"
127.0.0.1:6379> hkeys must1
(empty list or set)

hvals

返回哈希表所有k值,key不存在返回空列表

1
2
3
4
5
127.0.0.1:6379> hvals must
1) ""
2) "1"
127.0.0.1:6379> hvals must1
(empty list or set)

hlen

返回哈希表字段数量,key不存在返回0

1
2
127.0.0.1:6379> hlen must
(integer) 2

hincrby

对哈希表字段进行数值增删修改,字段串返回错误,如果不存在则执行创建操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> hincrby yhq name 100
(integer) 100
127.0.0.1:6379> hgetall yhq
1) "name"
2) "100"
127.0.0.1:6379> hset yhq sex n
(integer) 1
127.0.0.1:6379> hincrby yhq sex 100
(error) ERR hash value is not an integer
127.0.0.1:6379> hincrby yhq name -100
(integer) 0
127.0.0.1:6379> hgetall yhq
1) "name"
2) "0"
3) "sex"
4) "n"

hincrbyfloat

对哈希表字段进行数值增删浮点值修改,字段串返回错误,如果不存在则执行创建操作

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> hincrbyfloat yhq size 1.1
"1.1"
127.0.0.1:6379> hincrbyfloat yhq name yhq
(error) ERR value is not a valid float
127.0.0.1:6379> hincrbyfloat yhq size -11.11
"-10.01"
127.0.0.1:6379> hgetall yhq
1) "size"
2) "-10.01"

List(列表)

简介

​ Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

​ 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)

使用场景

消息队列,时间轴

lpush

将一个或多个值插入列表头部,如果key是其他类型报错,成功返回列表数量,如果key不存在,先创建一个空列表

1
2
3
4
5
6
127.0.0.1:6379> set yhq 123
OK
127.0.0.1:6379> lpush yhq name age sex
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> lpush qhh name age sex
(integer) 3

lrange

获取指定范围的值,0开始-1结束(start超出返回空列表,包含end,end超出返回所有)

1
2
3
4
127.0.0.1:6379> lrange qhh 0 -1
1) "sex"
2) "age"
3) "name"

lpushx

插入已存在的列表头部,不存在时无效返回0,成功返回列表长度

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> lpushx yhqqhh id
(integer) 0
127.0.0.1:6379> lpushx qhh id
(integer) 4
127.0.0.1:6379> lrange qhh 0 -1
1) "id"
2) "sex"
3) "age"
4) "name"

rpush

将一个或多个值插入列表尾部,如果key是其他类型报错,成功返回列表数量

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> rpush qhh class curr
(integer) 6
127.0.0.1:6379> lrange qhh 0 -1
1) "id"
2) "sex"
3) "age"
4) "name"
5) "class"
6) "curr"

rpushx

插入已存在的列表尾部,不存在时无效返回0,成功返回列表长度

1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> rpushx q course
(integer) 0
127.0.0.1:6379> rpushx qhh course
(integer) 7
127.0.0.1:6379> lrange qhh 0 -1
1) "id"
2) "sex"
3) "age"
4) "name"
5) "class"
6) "curr"
7) "course"

llen

返回列表长度,不存在返回0,不是列表类型报错

1
2
3
4
5
6
127.0.0.1:6379> llen yhq
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> llen qh
(integer) 0
127.0.0.1:6379> llen qhh
(integer) 7

lpop

移除列表中第一个元素并返回,key不存在返回nil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> lrange qhh 0 -1
1) "id"
2) "sex"
3) "age"
4) "name"
5) "class"
6) "curr"
7) "course"
127.0.0.1:6379> lpop qhh
"id"
127.0.0.1:6379> lrange qhh 0 -1
1) "sex"
2) "age"
3) "name"
4) "class"
5) "curr"
6) "course"

rpop

移除列表最后一个元素并返回,key不存在返回nil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> lrange qhh 0 -1
1) "sex"
2) "age"
3) "name"
4) "class"
5) "curr"
6) "course"
127.0.0.1:6379> rpop qhh
"course"
127.0.0.1:6379> lrange qhh 0 -1
1) "sex"
2) "age"
3) "name"
4) "class"
5) "curr"

rpoplpush

移除列表最后一个元素,插入到另一个列表头部,返回移除的元素(如果第一个列表为空,返回nil,不执行操作)

1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> lrange qhh 0 -1
1) "sex"
2) "age"
3) "name"
4) "class"
5) "curr"
127.0.0.1:6379> lrange yhqqhh 0 -1
1) "name"
127.0.0.1:6379> rpoplpush qhh yhqqhh
"curr"
127.0.0.1:6379> lrange yhqqhh 0 -1
1) "curr"
2) "name"

lrem

根据count的值,移除列表中与val相等的值(count>0,从头部开始,移除count个和val相等的值,<0从尾部移除count个,=0全部),返回被移除的数量,列表不存在返回0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
127.0.0.1:6379> lrange qhh 0 -1
1) "age"
2) "name"
3) "name"
4) "name"
5) "name"
6) "sex"
7) "age"
8) "name"
9) "class"
127.0.0.1:6379> lrem qhh 3 name
(integer) 3
127.0.0.1:6379> lrange qhh 0 -1
1) "age"
2) "name"
3) "sex"
4) "age"
5) "name"
6) "class"

ltrim

保留区间内的元素,0开始-1结束(超过范围的下标并不会产生错误:如果 start 超过列表尾部,或者 start > end,结果会是列表变成空表(即该 key 会被移除)。 如果 end 超过列表尾部,Redis 会将其当作列表的最后一个元素。)

1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> lrange qhh 0 -1
1) "age"
2) "name"
3) "sex"
4) "age"
5) "name"
6) "class"
127.0.0.1:6379> ltrim qhh 0 2
OK
127.0.0.1:6379> lrange qhh 0 -1
1) "age"
2) "name"
3) "sex"

lindex

返回索引的值0开始 -1结束(不是列表返回错误,超出长度返回nil)

1
2
3
4
5
6
127.0.0.1:6379> lrange qhh 0 -1
1) "age"
2) "name"
3) "sex"
127.0.0.1:6379> lindex qhh -2
"name"

linsert

在列表某个元素(before/after)插入val,成功返回列表长度,key没有或者列表不存在返回0,元素不存在返回-1,找到一个元素就ok,不会插入多个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
127.0.0.1:6379> lrange qhh 0 -1
1) "age"
2) "name"
3) "hellow"
4) "sex"
127.0.0.1:6379> lpush qhh name
(integer) 5
127.0.0.1:6379> lrange qhh 0 -1
1) "name"
2) "age"
3) "name"
4) "hellow"
5) "sex"
127.0.0.1:6379> linsert qhh after name word
(integer) 6
127.0.0.1:6379> lrange qhh 0 -1
1) "name"
2) "word"
3) "age"
4) "name"
5) "hellow"
6) "sex"
127.0.0.1:6379> linsert qh after name 123
(integer) 0
127.0.0.1:6379> linsert qhh after name1 123
(integer) -1

lset

通过索引修改val,成功返回ok,超出索引范围或者空列表返回错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
127.0.0.1:6379> lrange qhh 0 -1
1) "name"
2) "word"
3) "age"
4) "name"
5) "hellow"
6) "sex"
127.0.0.1:6379> lset qhh 0 666
OK
127.0.0.1:6379> lset qhh 10 666
(error) ERR index out of range
127.0.0.1:6379> lrange qhh 0 -1
1) "666"
2) "word"
3) "age"
4) "name"
5) "hellow"
6) "sex"

blpop/brpop

移除列表第一个/最后一个元素,如果阻塞(没有元素)等待time秒后返回nil,成功返回两个元素,一个key,一个移除元素(先到先得原则)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
127.0.0.1:6379> lrange qhh 0 -1
1) "666"
2) "word"
3) "age"
4) "name"
5) "hellow"
6) "sex"
127.0.0.1:6379> blpop qhh 10
1) "qhh"
2) "666"
127.0.0.1:6379> blpop list 10
(nil)
(10.02s)
127.0.0.1:6379> lrange qhh 0 -1
1) "word"
2) "age"
3) "name"
4) "hellow"
5) "sex"

brpoplpush

从一个列表移到另一个列表,没有等待time秒

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> brpoplpush qhh list 3
"sex"
127.0.0.1:6379> lrange qhh 0 -1
1) "word"
2) "age"
3) "name"
4) "hellow"
127.0.0.1:6379> lrange list 0 -1
1) "sex"

Set(集合)

简介

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)

集合的性质: 唯一性,无序性,确定性

注: 在string和link的命令中,可以通过range 来访问string中的某几个字符或某几个元素

但是,因为集合的无序性,无法通过下标或范围来访问部分元素。因此想看元素,要么随机先一个,要么全选

使用场景

抽奖,点赞,标签,互相关注,好友推荐

sadd

添加一个或者多个元素到集合中,成功返回新添加到集合的元素数量,已存在的会被忽略,不是集合类型返回错误

1
2
3
4
127.0.0.1:6379> sadd yhq name age sex name
(integer) 3
127.0.0.1:6379> sadd yhq id
(integer) 1

smembers

返回集合所有元素 (sinter 单个集合)

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> smembers yhq
1) "id"
2) "age"
3) "sex"
4) "name"
127.0.0.1:6379> sinter yhq
1) "id"
2) "age"
3) "sex"
4) "name"

scard

返回集合元素数量,不存在返回0

1
2
127.0.0.1:6379> scard yhq
(integer) 4

sdiff

返回多个集合的差集,差集结果基于前面的集合

1
2
3
4
5
6
7
8
9
10
11
127.0.0.1:6379> smembers yhq
1) "id"
2) "age"
3) "sex"
4) "name"
127.0.0.1:6379> smembers qhh
1) "id"
2) "name"
127.0.0.1:6379> sdiff yhq qhh
1) "age"
2) "sex"

sdiffstore

将差集(差集结果基于前面的集合)存到指定集合,如果存在覆盖,返回集合元素个数

1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> smembers yhq
1) "id"
2) "age"
3) "sex"
4) "name"
127.0.0.1:6379> smembers qhh
1) "id"
2) "name"
127.0.0.1:6379> sdiffstore diffs yhq qhh
(integer) 2
127.0.0.1:6379> smembers diffs
1) "age"
2) "sex"

sinter

返回指定集合的交集,不存在集合视为空集合,当有空集合时,结果也为空集(key不存在视为空,一个空全是空)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> smembers yhq
1) "id"
2) "age"
3) "sex"
4) "name"
127.0.0.1:6379> smembers qhh
1) "id"
2) "name"
127.0.0.1:6379> smembers yhqqhh
1) "age"
2) "id"
3) "name"
127.0.0.1:6379> sinter yhq qhh yhqqhh
1) "id"
2) "name"
127.0.0.1:6379> sinter yhq qhh yhqqhh a
(empty list or set)

sinterstore

将交集存到一个集合,存在覆盖,返回集合个数

1
2
3
4
5
127.0.0.1:6379> sinterstore inters yhq qhh yhqqhh 
(integer) 2
127.0.0.1:6379> smembers inters
1) "id"
2) "name"

sismember

判断是否是集合元素,存在返回1,不存在或者不是返回0

1
2
3
4
127.0.0.1:6379> sismember yhq name
(integer) 1
127.0.0.1:6379> sismember yhq name1
(integer) 0

spop

随机移除一个或多个元素,返回移除的元素,集合不存在或者空集合返回nil(srandmember返回随机元素,不对集合修改)[count 3.2+版本可以指定移除数量,count大于集合数返回整个集合]

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> smembers yhq
1) "id"
2) "sex"
3) "name"
127.0.0.1:6379> spop yhq
"name"
127.0.0.1:6379> smembers yhq
1) "id"
2) "sex"

srandmember

返回集合的随机元素(2.6+版本开始增加count) 如果count为正数,且小于集合基数,返回一个包含count的数组,数组中元素各不相同,如果count大于集合基数,返回整个集合,count为负数,返回一个数组,数组可能重复,长度为count绝对值 只提供key,返回一个元素,集合为空,返回nil,提供count返回一个数组,集合为空数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> smembers yhq
1) "age"
2) "id"
3) "name"
4) "sex"
127.0.0.1:6379> srandmember yhq 2
1) "id"
2) "age"
127.0.0.1:6379> srandmember yhq 2
1) "id"
2) "name"
127.0.0.1:6379> srandmember yhq -3
1) "age"
2) "sex"
3) "age"

smove

将m元素从一个a集合移到另一个b集合,如果a集合不存在m,命令不执行,返回0。否则m从a移到b,当b中以包含m时,命令仅是从a中移除m,ab不是集合类型,返回错误

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> smembers qhh
1) "id"
2) "name"
127.0.0.1:6379> smove yhq qhh age
(integer) 1
127.0.0.1:6379> smembers qhh
1) "age"
2) "id"
3) "name"

srem

从集合移除一个或者多个元素,不存在元素忽略,不是集合类型返回错误,集合不存在返回0,>=2.4可以移除多个元素

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> smembers qhh
1) "age"
2) "id"
3) "sex"
4) "name"
127.0.0.1:6379> srem qhh age id
(integer) 2
127.0.0.1:6379> smembers qhh
1) "sex"
2) "name"

sunion

返回集合并集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> smembers yhq
1) "age"
2) "id"
3) "name"
4) "sex"
127.0.0.1:6379> smembers qhh
1) "sex"
2) "name"
127.0.0.1:6379> smembers yhqqhh
1) "age"
2) "id"
3) "name"
127.0.0.1:6379> sunion yhq qhh yhqqhh
1) "age"
2) "id"
3) "name"
4) "sex"

sunionstore

将集合并集存储到指定集合中,如果存在覆盖

1
2
3
4
5
6
7
127.0.0.1:6379> sunionstore sst yhq qhh yhqqhh
(integer) 4
127.0.0.1:6379> smembers sst
1) "age"
2) "id"
3) "name"
4) "sex"

sscan

迭代集合元素

1
2
3
4
5
127.0.0.1:6379> sscan yhq 0 match a*
1) "0"
2) 1) "age"
2) "add"
3) "apple"

zset(有序集合)

简介

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)

使用场景

排行榜

zadd

将一个或多个成员及成绩加入有序集合,如果有分数则更新,分数可以是整型或者双精度浮点,返回新增的成员数,已存在的不算,返回新增成员数

  • xx 仅仅更新存在的成员,不添加新成员

  • nx 不更新存在的成员,只新增成员

  • incr 对成员进行递增操作(zincrby) 返回递增后的值

  • ch 返回改变的成员数(原始只返回新增成员数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
> zadd yhq 100 yhq 99 qhh 98 yjz 97 zhw
(integer) 4 #新增
> zadd yhq 101 qhh
(integer) 0 #修改
> zrange yhq 0 -1 withscores
1) "zhw"
2) 97.0
3) "yjz"
4) 98.0
5) "yhq"
6) 100.0
7) "qhh"
8) 102.0
> zadd yhq xx 666 yhq 777 ldy
(integer) 0 #仅更新
> zrange yhq 0 -1 withscores
1) "zhw"
2) 97.0
3) "yjz"
4) 98.0
5) "qhh"
6) 102.0
7) "yhq"
8) 666.0
> zadd yhq nx 555 yhq 777 ldy
(integer) 1 #仅新增
> zrange yhq 0 -1 withscores
1) "zhw"
2) 97.0
3) "yjz"
4) 98.0
5) "qhh"
6) 102.0
7) "yhq"
8) 666.0
9) "ldy"
10) 777.0
> zadd yhq incr 666 yhq
(integer) 1332 #递增,返回递增值
> zrange yhq 0 -1 withscores
1) "zhw"
2) 97.0
3) "yjz"
4) 98.0
5) "qhh"
6) 102.0
7) "ldy"
8) 777.0
9) "yhq"
10) 1332.0
> zadd yhq ch 666 yhq 555 ymx
(integer) 2 #返回增加和修改的成员数(原始只返回新增数)
> zrange yhq 0 -1 withscores
1) "zhw"
2) 97.0
3) "yjz"
4) 98.0
5) "qhh"
6) 102.0
7) "ymx"
8) 555.0
9) "yhq"
10) 666.0
11) "ldy"
12) 777.0

zcard

获取集合数量,否则返回0

1
2
127.0.0.1:6379> zcard cj
(integer) 2

zrange

按索引获取集合 按分数由小到大,相同分数按字典序排列 [withscores]

1
2
3
4
5
6
7
8
127.0.0.1:6379> zrange cj 0 -1
1) "yhq"
2) "qhh"
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "yhq"
2) "98"
3) "qhh"
4) "99"

zrevrange

按索引获取集合 按分数由大到小,相同分数按字典序排列 [withscores]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> zrange myset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
127.0.0.1:6379> zrevrange myset 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> zrevrange myset 2 3
1) "one"
127.0.0.1:6379> zrevrange myset -2 -1
1) "two"
2) "one"

zrank

获取成员排名,由小到大

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "ys"
2) "-5"
3) "qhh"
4) "94"
5) "yhq"
6) "98"
127.0.0.1:6379> zrank cj ys
(integer) 0

zrevrank

获取成员的排名,由大到小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "yhq"
2) "98"
3) "qhh"
4) "99"
127.0.0.1:6379> zrange fs 0 -1 withscores
1) "qhh"
2) "100"
3) "yhq"
4) "100"
127.0.0.1:6379> zrevrank fs yhq
(integer) 0
127.0.0.1:6379> zrevrank fs qhh
(integer) 1
127.0.0.1:6379> zrevrank cj yhq
(integer) 1
127.0.0.1:6379> zrevrank cj qhh
(integer) 0

zcount

返回指定分数区间内成员数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> zrange yhq 0 -1 withscores
1) "zhw"
2) 97.0
3) "yjz"
4) 98.0
5) "qhh"
6) 102.0
7) "ymx"
8) 555.0
9) "yhq"
10) 666.0
11) "ldy"
12) 777.0
> zcount yhq -inf +inf #最小最大
6
> zcount yhq (100 102 # 大于100小于等于102
1

zincrby

对集合指定成员增加分数,可以是负数,不存在则添加,返回新的值,不是有序集合返回错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "yhq"
2) "98"
3) "qhh"
4) "99"
127.0.0.1:6379> zincrby cj -5 qhh
"94"
127.0.0.1:6379> zincrby cj -5 ys
"-5"
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "ys"
2) "-5"
3) "qhh"
4) "94"
5) "yhq"
6) "98"

zlexcount

返回成员区间个数

  • 成员名称前需要加 [ 符号作为开头, [ 符号与成员之间不能有空格

  • 可以使用-和+表示最大最小值

  • 计算成员之间的成员数量时,min和max也计算在内

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "ys"
2) "-5"
3) "qhh"
4) "94"
5) "yhq"
6) "98"
127.0.0.1:6379> zlexcount cj - +
(integer) 3

zscore

返回集合成员分数

1
2
3
4
5
6
7
8
9
10
11
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "ys"
2) "-5"
3) "qhh"
4) "94"
5) "yhq"
6) "98"
127.0.0.1:6379> zscore cj qh
(nil)
127.0.0.1:6379> zscore cj qhh
"94"

zrangebylex / zrevrangebylex

根据正序/ 降序数据字典返回成员,分数必须相同(用户电话排序,获取某号段[号码为k,v全部为0],获取姓名A的所有人 [A (B)

  • 分数必须相同!!!,如果分数不一致,返回结果不准

  • 成员字符串作为二进制字节数比较,默认是ASCII字符集,如果包含utf8字符集,影响返回结果,建议不要使用

  • 默认情况下,max和min参数前必须加 [,与成员之间不能有空格(包含) (不包含,+-表示最大最小,不能反,会导致结果空

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
127.0.0.1:6379> zadd zset 0 a 0 aa 0 abc 0 apple 0 b 0 c 0 d 0 d1 0 dd 0 dobble 0 z 0 z1
(integer) 12
127.0.0.1:6379> zrangebylex zset - +
1) "a"
2) "aa"
3) "abc"
4) "apple"
5) "b"
6) "c"
7) "d"
8) "d1"
9) "dd"
10) "dobble"
11) "z"
12) "z1"
127.0.0.1:6379> zrangebylex zset [aa (c limit 3 2
1) "b"
127.0.0.1:6379> zrangebylex zset + - limit 3 2
(empty list or set)
127.0.0.1:6379> zrangebylex zset - + limit 3 2
1) "apple"
2) "b"

zrangebyscore

按成绩返回列表,由小到大,可以分页

1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> zadd myset 1 "one"
(integer) 1
127.0.0.1:6379> zadd myset 2 "two"
(integer) 1
127.0.0.1:6379> zadd myset 3 "three"
(integer) 1
127.0.0.1:6379> zrangebyscore myset -inf +inf
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> zrangebyscore myset 1 2
1) "one"
2) "two"

zrem

移除一个或者多个成员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "ys"
2) "-5"
3) "qhh"
4) "94"
5) "yhq"
6) "98"
127.0.0.1:6379> zrem cj ys yy
(integer) 1
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "qhh"
2) "94"
3) "yhq"
4) "98"

zremrangebylex

移除有序集合中给定的字典区间的所有成员

  • 成员字符串作为二进制字节数比较,默认是ASCII字符集,如果包含utf8字符集,影响返回结果,建议不要使用

  • 默认情况下,max和min参数前必须加 [,与成员之间不能有空格(包含) (不包含,+-表示最大最小,不能反,会导致结果空

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
redis 127.0.0.1:6379> ZADD myzset 0 aaaa 0 b 0 c 0 d 0 e
(integer) 5
redis 127.0.0.1:6379> ZADD myzset 0 foo 0 zap 0 zip 0 ALPHA 0 alpha
(integer) 5
redis 127.0.0.1:6379> ZRANGE myzset 0 -1
1) "ALPHA"
2) "aaaa"
3) "alpha"
4) "b"
5) "c"
6) "d"
7) "e"
8) "foo"
9) "zap"
10) "zip"
redis 127.0.0.1:6379> ZREMRANGEBYLEX myzset [alpha [omega
(integer) 6
redis 127.0.0.1:6379> ZRANGE myzset 0 -1
1) "ALPHA"
2) "aaaa"
3) "zap"
4) "zip"

zremrangebyrank

移除指定排名区间的成员,返回移除数量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "yh"
2) "12"
3) "ys"
4) "45"
5) "qhh"
6) "94"
7) "yhq"
8) "98"
127.0.0.1:6379> zremrangebyrank cj 0 1
(integer) 2
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "qhh"
2) "94"
3) "yhq"
4) "98"

zremrangebyscore

移除分数区间的成员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "yh"
2) "12"
3) "ys"
4) "45"
5) "qhh"
6) "94"
7) "yhq"
8) "98"
127.0.0.1:6379> zremrangebyscore cj 30 50
(integer) 1
127.0.0.1:6379> zrange cj 0 -1 withscores
1) "yh"
2) "12"
3) "qhh"
4) "94"
5) "yhq"
6) "98"

zinterstore

获取多个集合的交集存到另一个集合

ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight] [SUM|MIN|MAX]

在给定要计算的key和其他参数之前,必须先给定key的个数(numberkeys) 默认情况下,结果中一个元素的分数是有序集合该元素分数之和,前提是该元素在这些有序集合中都存在,如果destination存在则覆盖

使用WEIGHTS选择,为每个给定的有序集合指定一个乘法因子,在传递给聚合函数之前都先乘以该因子,没有给定默认1

使用AGGREGATE选择,给定聚合方式,默认sum,如果是min最小,max最大

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> zadd zset1 1 "one"
(integer) 1
127.0.0.1:6379> zadd zset1 2 "two"
(integer) 1
127.0.0.1:6379> zadd zset2 1 "one"
(integer) 1
127.0.0.1:6379> zadd zset2 2 "two"
(integer) 1
127.0.0.1:6379> zinterstore out 2 zset1 zset2 weights 2 3
(integer) 2
127.0.0.1:6379> zrange out 0 -1 withscores
1) "one"
2) "5" 1*2+1*3
3) "two"
4) "10" 2*2+2*3

zunionstore

获取多个集合的并集存到另一个集合 ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight] [SUM|MIN|MAX]

在给定要计算的key和其他参数之前,必须先给定key的个数(numberkeys) 默认情况下,结果中一个元素的分数是有序集合该元素分数之和,前提是该元素在这些有序集合中都存在,如果destination存在则覆盖

使用WEIGHTS选择,为每个给定的有序集合指定一个乘法因子,在传递给聚合函数之前都先乘以该因子,没有给定默认1

使用AGGREGATE选择,给定聚合方式,默认sum,如果是min最小,max最大

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> zunionstore out 2 zset1 zset2 weights 2 3
(integer) 3
127.0.0.1:6379> zrange out 0 -1 withscores
1) "one"
2) "5"
3) "three"
4) "9"
5) "two"
6) "10"

zpopmax / zpopmin

删除并返回有序集合key中最多个count个具有最高(低)分的成员,未指定count为1,大于集合基数不报错,返回多个元素时,得分最高的元素将是第一个元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "four"
8) "4"
127.0.0.1:6379> zpopmax zset 2
1) "four"
2) "4"
3) "three"
4) "3"
127.0.0.1:6379> zpopmin zset 2
1) "one"
2) "1"
3) "two"
4) "2"

评论