前言

Redis是一个Key-Value的存储系统,使用ANSI C语言编写。

本文主要来介绍下Redis的key和value的几种数据类型及常见的命令。

key的类型是字符串

value的数据类型有: 常用的:string字符串类型、list列表类型、set集合类型、sortedset(zset)有序集合类型、hash类型。 不常见的:bitmap位图类型、geo地理位置类型。

Redis5.0新增一种:stream类型

注意:Redis中命令是忽略大小写,(set SET),key是不忽略大小写的 (NAME name)

Key的设计

常见做法:

  1. 用冒号:分隔
  2. 把表名转换为key的前缀,比如 user:
  3. 第二段放主键值
  4. 第三段放列名

例如:

用户表user,其中一条记录如下:

userIduserNamepasswordemail
3zhangsan123zhangsan@qq.com

这条记录的username的key可以这样写:user:3:username

对应的value可以是{userId:3,userName:zhangsan}

email的key可以这样设计:user:3:email

好处:这样设计看到key就可以明确知道这条数据代表的意思,不容易被别的key覆盖

Value的数据类型

String字符串类型

Redis的String能表达3种值的类型:字符串、整数、浮点数 。

比如100.01 在redis中是个六位的字符串

命令名称描述
setset key value赋值
getget key取值
getsetgetset key value取值并赋值
setnxsetnx key value当value不存在时采用赋值,set key value NX PX 3000 原子操作,px 设置毫秒数
incrincr key递增数字

应用场景:

  1. 普通的赋值
  2. incr用于乐观锁

incr:递增数字,可用于实现乐观锁 watch(事务)

  1. setnx用于分布式锁

当value不存在时采用赋值,可用于实现分布式锁

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
127.0.0.1:6379> set age 18 NX PX 10000 #如果不存在赋值 有效期10秒

OK

127.0.0.1:6379> set age 20 NX #赋值失败

(nil)

127.0.0.1:6379> get age #age失效

(nil)

127.0.0.1:6379> set age 30 NX PX 10000 #赋值成功

OK

127.0.0.1:6379> get age

"30"

list 列表类型

list列表类型可以存储有序、可重复的元素 获取头部或尾部附近的记录是极快的 list的元素个数最多为2^32-1个(40亿)

命令名称命令格式描述
lpushlpush key v1 v2 v3 ...从左侧插入列表
lpoplpop key从列表左侧取出
rpushrpush key v1 v2 v3 ...从右侧插入列表
rpoprpop key从列表右侧取出
lpushxlpushx key value将值插入到列表头部
rpushxrpushx key value将值插入到列表尾部
blpopblpop key timeout从列表左侧取出,当列表为空时阻塞,可以设置最大阻塞时 间,单位为秒
brpopblpop key timeout从列表右侧取出,当列表为空时阻塞,可以设置最大阻塞时 间,单位为秒
llenllen key获得列表中元素个数
lindexlindex key index获得列表中下标为index的元素 index从0开始
lrangelrange key start end返回列表中指定区间的元素,区间通过start和end指定
lsetlset key index value将列表index位置的元素设置成value的值
rpoplpushrpoplpush key1 key2从key1列表右侧弹出并插入到key2列表左侧
brpoplpushbrpoplpush key1 key2从key1列表右侧弹出并插入到key2列表左侧,会阻塞

举例:

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
127.0.0.1:6379> lpush list:1 1 2 3 4 5 3

(integer) 5

127.0.0.1:6379> lrange list:1 0 -1
"5"
"4"
"3"
"2"
"1"

127.0.0.1:6379> lpop list:1 # 从0开始
"5"

127.0.0.1:6379> rpop list:1
"1"

127.0.0.1:6379> lindex list:1 1
"3"

127.0.0.1:6379> lrange list:1 0 -1
"4"
"3"
"2"

127.0.0.1:6379> lindex list:1 1
"3"

127.0.0.1:6379> rpoplpush list:1 list:2
"2"

127.0.0.1:6379> lrange list:2 0 -1
"2"

127.0.0.1:6379> lrange list:1 0 -1
"4"
"3"

应用场景:

  1. 可作为栈或队列使用;
  2. 可用于各种列表,比如用户列表、商品列表、评论列表等。

Set集合类型

Set:无序、唯一元素

集合中最大的成员数为 2^32 - 1

常见操作命令如下表 :

命令名称命令格式描述
saddsadd key mem1 mem2 ....为集合添加新成员
sremsrem key mem1 mem2 ....删除集合中指定成员
smemberssmembers key获得集合中所有元素
spopspop key返回集合中一个随机元素,并将该元素删除
srandmembersrandmember key返回集合中一个随机元素,不会删除该元素
scardscard key获得集合中元素的数量
sismembersismember key member判断元素是否在集合内

举例:

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
127.0.0.1:6379> sadd set:1 a b c d

(integer) 4

127.0.0.1:6379> smembers set:1

"d"
"b"
"a"
"c"

127.0.0.1:6379> srandmember set:1
"c"

127.0.0.1:6379> srandmember set:1
"b"

127.0.0.1:6379> sadd set:2 b c r f

(integer) 4

127.0.0.1:6379> sinter set:1 set:2
"b"
"c"

127.0.0.1:6379> spop set:1
"d"

127.0.0.1:6379> smembers set:1
"b"
"a"
"c"

sortedset 有序集合类型

SortedSet(ZSet) 有序集合: 元素本身是无序不重复的 ,每个元素关联一个分数(score) 可按分数排序,分数可重复

命令名称命令格式描述
zaddzadd key score1 member1 score2 member2 ...为有序集合添加新成员
zremzrem key mem1 mem2 ....删除有序集合中指定成员
zcardzcard key获得有序集合中的元素数量
zcountzcount key min max返回集合中score值在[min,max]区间 的元素数量
zincrbyzincrby key increment member在集合的member分值上加increment
zscorezscore key member获得集合中member的分值
zrankzrank key member获得集合中member的排名(按分值从 小到大)
zrevrankzrevrank key member获得集合中member的排名(按分值从 大到小)
zrangezrange key start end获得集合中指定区间成员,按分数递增 排序
zrevrangezrevrange key start end获得集合中指定区间成员,按分数递减 排序

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> zadd hit:1 100 item1 20 item2 45 item3
(integer) 3

127.0.0.1:6379> zcard hit:1
(integer) 3

127.0.0.1:6379> zscore hit:1 item3
"45"

127.0.0.1:6379> zrevrange hit:1 0 -1
"item1"
"item3"
"item2"

应用场景: 由于可以按照分值排序,所以适用于各种排行榜。比如:点击排行榜、销量排行榜、关注排行榜等。

hash类型(散列值)

Redis hash 是一个 string 类型的 field 和 value 的映射表,它提供了字段和字段值的映射。 每个 hash 可以存储 2^32 - 1 键值对(40多亿)。

命令名称命令格式描述
hsethset key field value赋值,不区别新增或修改
hmsethmset key field1 value1 field2 value2批量赋值
hsetnxhsetnx key field value赋值,如果filed存在则不操作
hexistshexists key filed查看某个field是否存在
hgethget key field获取一个字段值
hmgethmget key field1 field2 ...获取多个字段值
hgetallhgetall key获取所有字段及对应的值
hdelhdel key field1 field2...删除指定字段
hincrbyhincrby key field increment指定字段自增increment
hlenhlen key获得字段数量

举例:

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> hmset user:001 username zhangfei password 111 age 23 sex M

OK

127.0.0.1:6379> hgetall user:001
"username"
"zhangfei"
"password"
"111"
"age"
"23"
"sex"
"M"

127.0.0.1:6379> hget user:001 username
"zhangfei"

127.0.0.1:6379> hincrby user:001 age 1
(integer) 24

127.0.0.1:6379> hlen user:001
(integer) 4

不常见类型

bitmap位图类型

bitmap是进行位操作的 通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。 bitmap本身会极大的节省储存空间。

geo地理位置类型

geo是Redis用来处理位置信息的。在Redis3.2中正式使用。主要是利用了Z阶曲线、Base32编码和 geohash算法

stream数据流类型

stream是Redis5.0后新增的数据结构,用于可持久化的消息队列。 几乎满足了消息队列具备的全部内容,包括:

消息ID的序列化生成

消息遍历

消息的阻塞和非阻塞读取

消息的分组消费

未完成消息的处理

消息队列监控

每个Stream都有唯一的名称,它就是Redis的key,首次使用 xadd 指令追加消息时自动创建。

总结

  1. Redis的key是string类型;
  2. Redis的value类型常见的有五种,分别是String、list、set、sortedset、hash。不常见的有bitmap、geo、stream几种。