四.Redis数据类型

本文最后更新于:2021年11月14日 下午

Redis数据类型

一.String字符串类型

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
########################################################################
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set key1 v1 #设置key1的值为v1
OK
127.0.0.1:6379> get key1 #获取key1的值
"v1"
127.0.0.1:6379> exists key1 #判断是否存在名为key1的键
(integer) 1
127.0.0.1:6379> append key1 "hello" #在key1上追加字符串,若key不存在,相当于set key value
(integer) 7
127.0.0.1:6379> keys *
1) "key1"
127.0.0.1:6379> append key2 "abcde" #key2不存在,因此新建key2,并设置value
(integer) 5
127.0.0.1:6379> keys *
1) "key2"
2) "key1"
127.0.0.1:6379> strlen key1 #获取key的长度
(integer) 7
127.0.0.1:6379> append key1 "12345"
(integer) 12
127.0.0.1:6379> strlen key1
(integer) 12
127.0.0.1:6379> get key1
"v1hello12345"
#########################################################################
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views #自增1
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> decr views #自减1
(integer) -1
127.0.0.1:6379> get views
"-1"
127.0.0.1:6379> incrby views 10 #设置步长,相当于views = views+10
(integer) 9
127.0.0.1:6379> get views
"9"
127.0.0.1:6379> decrby views 8 #设置步长,相当于views = views-10
(integer) 1
127.0.0.1:6379> get views
"1"
################################################################
#获取一个字符串指定范围的字串 getrange key start end //end为负的就获取全部串
127.0.0.1:6379> set key1 helloworld
OK
127.0.0.1:6379> get key1
"helloworld"
127.0.0.1:6379> getrange key1 0 3 #截取字串[0,3]
"hell"
127.0.0.1:6379> getrange key1 0 -1
"helloworld"

#替换指定范围的字串 setrange key offset new_value 从指定的偏移量开始将key的值替换为new_value
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 2 123
(integer) 7
127.0.0.1:6379> get key2
"ab123fg"
###############################################################
#setex (set with expire) 设置过期时间
#setnx (set if not exist) 如果不存在再设置
127.0.0.1:6379> setex key3 30 "hello" //设置keys的值为hello,且过期时间为30秒
OK
127.0.0.1:6379> get key3 //未达到过期时间,可以查到key3
"hello"
127.0.0.1:6379> ttl key3 //key3的剩余时间
(integer) 23
127.0.0.1:6379> setnx mykey 123456 //如果mykey不存在,设置mykey的值
OK
127.0.0.1:6379> ttl key3 //key3已经过期
(integer) -2
127.0.0.1:6379> keys * //查看所有keys,因为key3已将过期,所以不存在key3
1) "mykey"
2) "key2"
3) "key1"
127.0.0.1:6379> setnx mykey "566868" //如果mykey不存在,那么设置值为566868
(integer) 0
127.0.0.1:6379> get mykey //因为mykey一直存在,所以上面的setnx没有成功,返回值为0,
"123456" //mykey还是原来的值
###############################################################
mset key1 value1 key2 value2 ...... 批量设置键值
mget key1 key2......批量获取键值
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 m1 k4 v4 //mset是原子性操作,要么全部成功,要么全部失败,类似事务,因为k1存在,set失败,所以k4的设置也失败,下面看到返回值为0,key4为null,k1的值不变
(integer) 0
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379> get k1
"v1"

##设置一个对象
set user:1 {name:zhangsan,age:18} #设置一个user:1对象的值为json字符串来保存一个对象
#这里的key很巧妙,user:{uid}:{属性},如此设置在redis中完全ok
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 18
OK //他把user:1:name当做一个key来存,user:1:age当做一个key来存
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "18"

//getset 组合命令,先获取再设置

127.0.0.1:6379> getset db redis //如果事先没有值,则返回null
(nil)
127.0.0.1:6379> getset db mongodb //如果当前存在值,则返回当前值在设置
"redis"
127.0.0.1:6379> get db
"mongodb"
###################################################

String类的使用场景: value可以使字符串,还可以是数字

  • 做计数器
  • 统计多单位的数量 uid:123455:follower 0
  • 粉丝数
  • 对象缓存存储

二.List类型

在redis中,list可以当做栈,队列,双端队列,或阻塞队列来使用

所有有关list的命令,都是字母’L’开头的

基本命令使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
key为操作的列表的名字
- LPUSH key value [value....] 从队列的左边入队一个或多个元素
ps: 在队列中,编号是从左到右为0,1,2,3,如果前面LPUSH一个元素后,他的编号为0,继续LPUSH一个元素,此时他的编号变成了1
- LPUSHX key value 如果队列存在,从队列的左边入队一个元素
- LRANGE key start end 从列表中取出指定编号范围内的元素,0,-1为取出所有
- LREM key count value 从列表中删除元素,注意元素的value必须明确指定,count为删除的value的个数
- LSET key index value 设置列表中编号为index的元素的值
- LTRIM key start end 修建指定范围内的数据,语句执行结束后,原来的key中只保存范围内的值,其他的都被删除
- RPOP key 从队列的右边出队一个元素
- RPOPLPUSH source destination 删除source列表中最后一个元素(pop出最右边的),并追加到另一个列表(并加到另一个队列左边)
- RPUSH key value [value....] 从队列的右边入队一个或多个元素
- RPUSHX key value 如果队列存在,从队列的右边入队一个元素
- LLEN key 获取列表key的元素个数
- LINSERT key [BEFORE/AFTER] pivot value 在列表key的元素pivot前面或后面插入元素value

如果key不存在,push时创建列表

如果移除了key的所有值,key为空链表,也相当于不存在

在llist的两边插入或改动元素时,效率最高,修改中间元素或插到中间,效率相低

适用场景:消息排队,消息队列(LPUSH,RPOP),栈(LPUSH,LPOP)

三.Set类型

与java中的set类似,不允许元素重复

与set相关的命令,都以字母‘S’开头

基本命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
- SADD key member [member...]	添加一个或多个元素到集合中
- SCARD key 获取集合中的元素数量
- SISMEMBER key member 判断member元素是否在集合key
- SMEMBERS key 获取集合中的所有元素
- SMOVE source destination member 把集合source中的一个元素member移动到另一个集合中,source中将不再有该member
- SREM key member [member...] 删除集合中的一个或多个元素
- SPOP key [count] 删除并获取集合中的一个元素,由于元素时无序的,因此pop出哪一个不知道,count指定个数
- SRANDMEMBER key [count] 从集合中随机取获取一个元素
- SDIFF key1 key2 求key1与key2的差集,即key1中存在,但是key2中不存在的
- SINTER key [key...] 求集合间的交集
- SINTERSTORE destination key [key...] 求集合间的交集,并保存新集合destination中
- SUNION key [key...] 求集合间的并集
- SUNIONSTORE destination key [key...] 求集合间的并集,并保存新集合destination中

适用场景:

微博中,将A用户的所有关注的人放在一个set集合中,将他的粉丝也放到一个集合中

共同关注求交集,求推荐好友等

四.Hash(哈希)

Map集合,key为一个集合,存放的元素为kv对

和string的集合差不对,只不过string集合存放单个value,Map集合存放kv

基本命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
- HSET key field value	设置集合key中的kv对
- HSETNX key field value 如果当前的kv不存在,设置kv
- HMSET key field value [field value....] 批量设置集合key中的kv对
- HGET key field 获取集合key中键为field的value
- HGETALL key 读取key中的所有域和值,field和value都有
- HMGET key field [field...] 批量获取集合key中键为field的value
- HLEN key 获取key集合中所有字段的数量
- HKEYS key 获取key中的所有field字段
- HVALS key 获取key中的所有value值
- HEXISTS key field 判断field是否存在于key
- HDEL key field [field...] 删除一个或多个field,对应的value也会删除
- HINCRBY key field increment 将key中指定域的值(value)增加给定的数字
- HINCRBYFLOAT key field increment 将key中指定域的值(value)增加给定的浮点数

相对于String类型,hash更适合对象的存储,string更适合字符串的存储,当然也可以用string存储对象

五.Zset(有序集合)

在set的基础上,增加了一个score值 set key value zset key score value

基本命令:

1
2
3
4
5
6
7
- ZADD key score member [score member....]添加一个或多个成员到一个有序的set,如果已经存在,那么更新分数
- ZCARD key 获取一个排序集合中成员的数量
- ZCOUNT key min max 返回分数在指定范围内的成员数量
- ZINCRBY key increment member 将指定的成员的score增加increment
- ZRANGE key start stop 根据指定的index返回范围内的成员
- ZRANK key member 返回member在排序集合中的索引
- ZREM key member 删除一个成员

适用场景:

对set排序,班级成绩,工资排序,带权重的成员,排行榜等等

六.三种特殊的类型

  • Geospatial 地理位置类型
  • Hyperlog 基数统计类型
  • Bitmap 位图场景

写吐了,需要用的时候还是查官方文档吧。。。🐶

参考链接

redis中文官方网站

Command reference – Redis


本文作者: ziyikee
本文链接: https://ziyikee.fun/2021/11/11/%E5%9B%9B-Redis%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!