redis常用命令和数据类型

redis是一个以key-value存储的非关系型数据库。有五种数据类型,string、hashes、list、set、zset。

1.1 键值相关命令

1.1.1 keys

返回满足给定 pattern 的所有 key

redis 127.0.0.1:6379> keys *

1) "myzset2"

2) "myzset3"

3) "mylist"

4) "myset2"

redis 127.0.0.1:6379>

用表达式*,代表取出所有的 key

redis 127.0.0.1:6379> keys mylist*

1) "mylist"

2) "mylist5"

redis 127.0.0.1:6379>

用表达式 mylist*,代表取出所有以 mylist 开头的 key

1.1.2 exists

确认一个 key 是否存在

redis 127.0.0.1:6379> exists HongWan

(integer) 0

redis 127.0.0.1:6379> exists age

(integer) 1

redis 127.0.0.1:6379>

从结果来数据库中不存在 HongWan 这个 key,但是 age 这个 key 是存在的

1.1.3 del

删除一个 key

redis 127.0.0.1:6379> del age

(integer) 1

redis 127.0.0.1:6379> exists age

(integer) 0

redis 127.0.0.1:6379>

从结果来数据库中不存在 HongWan 这个 key,但是 age 这个 key 是存在的

1.1.4 expire

设置一个 key 的过期时间(单位:秒)

redis 127.0.0.1:6379> expire addr 10

(integer) 1

redis 127.0.0.1:6379> ttl addr

(integer) 8

redis 127.0.0.1:6379> ttl addr

(integer) 1

redis 127.0.0.1:6379> ttl addr

(integer) -1

redis 127.0.0.1:6379>

在本例中,我们设置 addr 这个 key 的过期时间是 10 秒,然后我们不断的用 ttl 来获取这个

key 的有效时长,直至为-1 说明此值已过期

1.1.5 move

将当前数据库中的 key 转移到其它数据库中

redis 127.0.0.1:6379> select 0

OK

redis 127.0.0.1:6379> set age 30

OK

redis 127.0.0.1:6379> get age

"30"

redis 127.0.0.1:6379> move age 1

(integer) 1

redis 127.0.0.1:6379> get age

(nil)

redis 127.0.0.1:6379> select 1

OK

redis 127.0.0.1:6379[1]> get age

"30"

redis 127.0.0.1:6379[1]>

在本例中,我先显式的选择了数据库 0,然后在这个库中设置一个 key,接下来我们将这个

key 从数据库 0 移到数据库 1,之后我们确认在数据库 0 中无此 key 了, 但在数据库 1 中存在

这个 key,说明我们转移成功了

1.1.6 persist

移除给定 key 的过期时间

redis 127.0.0.1:6379[1]> expire age 300

(integer) 1

redis 127.0.0.1:6379[1]> ttl age

(integer) 294

redis 127.0.0.1:6379[1]> persist age

(integer) 1

redis 127.0.0.1:6379[1]> ttl age

(integer) -1

redis 127.0.0.1:6379[1]>

在这个例子中,我们手动的将未到过期时间的 key,成功设置为过期

1.1.7 randomkey

随机返回 key 空间的一个 key

redis 127.0.0.1:6379> randomkey

"mylist7"

redis 127.0.0.1:6379> randomkey

"mylist5"

redis 127.0.0.1:6379>

通过结果可以看到取 key 的规则是随机的

1.1.8 rename

重命名 key

redis 127.0.0.1:6379[1]> keys *

1) "age"

redis 127.0.0.1:6379[1]> rename age age_new

OK

redis 127.0.0.1:6379[1]> keys *

1) "age_new"

redis 127.0.0.1:6379[1]>

age 成功的被我们改名为 age_new 了

1.1.9 type

返回值的类型

redis 127.0.0.1:6379> type addr

string

redis 127.0.0.1:6379> type myzset2

zset

redis 127.0.0.1:6379> type mylist

list

redis 127.0.0.1:6379>

这个方法可以非常简单的判断出值的类型

1.2 服务器相关命令

1.2.1 ping

测试连接是否存活

redis 127.0.0.1:6379> ping

PONG

//执行下面命令之前,我们停止 redis 服务器

redis 127.0.0.1:6379> ping

Could not connect to Redis at 127.0.0.1:6379: Connection refused

//执行下面命令之前,我们启动 redis 服务器

not connected> ping

PONG

redis 127.0.0.1:6379>

第一个 ping 时,说明此连接正常

第二个 ping 之前,我们将 redis 服务器停止,那么 ping 是失败的

第三个 ping 之前,我们将 redis 服务器启动,那么 ping 是成功的

1.2.2 echo

在命令行打印一些内容

redis 127.0.0.1:6379> echo HongWan

"HongWan"

redis 127.0.0.1:6379>

1.2.3 select

选择数据库。Redis 数据库编号从 0~15,我们可以选择任意一个数据库来进行数据的存取。

redis 127.0.0.1:6379> select 1

OK

redis 127.0.0.1:6379[1]> select 16

(error) ERR invalid DB index

redis 127.0.0.1:6379[16]>

当选择 16 时,报错,说明没有编号为 16 的这个数据库

1.2.4 quit

退出连接。

redis 127.0.0.1:6379> quit

[root@localhost redis-2.2.12]#

1.2.5 dbsize

返回当前数据库中 key 的数目。

redis 127.0.0.1:6379> dbsize

(integer) 18

redis 127.0.0.1:6379>

结果说明此库中有 18 个 key

1.2.6 info

获取服务器的信息和统计。

redis 127.0.0.1:6379> info

redis_version:2.2.12

redis_git_sha1:00000000

redis_git_dirty:0

arch_bits:32

multiplexing_api:epoll

process_id:28480

uptime_in_seconds:2515

uptime_in_days:0

redis 127.0.0.1:6379>

此结果用于说明服务器的基础信息,包括版本、启动时间等。

1.2.7 monitor

实时转储收到的请求。

redis 127.0.0.1:6379> config get dir

1) "dir"

2) "/root/4setup/redis-2.2.12"

redis 127.0.0.1:6379>

从结果可以看出,此服务器目前接受了命令"keys *"和"get addr"。

1.2.8 config get

获取服务器配置信息。

redis 127.0.0.1:6379> config get dir

1) "dir"

2) "/root/4setup/redis-2.2.12"

redis 127.0.0.1:6379>

本例中我们获取了 dir 这个参数配置的值,如果想获取全部参数据的配置值也很简单,只需

执行”config get *”即可将全部的值都显示出来。

1.2.9 flushdb

删除当前选择数据库中的所有 key。

redis 127.0.0.1:6379> dbsize

(integer) 18

redis 127.0.0.1:6379> flushdb

OK

redis 127.0.0.1:6379> dbsize

(integer) 0

redis 127.0.0.1:6379>

在本例中我们将 0 号数据库中的 key 都清除了。

1.2.10 flushall

删除所有数据库中的所有 key。

redis 127.0.0.1:6379[1]> dbsize

(integer) 1

redis 127.0.0.1:6379[1]> select 0

OK

redis 127.0.0.1:6379> flushall

OK

redis 127.0.0.1:6379> select 1

OK

redis 127.0.0.1:6379[1]> dbsize

(integer) 0

redis 127.0.0.1:6379[1]>

在本例中我们先查看了一个1号数据库中有一个key,然后我切换到0号库执行flushall命令,

结果 1 号库中的 key 也被清除了,说是此命令工作正常。

2.1:string类型及操作:string是最简单的数据类型,是二进制安全的,可以包含任何类型。

2.2.1 set

设置 key 对应的值为 string 类型的 value。

例如我们添加一个 name= HongWan 的键值对,可以这样做:

redis 127.0.0.1:6379> set name HongWan

OK

redis 127.0.0.1:6379>

2.2.2 setnx

设置 key 对应的值为 string 类型的 value。如果 key 已经存在,返回 0,nx 是 not exist 的意思。

例如我们添加一个 name= HongWan_new 的键值对,可以这样做:

redis 127.0.0.1:6379> get name

"HongWan"

redis 127.0.0.1:6379> setnx name HongWan_new

(integer) 0

redis 127.0.0.1:6379> get name

"HongWan"

redis 127.0.0.1:6379>

由于原来 name 有一个对应的值,所以本次的修改不生效,且返回码是 0。

2.2.3 setex

设置 key 对应的值为 string 类型的 value,并指定此键值对应的有效期。

例如我们添加一个 haircolor= red 的键值对,并指定它的有效期是 10 秒,可以这样做:

redis 127.0.0.1:6379> setex haircolor 10 red

OK

redis 127.0.0.1:6379> get haircolor

"red"

redis 127.0.0.1:6379> get haircolor

(nil)

redis 127.0.0.1:6379>

可见由于最后一次的调用是 10 秒以后了,所以取不到 haicolor 这个键对应的值。

2.2.4 setrange

设置指定 key 的 value 值的子字符串。

例如我们希望将 HongWan 的 126 邮箱替换为 gmail 邮箱,那么我们可以这样做:

redis 127.0.0.1:6379> get name

"HongWan@126.com"

redis 127.0.0.1:6379> setrange name 8 gmail.com

(integer) 17

redis 127.0.0.1:6379> get name

"HongWan@gmail.com"

redis 127.0.0.1:6379>

其中的 8 是指从下标为 8(包含 8)的字符开始替换

2.2.5 mset

一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值

被设置。

redis 127.0.0.1:6379> mset key1 HongWan1 key2 HongWan2

OK

redis 127.0.0.1:6379> get key1

"HongWan1"

redis 127.0.0.1:6379> get key2

"HongWan2"

redis 127.0.0.1:6379>

2.2.6 msetnx

一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值

被设置,但是不会覆盖已经存在的 key。

redis 127.0.0.1:6379> get key1

"HongWan1"

redis 127.0.0.1:6379> get key2

"HongWan2"

redis 127.0.0.1:6379> msetnx key2 HongWan2_new key3 HongWan3

(integer) 0

redis 127.0.0.1:6379> get key2

"HongWan2"

redis 127.0.0.1:6379> get key3

(nil)

可以看出如果这条命令返回 0,那么里面操作都会回滚,都不会被执行。

2.2.7 get

获取 key 对应的 string 值,如果 key 不存在返回 nil。

例如我们获取一个库中存在的键 name,可以很快得到它对应的 value

redis 127.0.0.1:6379> get name

"HongWan"

redis 127.0.0.1:6379>

我们获取一个库中不存在的键 name1,那么它会返回一个 nil 以表时无此键值对

redis 127.0.0.1:6379> get name1

(nil)

redis 127.0.0.1:6379>

2.2.8 getset

设置 key 的值,并返回 key 的旧值。

redis 127.0.0.1:6379> get name

"HongWan"

redis 127.0.0.1:6379> getset name HongWan_new

"HongWan"

redis 127.0.0.1:6379> get name

"HongWan_new"

redis 127.0.0.1:6379>

接下来我们看一下如果 key 不存的时候会什么样儿?

redis 127.0.0.1:6379> getset name1 aaa

(nil)

redis 127.0.0.1:6379>

可见,如果 key 不存在,那么将返回 nil

2.2.9 getrange

获取指定 key 的 value 值的子字符串。

具体样例如下:

redis 127.0.0.1:6379> get name

"HongWan@126.com"

redis 127.0.0.1:6379> getrange name 0 6

"HongWan"

redis 127.0.0.1:6379>

字符串左面下标是从 0 开始的

redis 127.0.0.1:6379> getrange name -7 -1

"126.com"

redis 127.0.0.1:6379>

字符串右面下标是从-1 开始的

redis 127.0.0.1:6379> getrange name 7 100

"@126.com"

redis 127.0.0.1:6379>

当下标超出字符串长度时,将默认为是同方向的最大下标

2.2.10 mget

一次获取多个 key 的值,如果对应 key 不存在,则对应返回 nil。

具体样例如下:

redis 127.0.0.1:6379> mget key1 key2 key3

1) "HongWan1"

2) "HongWan2"

3) (nil)

redis 127.0.0.1:6379>

key3 由于没有这个键定义,所以返回 nil。

2.2.11 incr

对 key 的值做加加操作,并返回新的值。注意 incr 一个不是 int 的 value 会返回错误,incr 一

个不存在的 key,则设置 key 为 1

redis 127.0.0.1:6379> set age 20

OK

redis 127.0.0.1:6379> incr age

(integer) 21

redis 127.0.0.1:6379> get age

"21"

redis 127.0.0.1:6379>

2.2.12 incrby

同 incr 类似,加指定值 ,key 不存在时候会设置 key,并认为原来的 value 是 0

redis 127.0.0.1:6379> get age

"21"

redis 127.0.0.1:6379> incrby age 5

(integer) 26

redis 127.0.0.1:6379> get name

"HongWan@gmail.com"

redis 127.0.0.1:6379> get age

"26"

redis 127.0.0.1:6379>

2.2.13 decr

对 key 的值做的是减减操作,decr 一个不存在 key,则设置 key 为-1

redis 127.0.0.1:6379> get age

"26"

redis 127.0.0.1:6379> decr age

(integer) 25

redis 127.0.0.1:6379> get age

"25"

redis 127.0.0.1:6379>

2.2.14 decrby

同 decr,减指定值。

redis 127.0.0.1:6379> get age

"25"

redis 127.0.0.1:6379> decrby age 5

(integer) 20

redis 127.0.0.1:6379> get age

"20"

redis 127.0.0.1:6379>

decrby 完全是为了可读性,我们完全可以通过 incrby 一个负值来实现同样效果,反之一样。

redis 127.0.0.1:6379> get age

"20"

redis 127.0.0.1:6379> incrby age -5

(integer) 15

redis 127.0.0.1:6379> get age

"15"

redis 127.0.0.1:6379>

2.2.15 append

给指定 key 的字符串值追加 value,返回新字符串值的长度。

例如我们向 name 的值追加一个@126.com 字符串,那么可以这样做:

redis 127.0.0.1:6379> append name @126.com

(integer) 15

redis 127.0.0.1:6379> get name

"HongWan@126.com"

redis 127.0.0.1:6379>

2.2.16 strlen

取指定 key 的 value 值的长度。

redis 127.0.0.1:6379> get name

"HongWan_new"

redis 127.0.0.1:6379> strlen name

(integer) 11

redis 127.0.0.1:6379> get age

"15"

redis 127.0.0.1:6379> strlen age

(integer) 2

redis 127.0.0.1:6379>

2.3 hashes 类型及操作, 特别适合用于存储对象

2.3.1 hset

设置 hash field 为指定值,如果 key 不存在,则先创建。

redis 127.0.0.1:6379> hset myhash field1 Hello

(integer) 1

redis 127.0.0.1:6379>

2.3.2 hsetnx

设置 hash field 为指定值,如果 key 不存在,则先创建。如果 field 已经存在,返回 0,nx 是

not exist 的意思。

redis 127.0.0.1:6379> hsetnx myhash field "Hello"

(integer) 1

redis 127.0.0.1:6379> hsetnx myhash field "Hello"

(integer) 0

redis 127.0.0.1:6379>

第一次执行是成功的,但第二次执行相同的命令失败,原因是 field 已经存在了。

2.3.3 hmset

同时设置 hash 的多个 field。

redis 127.0.0.1:6379> hmset myhash field1 Hello field2 World

OK

redis 127.0.0.1:6379>

2.3.4 hget

获取指定的 hash field。

redis 127.0.0.1:6379> hget myhash field1

"Hello"

redis 127.0.0.1:6379> hget myhash field2

"World"

redis 127.0.0.1:6379> hget myhash field3

(nil)

redis 127.0.0.1:6379>

由于数据库没有 field3,所以取到的是一个空值 nil

2.3.5 hmget

获取全部指定的 hash filed。

redis 127.0.0.1:6379> hmget myhash field1 field2 field3

1) "Hello"

2) "World"

3) (nil)

redis 127.0.0.1:6379>

由于数据库没有 field3,所以取到的是一个空值 nil

2.3.6 hincrby

指定的 hash filed 加上给定值。

redis 127.0.0.1:6379> hset myhash field3 20

(integer) 1

redis 127.0.0.1:6379> hget myhash field3

"20"

redis 127.0.0.1:6379> hincrby myhash field3 -8

(integer) 12

redis 127.0.0.1:6379> hget myhash field3

"12"

redis 127.0.0.1:6379>

在本例中我们将 field3 的值从 20 降到了 12,即做了一个减 8 的操作。

2.3.7 hexists

测试指定 field 是否存在。

redis 127.0.0.1:6379> hexists myhash field1

(integer) 1

redis 127.0.0.1:6379> hexists myhash field9

(integer) 0

redis 127.0.0.1:6379>

通过上例可以说明 field1 存在,但 field9 是不存在的。

2.3.8 hlen

返回指定 hash 的 field 数量。

redis 127.0.0.1:6379> hlen myhash

(integer) 4

redis 127.0.0.1:6379>

通过上例可以看到 myhash 中有 4 个 field。

2.3.9 hdel

返回指定 hash 的 field 数量。

redis 127.0.0.1:6379> hlen myhash

(integer) 4

redis 127.0.0.1:6379> hdel myhash field1

(integer) 1

redis 127.0.0.1:6379> hlen myhash

(integer) 3

redis 127.0.0.1:6379>

2.3.10 hkeys

返回 hash 的所有 field。

redis 127.0.0.1:6379> hkeys myhash

1) "field2"

2) "field"

3) "field3"

redis 127.0.0.1:6379>

说明这个 hash 中有 3 个 field

2.3.11 hvals

返回 hash 的所有 value。

redis 127.0.0.1:6379> hvals myhash

1) "World"

2) "Hello"

3) "12"

redis 127.0.0.1:6379>

说明这个 hash 中有 3 个 field

2.3.12 hgetall

获取某个 hash 中全部的 filed 及 value。

redis 127.0.0.1:6379> hgetall myhash

1) "field2"

2) "World"

3) "field"

4) "Hello"

5) "field3"

6) "12"

redis 127.0.0.1:6379>

可见,一下子将 myhash 中所有的 field 及对应的 value 都取出来了。

2.4 lists 类型及操作。list 是一个链表结构,主要功能是 push、pop,可以做 堆栈和队列

2.4.1 lpush

在 key 对应 list 的头部添加字符串元素

redis 127.0.0.1:6379> lpush mylist "world"

(integer) 1

redis 127.0.0.1:6379> lpush mylist "hello"

(integer) 2

redis 127.0.0.1:6379> lrange mylist 0 -1

1) "hello"

2) "world"

redis 127.0.0.1:6379>

在此处我们先插入了一个 world,然后在 world 的头部插入了一个 hello。其中 lrange 是用于

取 mylist 的内容。

2.4.2 rpush

在 key 对应 list 的尾部添加字符串元素

redis 127.0.0.1:6379> rpush mylist2 "hello"

(integer) 1

redis 127.0.0.1:6379> rpush mylist2 "world"

(integer) 2

redis 127.0.0.1:6379> lrange mylist2 0 -1

1) "hello"

2) "world"

redis 127.0.0.1:6379>

在此处我们先插入了一个 hello,然后在 hello 的尾部插入了一个 world。

2.4.3 linsert

在 key 对应 list 的特定位置之前或之后添加字符串元素

redis 127.0.0.1:6379> rpush mylist3 "hello"

(integer) 1

redis 127.0.0.1:6379> rpush mylist3 "world"

(integer) 2

redis 127.0.0.1:6379> linsert mylist3 before "world" "there"

(integer) 3

redis 127.0.0.1:6379> lrange mylist3 0 -1

1) "hello"

2) "there"

3) "world"

redis 127.0.0.1:6379>

在此处我们先插入了一个 hello,然后在 hello 的尾部插入了一个 world,然后又在 world 的

前面插入了 there。

2.4.4 lset

设置 list 中指定下标的元素值(下标从 0 开始)

redis 127.0.0.1:6379> rpush mylist4 "one"

(integer) 1

redis 127.0.0.1:6379> rpush mylist4 "two"

(integer) 2

redis 127.0.0.1:6379> rpush mylist4 "three"

(integer) 3

redis 127.0.0.1:6379> lset mylist4 0 "four"

OK

redis 127.0.0.1:6379> lset mylist4 -2 "five"

OK

redis 127.0.0.1:6379> lrange mylist4 0 -1

1) "four"

2) "five"

3) "three"

redis 127.0.0.1:6379>

在此处我们依次插入了 one,two,three,然后将标是 0 的值设置为 four,再将下标是-2 的值设

置为 five。

2.5.5 lrem

从 key 对应 list 中删除 count 个和 value 相同的元素。

count>0 时,按从头到尾的顺序删除,具体如下:

redis 127.0.0.1:6379> rpush mylist5 "hello"

(integer) 1

redis 127.0.0.1:6379> rpush mylist5 "hello"

(integer) 2

redis 127.0.0.1:6379> rpush mylist5 "foo"

(integer) 3

redis 127.0.0.1:6379> rpush mylist5 "hello"

(integer) 4

redis 127.0.0.1:6379> lrem mylist5 2 "hello"

(integer) 2

redis 127.0.0.1:6379> lrange mylist5 0 -1

1) "foo"

2) "hello"

redis 127.0.0.1:6379>

count<0 时,按从尾到头的顺序删除,具体如下:

redis 127.0.0.1:6379> rpush mylist6 "hello"

(integer) 1

redis 127.0.0.1:6379> rpush mylist6 "hello"

(integer) 2

redis 127.0.0.1:6379> rpush mylist6 "foo"

(integer) 3

redis 127.0.0.1:6379> rpush mylist6 "hello"

(integer) 4

redis 127.0.0.1:6379> lrem mylist6 -2 "hello"

(integer) 2

redis 127.0.0.1:6379> lrange mylist6 0 -1

1) "hello"

2) "foo"

redis 127.0.0.1:6379>

count=0 时,删除全部,具体如下:

redis 127.0.0.1:6379> rpush mylist7 "hello"

(integer) 1

redis 127.0.0.1:6379> rpush mylist7 "hello"

(integer) 2

redis 127.0.0.1:6379> rpush mylist7 "foo"

(integer) 3

redis 127.0.0.1:6379> rpush mylist7 "hello"

(integer) 4

redis 127.0.0.1:6379> lrem mylist7 0 "hello"

(integer) 3

redis 127.0.0.1:6379> lrange mylist7 0 -1

1) "foo"

redis 127.0.0.1:6379>

2.4.6 ltrim

保留指定 key 的值范围内的数据

redis 127.0.0.1:6379> rpush mylist8 "one"

(integer) 1

redis 127.0.0.1:6379> rpush mylist8 "two"

(integer) 2

redis 127.0.0.1:6379> rpush mylist8 "three"

(integer) 3

redis 127.0.0.1:6379> rpush mylist8 "four"

(integer) 4

redis 127.0.0.1:6379> ltrim mylist8 1 -1

OK

redis 127.0.0.1:6379> lrange mylist8 0 -1

1) "two"

2) "three"

3) "four"

redis 127.0.0.1:6379>

2.4.7 lpop

从 list 的头部删除元素,并返回删除元素

redis 127.0.0.1:6379> lrange mylist 0 -1

1) "hello"

2) "world"

redis 127.0.0.1:6379> lpop mylist

"hello"

redis 127.0.0.1:6379> lrange mylist 0 -1

1) "world"

redis 127.0.0.1:6379>

2.4.8 rpop

从 list 的尾部删除元素,并返回删除元素

redis 127.0.0.1:6379> lrange mylist2 0 -1

1) "hello"

2) "world"

redis 127.0.0.1:6379> rpop mylist2

"world"

redis 127.0.0.1:6379> lrange mylist2 0 -1

1) "hello"

redis 127.0.0.1:6379>

2.4.9 rpoplpush

从第一个 list 的尾部移除元素并添加到第二个 list 的头部,最后返回被移除的元素值,整个操

作是原子的.如果第一个 list 是空或者不存在返回 nil

redis 127.0.0.1:6379> lrange mylist5 0 -1

1) "three"

2) "foo"

3) "hello"

redis 127.0.0.1:6379> lrange mylist6 0 -1

1) "hello"

2) "foo"

redis 127.0.0.1:6379> rpoplpush mylist5 mylist6

"hello"

redis 127.0.0.1:6379> lrange mylist5 0 -1

1) "three"

2) "foo"

redis 127.0.0.1:6379> lrange mylist6 0 -1

1) "hello"

2) "hello"

3) "foo"

redis 127.0.0.1:6379>

2.4.10 lindex

返回名称为 key 的 list 中 index 位置的元素

redis 127.0.0.1:6379> lrange mylist5 0 -1

1) "three"

2) "foo"

redis 127.0.0.1:6379> lindex mylist5 0

"three"

redis 127.0.0.1:6379> lindex mylist5 1

"foo"

redis 127.0.0.1:6379>

2.4.11 llen

返回 key 对应 list 的长度

redis 127.0.0.1:6379> llen mylist5

(integer) 2

redis 127.0.0.1:6379>

2.5 sets 类型及操作,无序集合

2.5.1 sadd

向名称为 key 的 set 中添加元素

redis 127.0.0.1:6379> sadd myset "hello"

(integer) 1

redis 127.0.0.1:6379> sadd myset "world"

(integer) 1

redis 127.0.0.1:6379> sadd myset "world"

(integer) 0

redis 127.0.0.1:6379> smembers myset

1) "world"

2) "hello"

redis 127.0.0.1:6379>

本例中,我们向 myset 中添加了三个元素,但由于第三个元素跟第二个元素是相同的,所以

第三个元素没有添加成功,最后我们用 smembers 来查看 myset 中的所有元素。

2.5.2 srem

删除名称为 key 的 set 中的元素 member

redis 127.0.0.1:6379> sadd myset2 "one"

(integer) 1

redis 127.0.0.1:6379> sadd myset2 "two"

(integer) 1

redis 127.0.0.1:6379> sadd myset2 "three"

(integer) 1

redis 127.0.0.1:6379> srem myset2 "one"

(integer) 1

redis 127.0.0.1:6379> srem myset2 "four"

(integer) 0

redis 127.0.0.1:6379> smembers myset2

1) "three"

2) "two"

redis 127.0.0.1:6379>

本例中,我们向 myset2 中添加了三个元素后,再调用 srem 来删除 one 和 four,但由于元素

中没有 four 所以,此条 srem 命令执行失败。

2.5.3 spop

随机返回并删除名称为 key 的 set 中一个元素

redis 127.0.0.1:6379> sadd myset3 "one"

(integer) 1

redis 127.0.0.1:6379> sadd myset3 "two"

(integer) 1

redis 127.0.0.1:6379> sadd myset3 "three"

(integer) 1

redis 127.0.0.1:6379> spop myset3

"three"

redis 127.0.0.1:6379> smembers myset3

1) "two"

2) "one"

redis 127.0.0.1:6379>

本例中,我们向 myset3 中添加了三个元素后,再调用 spop 来随机删除一个元素,可以看到

three 元素被删除了。

2.5.4 sdiff

返回所有给定 key 与第一个 key 的差集

redis 127.0.0.1:6379> smembers myset2

1) "three"

2) "two"

redis 127.0.0.1:6379> smembers myset3

1) "two"

2) "one"

redis 127.0.0.1:6379> sdiff myset2 myset3

1) "three"

redis 127.0.0.1:6379>

本例中,我们可以看到 myset2 中的元素与 myset3 中不同的只是 three,所以只有 three 被查

出来了,而不是 three 和 one,因为 one 是 myset3 的元素。

我们也可以将 myset2 和 myset3 换个顺序来看一下结果:

redis 127.0.0.1:6379> sdiff myset3 myset2

1) "one"

redis 127.0.0.1:6379>

这个结果中只显示了,myset3 中的元素与 myset2 中不同的元素。

2.5.5 sdiffstore

返回所有给定 key 与第一个 key 的差集,并将结果存为另一个 key

redis 127.0.0.1:6379> smembers myset2

1) "three"

2) "two"

redis 127.0.0.1:6379> smembers myset3

1) "two"

2) "one"

redis 127.0.0.1:6379> sdiffstore myset4 myset2 myset3

(integer) 1

redis 127.0.0.1:6379> smembers myset4

1) "three"

redis 127.0.0.1:6379>

2.5.6 sinter

返回所有给定 key 的交集

redis 127.0.0.1:6379> smembers myset2

1) "three"

2) "two"

redis 127.0.0.1:6379> smembers myset3

1) "two"

2) "one"

redis 127.0.0.1:6379> sinter myset2 myset3

1) "two"

redis 127.0.0.1:6379>

通过本例的结果可以看出, myset2 和 myset3 的交集 two 被查出来了

2.5.7 sinterstore

返回所有给定 key 的交集,并将结果存为另一个 key

redis 127.0.0.1:6379> smembers myset2

1) "three"

2) "two"

redis 127.0.0.1:6379> smembers myset3

1) "two"

2) "one"

redis 127.0.0.1:6379> sinterstore myset5 myset2 myset3

(integer) 1

redis 127.0.0.1:6379> smembers myset5

1) "two"

redis 127.0.0.1:6379>

通过本例的结果可以看出, myset2 和 myset3 的交集被保存到 myset5 中了

2.5.8 sunion

返回所有给定 key 的并集

redis 127.0.0.1:6379> smembers myset2

1) "three"

2) "two"

redis 127.0.0.1:6379> smembers myset3

1) "two"

2) "one"

redis 127.0.0.1:6379> sunion myset2 myset3

1) "three"

2) "one"

3) "two"

redis 127.0.0.1:6379>

通过本例的结果可以看出, myset2 和 myset3 的并集被查出来了

2.5.9 sunionstore

返回所有给定 key 的并集,并将结果存为另一个 key

redis 127.0.0.1:6379> smembers myset2

1) "three"

2) "two"

redis 127.0.0.1:6379> smembers myset3

1) "two"

2) "one"

redis 127.0.0.1:6379> sunionstore myset6 myset2 myset3

(integer) 3

redis 127.0.0.1:6379> smembers myset6

1) "three"

2) "one"

3) "two"

redis 127.0.0.1:6379>

通过本例的结果可以看出, myset2 和 myset3 的并集被保存到 myset6 中了

2.5.10 smove

从第一个 key 对应的 set 中移除 member 并添加到第二个对应 set 中

redis 127.0.0.1:6379> smembers myset2

1) "three"

2) "two"

redis 127.0.0.1:6379> smembers myset3

1) "two"

2) "one"

redis 127.0.0.1:6379> smove myset2 myset7 three

(integer) 1

redis 127.0.0.1:6379> smembers myset7

1) "three"

redis 127.0.0.1:6379>

通过本例可以看到,myset2 的 three 被移到 myset7 中了

2.5.11 scard

返回名称为 key 的 set 的元素个数

redis 127.0.0.1:6379> scard myset2

(integer) 1

redis 127.0.0.1:6379>

通过本例可以看到,myset2 的成员数量为 1

2.5.12 sismember

测试 member 是否是名称为 key 的 set 的元素

redis 127.0.0.1:6379> smembers myset2

1) "two"

redis 127.0.0.1:6379> sismember myset2 two

(integer) 1

redis 127.0.0.1:6379> sismember myset2 one

(integer) 0

redis 127.0.0.1:6379>

通过本例可以看到,two 是 myset2 的成员,而 one 不是。

2.5.13 srandmember

随机返回名称为 key 的 set 的一个元素,但是不删除元素

redis 127.0.0.1:6379> smembers myset3

1) "two"

2) "one"

redis 127.0.0.1:6379> srandmember myset3

"two"

redis 127.0.0.1:6379> srandmember myset3

"one"

redis 127.0.0.1:6379>

2.6 sorted sets 类型及操作,有序集合

2.6.1 zadd

向名称为 key 的 zset 中添加元素 member,score 用于排序。如果该元素已经存在,则根据

score 更新该元素的顺序

redis 127.0.0.1:6379> zadd myzset 1 "one"

(integer) 1

redis 127.0.0.1:6379> zadd myzset 2 "two"

(integer) 1

redis 127.0.0.1:6379> zadd myzset 3 "two"

(integer) 0

redis 127.0.0.1:6379> zrange myzset 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "3"

redis 127.0.0.1:6379>

本例中我们向 myzset 中添加了 one 和 two,并且 two 被设置了 2 次,那么将以最后一次的

设置为准,最后我们将所有元素都显示出来并显示出了元素的 score。

2.6.2 zrem

删除名称为 key 的 zset 中的元素 member

redis 127.0.0.1:6379> zrange myzset 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "3"

redis 127.0.0.1:6379> zrem myzset two

(integer) 1

redis 127.0.0.1:6379> zrange myzset 0 -1 withscores

1) "one"

2) "1"

redis 127.0.0.1:6379>

可以看到 two 被删除了

2.6.3 zincrby

如果在名称为 key 的 zset 中已经存在元素 member,则该元素的 score 增加 increment;否则

向集合中添加该元素,其 score 的值为 increment

redis 127.0.0.1:6379> zadd myzset2 1 "one"

(integer) 1

redis 127.0.0.1:6379> zadd myzset2 2 "two"

(integer) 1

redis 127.0.0.1:6379> zincrby myzset2 2 "one"

"3"

redis 127.0.0.1:6379> zrange myzset2 0 -1 withscores

1) "two"

2) "2"

3) "one"

4) "3"

redis 127.0.0.1:6379>

本例中将 one 的 score 从 1 增加了 2,增加到了 3

2.6.4 zrank

返回名称为 key 的 zset 中 member 元素的排名(按 score 从小到大排序)即下标

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

7) "five"

8) "5"

redis 127.0.0.1:6379> zrank myzset3 two

(integer) 1

redis 127.0.0.1:6379>

本例中将 two 的下标是 1,我这里取的是下标,而不是 score

2.6.5 zrevrank

返回名称为 key 的 zset 中 member 元素的排名(按 score 从大到小排序)即下标

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

7) "five"

8) "5"

redis 127.0.0.1:6379> zrevrank myzset3 two

(integer) 2

redis 127.0.0.1:6379>

按从大到小排序的话 two 是第三个元素,下标是 2

2.6.6 zrevrange

返回名称为 key 的 zset(按 score 从大到小排序)中的 index 从 start 到 end 的所有元素

redis 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores

1) "five"

2) "5"

3) "three"

4) "3"

5) "two"

6) "2"

7) "one"

8) "1"

redis 127.0.0.1:6379>

首先按 score 从大到小排序,再取出全部元素

2.6.7 zrangebyscore

返回集合中 score 在给定区间的元素

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

7) "five"

8) "5"

redis 127.0.0.1:6379> zrangebyscore myzset3 2 3 withscores

1) "two"

2) "2"

3) "three"

4) "3"

redis 127.0.0.1:6379>

本例中,返回了 score 在 2~3 区间的元素

2.6.8 zcount

返回集合中 score 在给定区间的数量

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

7) "five"

8) "5"

redis 127.0.0.1:6379> zcount myzset3 2 3

(integer) 2

redis 127.0.0.1:6379>

本例中,计算了 score 在 2~3 之间的元素数目

2.6.9 zcard

返回集合中元素个数

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

7) "five"

8) "5"

redis 127.0.0.1:6379> zcard myzset3

(integer) 4

redis 127.0.0.1:6379>

从本例看出 myzset3 这个集全的元素数量是 4

2.6.10 zscore

返回给定元素对应的 score

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

7) "five"

8) "5"

redis 127.0.0.1:6379> zscore myzset3 two

"2"

redis 127.0.0.1:6379>

此例中我们成功的将 two 的 score 取出来了。

2.6.11 zremrangebyrank

删除集合中排名在给定区间的元素

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

7) "five"

8) "5"

redis 127.0.0.1:6379> zremrangebyrank myzset3 3 3

(integer) 1

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

redis 127.0.0.1:6379>

在本例中我们将 myzset3 中按从小到大排序结果的下标为 3 的元素删除了。

2.6.12 zremrangebyscore

删除集合中 score 在给定区间的元素

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

redis 127.0.0.1:6379> zremrangebyscore myzset3 1 2

(integer) 2

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) "three"

2) "3"

redis 127.0.0.1:6379>

在本例中我们将 myzset3 中按从小到大排序结果的 score 在 1~2 之间的元素删除了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容