Ø 简介
本文主要记录 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