Redis教程

Redis 的数据类型与常用命令

本文主要是介绍Redis 的数据类型与常用命令,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Ø  简介

本文主要记录 Redis 的数据类型及常用命令,包含如下内容:

1.   Redis 的数据类型

2.   Redis 的常用命令

 

1.   Redis 的数据类型

Redis 包含以下五大数据类型,分别为:String、Hash、List、Set(无序集合)、Sorted Set(有序集合),下面分别介绍每种数据类型支持的方法。

 

1)   String 类型

String 是最简单的类型,可以 Key 对应一个 Value, string 类型是二进制安全的。Redis 的 string 可以包含任何数据,比如 jpg 图片或者序列化的对象。

1.   set

设置 key 对应的值为 string 类型的 value,例如:

127.0.0.1:6379> set name abeam

OK

 

2.   get

根据指定的 key 获取对应的 value,如果 key 不存在返回nil。例如:

127.0.0.1:6379> get name

"abeam"

 

3.   getset

设置 key 对应的值为 string 类型的 value,并返回 key 的旧值。例如:

127.0.0.1:6379> set name abeam

OK

127.0.0.1:6379> getset name abeam2

"abeam"

 

4.   setnx

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

127.0.0.1:6379> setnx name abeamabc

(integer) 0

 

5.   setex

设置 key 对应的值为 string 类型的 value, 并指定此键值对应的有效期(单位:秒)。例如:

127.0.0.1:6379> setex status 5 20   #设置有效期为5秒

 

6.   setrange

设置指定 key 的 value 值的子字符串,索引从零开始,返回设置后的字符串长度。注意:只会替换到新值的长度的位置,多余的值不会被替换。例如:

127.0.0.1:6379> set email abeam@126.com

OK

127.0.0.1:6379> setrange email 6 ab.com

(integer) 13

127.0.0.1:6379> get email

"abeam@ab.comm"

 

7.   getrange

返回 key 的 value 值的子字符串,例如:

127.0.0.1:6379> getrange email 0 5

"abeam@"

 

8.   mset

一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了;失败返回0,表示没有人值被设置。例如:

127.0.0.1:6379> mset name abeam age 31

OK

 

9.   mget

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

127.0.0.1:6379> mget name age address

1) "abeam"

2) "31

3) (nil)

 

10.  msetnx

一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了;失败返回0,表示没有任何值被设置,但是不会覆盖已经存在的 key. 例如:

127.0.0.1:6379> msetnx name abeam2 age 32 sex 1

(integer) 0

127.0.0.1:6379> get sex

(nil)

 

11.  incr

对 key 的值做加1操作,并返回新的值。如果 key 不存在时会设置 key, 并认为原来的 value 为0。例如:

127.0.0.1:6379> incr age

(integer) 32

127.0.0.1:6379> incr age2   #不存在则添加,并将值视为0处理

(integer) 1

 

12.  incrby

与 incrby 类似,并可以自增或自减指定的值。例如:

127.0.0.1:6379> incrby age 5

(integer) 37

127.0.0.1:6379> incrby age -5

(integer) 32

 

13.  decr(与 incr 对立)

对 key 的值做减1操作,并返回新的值。如果 key 不存在时会设置 key, 并认为原来的 value 为0。例如:

127.0.0.1:6379> decr age

(integer) 31

127.0.0.1:6379> decr age3   #不存在则添加,并将值视为0处理

(integer) -1

 

14.  decrby(与 incrby 对立)

与 decrby 类似,并可以自减或自增指定的值。例如:

127.0.0.1:6379> decrby age 5

(integer) 26

127.0.0.1:6379> decrby age -5

(integer) 31

 

15.  append

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

127.0.0.1:6379> append name -abc

(integer) 10

127.0.0.1:6379> get name

"abeam2-abc"

 

16.  strlen

返回指定 key 的 value 值的长度。例如:

127.0.0.1:6379> strlen name

(integer) 10

 

2)   Hash 类型

Redis hash 是一个 string 类型的 field 和 value 的映射表。它的添加、删除操作都是0(1)(平均),hash 特别适合用于存储对象(或者一个 key 对应多个值的情况)。相较于将对象的每个字段存为单个 string 类型,将一个对象存储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。

1.   hset

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

127.0.0.1:6379> hset user1 name zhangsan age 20 sex 1

(integer) 3

 

2.   hget

根据指定的 hash 表名称和 field key 获取对应的值,例如:

127.0.0.1:6379> hget user1 name

"zhangsan"

 

3.   hsetnx

设置 hash field 为指定的值,如果 key 不存在则创建,否则返回0。例如:

127.0.0.1:6379> hsetnx user1 address 湖北利川

(integer) 1

127.0.0.1:6379> hsetnx user1 name lisi

(integer) 0

 

4.   hmset

同时设置 hash 的多个 field 的值,例如:

127.0.0.1:6379> hmset user1 name wangwu age 26 address 湖北

OK

 

5.   hmget

返回全部指定的 hash field 的值,例如:

127.0.0.1:6379> hmget user1 name age address

1) "wangwu"

2) "26"

3) "\xe6\xb9\x96\xe5\x8c\x97"

 

6.   hincrby

对指定的 hash field 进行相加指定的值,并返回相加后的值。例如:

127.0.0.1:6379> hincrby user1 age 10

(integer) 36

127.0.0.1:6379> hincrby user1 age -10

(integer) 26

 

7.   hexists

检查是否存在指定 hash 表名称或者 field,例如:

127.0.0.1:6379> hexists user1 name

(integer) 1

127.0.0.1:6379> hexists user1 field1    #field 不存在

(integer) 0

127.0.0.1:6379> hexists user2 name      #hash 表名不存在

(integer) 0

 

8.   hlen

返回指定 hash 中的 field 的数量,例如:

127.0.0.1:6379> hlen user1

(integer) 4

 

9.   hdel

删除指定 hash 中的 field,例如:

127.0.0.1:6379> hdel user1 address

(integer) 1

 

10.  hkeys

返回 hash 中所有的 field,例如:

127.0.0.1:6379> hkeys user1

1) "name"

2) "age"

3) "sex"

 

11.  hvals

返回 hash 中所有 field 的 value,例如:

127.0.0.1:6379> hvals user1

1) "wangwu"

2) "26"

3) "1"

 

12.  hgetall

返回某个 hash 中的全部 field 和 value,例如:

127.0.0.1:6379> hgetall user1

1) "name"

2) "wangwu"

3) "age"

4) "26"

5) "sex"

6) "1"

 

3)   List 类型

List 是一个链表结构,主要功能是 push、pop、获取一个范围的所有值等,操作中 key 理解为链表的名字。Redis 的 list 类型其实就是一个每个子元素都是 string 类型的双向链表,我们可以通过 push、pop 操作从链表的头部或者尾部添加删除元素,这样 list 既可以作为,又可以作为队列

1.   lpush

在 key 对应 list 的头部添加字符串元素,返回元素个数。添加多个元素时,前面的元素位于尾部,例如:

127.0.0.1:6379> lpush list1 world

(integer) 1

127.0.0.1:6379> lpush list1 hello

(integer) 2

 

2.   lrange

返回 list 中从头到尾的指定元素,第一个索引表示起始索引,第二个索引表示结束索引(-1 表示取到最后一个元素),例如:

127.0.0.1:6379> lrange list1 0 -1

1) "hello"

2) "world"

 

3.   rpush

在 key 对应 list 的尾部添加字符串元素,返回元素个数。例如:

127.0.0.1:6379> rpush list2 world

(integer) 1

127.0.0.1:6379> rpush list2 hello

(integer) 2

 

4.   linsert

在 key 对应 list 的特定位置之前或之后添加字符串元素,如果存在多个指定的元素,则以第一个元素为准,返回插入后元素个数。例如:

127.0.0.1:6379> linsert list2 before hello –

(integer) 3

127.0.0.1:6379> lrange list2 0 -1

1) "world"

2) "-"

3) "hello"

 

5.   lset

设置 list 中指定下标的元素值。如果指定的 list key 不存在,或者下标不存在,则将报错。例如:

127.0.0.1:6379> lset list2 1 &

OK

127.0.0.1:6379> lrange list2 0 -1

1) "world"

2) "&"

3) "hello"

 

6.   lrem

从 key 对应的 list 中删除 n 个和 value 相同的元素,n>0从头部删除,n<0从尾部删除,n=0全部删除,返回删除掉的个数。例如:

127.0.0.1:6379> lpush list4 one two one

(integer) 3

127.0.0.1:6379> lrem list4 1 one

(integer) 1

127.0.0.1:6379> lrange list4 0 -1

1) "two"

2) "one"

 

7.   ltrim

保留指定 key 的值范围内的元素,将其他元素删除。例如:

127.0.0.1:6379> lpush list5 one two three four

(integer) 4

127.0.0.1:6379> ltrim list5 1 -1    #只保留索引1到最后一个元素

OK

127.0.0.1:6379> lrange list5 0 -1

1) "three"

2) "two"

3) "one"

 

8.   lpop

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

127.0.0.1:6379> lpush list6 one two three

(integer) 3

127.0.0.1:6379> lpop list6

"three"

127.0.0.1:6379> lrange list6 0 -1

1) "two"

2) "one"

 

9.   rpop

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

127.0.0.1:6379> lrange list6 0 -1

1) "two"

2) "one"

127.0.0.1:6379> rpop list6

"one"

127.0.0.1:6379> lrange list6 0 -1

1) "two"

 

10.  rpoplpush

从第一个 list 的尾部移除元素,并添加到第二个 list 的头部,例如:

127.0.0.1:6379> lrange list7 0 -1

1) "one"

2) "two"

127.0.0.1:6379> lrange list8 0 -1

1) "three"

2) "four"

127.0.0.1:6379> rpoplpush list7 list8

"two"

127.0.0.1:6379> lrange list7 0 -1

1) "one"

127.0.0.1:6379> lrange list8 0 -1

1) "two"

2) "three"

3) "four"

 

11.  lindex

返回 list 中指定 index 位置的元素,索引不存在时返回(nil)。例如:

127.0.0.1:6379> lrange list8 0 -1

1) "two"

2) "three"

3) "four"

127.0.0.1:6379> lindex list8 1

"three"

 

12.  llen

返回指定 list 的元素长度(数量),例如:

127.0.0.1:6379> llen list8

(integer) 3

 

4)   Set 类型

Set 是集合,它是 string 类型的无序集合。set 是通过 hash table 实现的,添加、删除和查找的复杂度都是0(1)。对集合我们可以取并集、交集、差集通过这些操作我们可以实现 sns 中的好友推荐和 blog 的 tag 功能。

1.   sadd

向名称为 key 的 set 中添加元素,注意:添加的元素不会出现重复。例如;

127.0.0.1:6379> sadd set1 hello world hello     #有相同的两个 hello

(integer) 2

 

2.   smembers

返回指定 set 中的所有元素,例如:

127.0.0.1:6379> smembers set1

1) "hello"

2) "world"

 

3.   srem

删除一个或多个指定 set 中的元素,返回删除元素的数量。例如:

127.0.0.1:6379> srem set1 hello world

(integer) 2

127.0.0.1:6379> smembers set1

(empty list or set)

 

4.   spop

随机删除指定 set 和【数量(默认为1)】的元素,并返回该元素,例如:

127.0.0.1:6379> sadd set2 one two three

(integer) 3

127.0.0.1:6379> spop set2

"one"

127.0.0.1:6379> spop set2 1     #指定删除的数量

"three"

127.0.0.1:6379> smembers set2

1) "two"

 

5.   sdiff

返回指定两个 set 中元素的差集(以第一个集合为标准),例如:

127.0.0.1:6379> sadd set3 one two three four

(integer) 4

127.0.0.1:6379> sadd set4 two four five

(integer) 3

127.0.0.1:6379> sdiff set3 set4

1) "one"

2) "three"

 

6.   sdiffstore

将指定两个 set 中元素的差集存储到另一个 set 中,例如:

127.0.0.1:6379> sdiffstore set5 set3 set4   #将差集存到 set5 中

(integer) 2

127.0.0.1:6379> smembers set5

1) "one"

2) "three"

 

7.   sinter

返回指定两个 set 中元素的交集,例如:

127.0.0.1:6379> sinter set3 set4

1) "four"

2) "two"

 

8.   sinterstore

将指定两个 set 中元素的交集存储到另一个 set 中,例如:

127.0.0.1:6379> sinterstore set6 set3 set4  #将交集存到 set6 中

(integer) 2

127.0.0.1:6379> smembers set6

1) "four"

2) "two"

 

9.   sunion

返回所有指定的 set 中元素的并集,例如:

127.0.0.1:6379> sunion set4 set5 set6

1) "five"

2) "two"

3) "three"

4) "four"

5) "one"

 

10.  sunionstore

将所有指定的 set 中元素的并集存储到另一个 set 中,例如:

127.0.0.1:6379> sunionstore set7 set4 set5 set6 #将并集存到 set7 中

(integer) 5

127.0.0.1:6379> smembers set7

1) "five"

2) "two"

3) "three"

4) "four"

5) "one"

 

11.  smove

从第一个 set 中移除指定的元素,并添加到第二个 set 中,例如:

127.0.0.1:6379> smove set7 set8 five

(integer) 1

127.0.0.1:6379> smembers set7

1) "two"

2) "three"

3) "four"

4) "one"

127.0.0.1:6379> smembers set8

1) "five"

 

12.  scard

返回指定 set 中的元素个数,例如:

127.0.0.1:6379> scard set7

(integer) 4

 

13.  sismember

检查指定 set 中是否存在指定的元素,例如:

127.0.0.1:6379> sismember set7 five

(integer) 0

127.0.0.1:6379> sismember set7 four

(integer) 1

 

14.  srandmember

随机返回指定 set 中指定数量的元素,数量不指定则默认为1;但不删除返回的元素。例如:

127.0.0.1:6379> srandmember set7 2

1) "three"

2) "two"

127.0.0.1:6379> srandmember set7 2

1) "one"

2) "two"

 

5)   Sorted Set 类型

Sorted Set 是 set 的一个升级版本,它在 set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset 会自动重新按新的值调整顺序。可以理解为有两列的 mysql 表,一列存 value,一列存顺序。操作中 key 理解为 zset 的名字。注意:zset 中顺序号是可以重复的!

1.   zadd

在名称为 key 的 zset 中添加元素和顺序,如果该元素存在,则更新其顺序。例如:

127.0.0.1:6379> zadd zset1 1 one

(integer) 1

127.0.0.1:6379> zadd zset1 2 two 3 three

(integer) 2

 

2.   zrange

返回指定 zset 中的指定索引范围内的所有元素,按顺序号从小到大排序,withscores 用于表示是否返回顺序号,例如:

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

 

3.   zrevrange

返回指定 zset 中的指定索引范围内的所有元素,按顺序号从大到小排序,withscores 用于表示是否返回顺序号,例如:

127.0.0.1:6379> zrevrange zset1 0 -1 withscores

1) "three"

2) "3"

3) "two"

4) "2"

5) "one"

6) "1"

 

4.   zrem

删除 zset 中 N 个指定的元素,并返回删除元素的个数,例如:

127.0.0.1:6379> zrem zset1 two three four

(integer) 2

127.0.0.1:6379> zrange zset1 0 -1

1) "one"

 

5.   zincrby

如果在名称为 key 的 zset 中已经存在元素 member, 则该元素的 score 增加 increment,否则向该集合中添加该元素,其 score 的值为 increment。例如:

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

127.0.0.1:6379> zincrby zset1 1 one     #one 元素的顺序号自增1

"2"

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "one"

2) "2"

3) "two"

4) "2"

 

6.   zrank

返回 zset 中按 score(即顺序号)从小到大排序后的指定 member 元素的索引。例如:

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

127.0.0.1:6379> zrank zset1 two

(integer) 1

 

7.   zrevrank

返回 zset 中按 score(即顺序号)从大到小排序后的指定 member 元素的索引。例如:

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

127.0.0.1:6379> zrevrank zset1 one

(integer) 2

 

8.   zrangebyscore

返回 zset 中指定 score 区间的元素,例如:

127.0.0.1:6379> zrangebyscore zset1 1 2 withscores

1) "one"

2) "1"

3) "two"

4) "2"

设置一个范围(分页):

127.0.0.1:6379> zrangebyscore zset1 1 10 withscores limit 1 2

1) "two"

2) "2"

3) "three"

4) "3"

 

9.   zcount

返回 zset 中指定 score 区间元素的数量,例如:

127.0.0.1:6379> zcount zset1 1 2

(integer) 2

 

10.  zcard

返回 zset 中的所有元素的数量,例如:

127.0.0.1:6379> zcard zset1

(integer) 3

 

11.  zremrangebyrank

删除 zset 中按 score 从小到大排名后索引在指定区间的元素,例如:

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

127.0.0.1:6379> zremrangebyrank zset1 1 1

(integer) 1

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "one"

2) "1"

 

12.  zremrangebyscore

删除 zset 中按 score 从小到大排名后顺序号在指定区间的元素,例如:

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

127.0.0.1:6379> zremrangebyscore zset1 1 2

(integer) 2

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "three"

2) "3"

 

2.   Redis 的常用命令

Redis 提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在 Linux 终端使用。

1)   键值相关命令

1.   keys

返回满足指定 pattern 的所有 key, 例如:

127.0.0.1:6379> keys *      #表达式"*",表示取出所有 key

1) "set6"

2) "age"

或者

127.0.0.1:6379> keys list*  #表示以"list"开头的所有 key

1) "list4"

2) "list6"

 

2.   exists

检查指定的 key 是否存在,存在返回1,否则返回0。例如:

127.0.0.1:6379> exists list5

(integer) 1

127.0.0.1:6379> exists list123

(integer) 0

 

3.   del

删除指定的一个或多个 key, 只要一个删除成功则返回1,否则返回0。例如:

127.0.0.1:6379> del list5

(integer) 0

127.0.0.1:6379> del list5 list6

(integer) 1

127.0.0.1:6379> del list5 list6

(integer) 0

 

4.   expire

设置指定 key 的过期时间,单位为秒,例如:

127.0.0.1:6379> expire key1 10      #key 不存在时返回0

(integer) 0

127.0.0.1:6379> set key1 value1

OK

127.0.0.1:6379> expire key1 10      #设置成功时返回1

(integer) 1

127.0.0.1:6379> exists key1         #10秒后自动销毁

(integer) 0

 

5.   ttl

返回指定 key 剩余的有效时间,单位为秒;-1表示没有过期时间;-2表示已经过期。例如:

127.0.0.1:6379> ttl key1    #剩余7秒过期

(integer) 7

127.0.0.1:6379> ttl key1    #-2表示已经过期

(integer) -2

 

6.   persist

取消指定 key 的过期时间,例如:

127.0.0.1:6379> setex key3 30 value3    #30秒过期

OK

127.0.0.1:6379> ttl key3

(integer) 27

127.0.0.1:6379> persist key3            #取消过期时间

(integer) 1

127.0.0.1:6379> ttl key3               #没有过期时间

(integer) -1

127.0.0.1:6379> get key3

"value3"

 

7.   move

将当前数据库中的 key 移动到其他数据库中,例如:

127.0.0.1:6379> select 0            #进入0数据库

OK

127.0.0.1:6379> set key2 value2

OK

127.0.0.1:6379> move key2 1

(integer) 1

127.0.0.1:6379> get key2

(nil)

127.0.0.1:6379> select 1            #进入1数据库

OK

127.0.0.1:6379[1]> get key2

"value2"

 

8.   randomkey

随机返回数据库中的 key, 例如:

127.0.0.1:6379> randomkey

"set4"

 

9.   rename

重命名指定的 key, 例如:

127.0.0.1:6379> exists key3

(integer) 1

127.0.0.1:6379> rename key3 key3-3

OK

127.0.0.1:6379> exists key3

(integer) 0

127.0.0.1:6379> get key3-3

"value3"

 

10.  type

返回指定 key 的数据类型,例如:

127.0.0.1:6379> type name

string

127.0.0.1:6379> type user1

hash

127.0.0.1:6379> type list1

list

127.0.0.1:6379> type set2

set

127.0.0.1:6379> type zset1

zset

 

2)   服务器相关命令

1.   ping

检测连接是否存活,例如:

127.0.0.1:6379> ping        #连接正常

PONG

127.0.0.1:6379> ping        #关闭 redis-server 后,连接失败

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

 

2.   echo

在命令行打印指定的内容,例如:

127.0.0.1:6379> echo abeam_2019-10-01

"abeam_2019-10-01"

 

3.   select

选择指定的数据库,Redis 数据库编号默认为16个,编号从0~15,我们可以选择任意一个数据库来进行数据的存储。例如:

127.0.0.1:6379[1]> select 0

OK

 

4.   quit | exit

退出客户端的连接,例如:

127.0.0.1:6379> quit

或者

127.0.0.1:6379> exit

或者 Ctrl + C

 

5.   dbsize

返回当前数据库中所有 key 的数量,例如:

127.0.0.1:6379> dbsize

(integer) 22

 

6.   info

获取 Redis 服务器的信息和统计,例如:

127.0.0.1:6379> info

# Server

redis_version:5.0.5

# Keyspace

db0:keys=22,expires=0,avg_ttl=0

db1:keys=1,expires=0,avg_ttl=0

 

7.   config get

获取指定的 Redis 配置信息的值,例如:

127.0.0.1:6379> config get dir      #返回 dir 的配置信息

1) "dir"

2) "/root"

127.0.0.1:6379> config get *        #返回所有的配置信息

  1) "dbfilename"

  2) "dump.rdb"

 

8.   flushdb

删除当前数据库中的所有 key, 例如:

127.0.0.1:6379[1]> keys *

1) "key2"

127.0.0.1:6379[1]> flushdb

OK

127.0.0.1:6379[1]> dbsize

(integer) 0

 

9.   flushall

删除所有数据库中的所有 key, 例如:

127.0.0.1:6379> dbsize

(integer) 22

127.0.0.1:6379> select 1

OK

127.0.0.1:6379[1]> dbsize

(integer) 2

127.0.0.1:6379[1]> flushall

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) 0

 

10.  auth

设置 Redis 客户端请求的密码,例如:

127.0.0.1:6379> auth abeam

OK

这篇关于Redis 的数据类型与常用命令的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!