Redis的8种数据类型,什么场景使用?
Posted 何冬临
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis的8种数据类型,什么场景使用?相关的知识,希望对你有一定的参考价值。
Redis是一个KV存储系统,使用C语言编写的。我们的key是字符串类型,是唯一的,value的数据类型如下
5种常用的
- String字符串类型
- list列表类型
- set集合类型
- sortedset(zset)有序集合类型
- hash类型
2种不常用的
- bitmap位图类型
- geo地理位置类型
1种redis5.0新增的
- stream类型
既然key是字符串类型,那么key有没有一些约定俗成的一些规则,或者说一些建议的规则呢?
redis key如何设计?
- 一般使用冒号分隔
- 一般会把表名或者表名的缩写作为key的前缀
- 比如:认证系统的用户表的id为001的key, auth:user:001
- 命名要具有一定的识别性,一看就知道是什么意思
- key要尽量短一点,短key的效率比长key好一些,后面会讲到
1、String字符串
Redis的string能存储3种值的类型:字符串,整数,浮点数
1.1、应用场景
key和value都是字符串类型的应用场景极为广泛
- 普通的赋值操作
- 所有的kv存储都可以转换为value为字符串的存储,通过序列化转string,或者普通类型转string. 所以这种场景是最多的。
- incr可以加上watch监听,实现乐观锁
incr实现的是数字递增
- setnx可以实现分布式锁
- value不存在时,可以用于分布式锁,最终可以一个会设置成功,设置成功的就是抢到锁资源的
1.2、String字符串类型命令
命令行罗列
命令 | 帮助 | 描述 |
set | set key value | 赋值 |
get | get key | 取值 |
getset | getset key value | 取值赋值 |
setnx | setnx key value | 当key不存在时才赋值成功,存在时赋值失败set key value NX PX 3000 原子操作,可用于分布式锁,px 设置毫秒数 |
append | append key value | 向尾部追加值 |
strlen | strlen key | 获取字符串长度 |
incr | incr key | 递增数字 |
incrby | incrby key increment | 增加指定的整数 |
decr | decr key | 递减数字 |
decrby | decrby key decrement | 减少指定的整数 |
命令行实际操作
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> getset age 20
(nil)
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> setnx lock_01 1001
(integer) 1
127.0.0.1:6379> setnx lock_01 1001
(integer) 0
127.0.0.1:6379> setnx lock_01 1002
(integer) 0
127.0.0.1:6379> append name 1
(integer) 9
127.0.0.1:6379> get name
"zhangsan1"
127.0.0.1:6379> strlen name
(integer) 9
127.0.0.1:6379> incr myid
(integer) 1
127.0.0.1:6379> incrby myid 2
(integer) 3
127.0.0.1:6379> decr myid
(integer) 2
127.0.0.1:6379> decrby myid 2
(integer) 0
# 设置分布式锁后的值,有效期20s
127.0.0.1:6379> set lock_02 1002 NX PX 30000
OK
# 30s内重新设置值失败
127.0.0.1:6379> set lock_02 1002 NX
(nil)
# 30s内获取值成功
127.0.0.1:6379> get lock_02
"1002"
# 30s后获取值为空
127.0.0.1:6379> get lock_02
(nil)
# 重新设置值成功
127.0.0.1:6379> set lock_02 1003 NX PX 30000
OK
127.0.0.1:6379> get lock_02
"1003"
127.0.0.1:6379>
2、list列表
2.1、应用场景
list列表可以存储有序并且可以重复的元素。
- 获取头部或尾部的数据极快
- 列表最多存储2^32 -1个元素,大概40亿
看下面的命令,我们就知道这是一个双向列表。左进右出可以作为队列,左进左出可以作为栈使用。其实就是先进先出队列,后进先出为栈。
可以存储各种各样的列表数据。比如用户列表
2.2、list列表命令
命令罗列
命令 | 帮助 | 描述 |
lpush | lpush key v1 v2 n3 ... vn | 从左侧插入列表 |
lpop | lpop key | 从列表左侧取出 |
rpush | rpush key v1 v2 n3 ... vn | 从右侧插入列表 |
rpop | rpop key | 从列表右侧取出 |
lpushx | lpushx key value | 将值插入到列表头部 |
rpushx | rpushx key value | 将值插入到列表尾部 |
blpop | blpop key timeout | 从列表左侧取出,如果为空阻塞,timeout最大阻塞时间(s) |
brpop | brpop key timeout | 从列表右侧取出,如果为空阻塞,timeout最大阻塞时间(s) |
llen | llen key | 获得列表中元素个数 |
lindex | lindex key index | 获得列表中下标为index的元素 index从0开始 |
lrange | lrange key start end | 返回列表中指定区间的元素,区间通过start和end指定 |
lrem | lrem key count value | 删除列表中与value相等的元素当count>0时, lrem会从列表左边开始删除;当count<0时,lrem会从列表后边开始删除;当count=0时, lrem删除所有值为value的元素 |
lset | lset key index value | 将列表index位置的元素设置成value的值 |
ltrim | ltrim key start end | 对列表进行修剪,只保留start到end区间 |
rpoplpush | rpoplpush key1 key2 | 从key1列表右侧弹出并插入到key2列表左侧 |
brpoplpush | brpoplpush key1 key2 | 从key1列表右侧弹出并插入到key2列表左侧,会阻塞 |
linsert | linsert key BEFORE/AFTER pivot value | 将value插入到列表,且位于值pivot之前或之后 |
命令执行
127.0.0.1:6379> lpush name2 zhangsan lisi wangwu
(integer) 3
127.0.0.1:6379> lpop name2
"wangwu"
127.0.0.1:6379> rpush name3 zhangsan lisi wangwu
(integer) 3
127.0.0.1:6379> rpop name3
"wangwu"
127.0.0.1:6379> lpushx name2 niuqi
(integer) 3
127.0.0.1:6379> lrange name2 0 5
1) "niuqi"
2) "lisi"
3) "zhangsan"
127.0.0.1:6379> rpushx name3 niuqi
(integer) 3
127.0.0.1:6379> lrange name3 0 5
1) "zhangsan"
2) "lisi"
3) "niuqi"
127.0.0.1:6379> blpop name2 1
1) "name2"
2) "niuqi"
127.0.0.1:6379> brpop name3 1
1) "name3"
2) "niuqi"
127.0.0.1:6379> llen name2
(integer) 2
127.0.0.1:6379> lindex name2 0
"lisi"
127.0.0.1:6379> lindex name2 1
"zhangsan"
3、set集合
3.1、应用场景
Set集合,就是表示value唯一,并且无需的集合。
存储各种不需要顺序的数据集合。比如用户随机随机抽奖
3.2、Set集合命令
命令罗列
命令 | 帮助 | 描述 |
sadd | sadd key v1 v2 n3 ... vn | 为集合添加新成员 |
srem | srem key mem1 mem2 ...memn | 删除集合中指定成员 |
smembers | rsmembers key | 从获得集合中所有元素 |
spop | spop key | 返回集合中一个随机元素,并将该元素删除 |
srandmember | srandmember key | 将返回集合中一个随机元素,不会删除该元素 |
scard | scard key | 获得集合中元素的数量 |
sismember | sismember key member | 判断元素是否在集合内 |
sinter | sinter key1 key2 key3 | 求多集合的交集 |
sdiff | sdiffff key1 key2 key3 | 求多集合的差集 |
sunion | sunion key1 key2 key3 | 求多集合的并集 |
命令操作
127.0.0.1:6379> sadd name4 zhangsan lisi wangwu
(integer) 3
127.0.0.1:6379> srem zhangsan
(error) ERR wrong number of arguments for srem command
127.0.0.1:6379> srem name4 zhangsan
(integer) 1
127.0.0.1:6379> smembers name4
1) "lisi"
2) "wangwu"
127.0.0.1:6379> spop name4
"lisi"
127.0.0.1:6379> srandmember name4
"wangwu"
127.0.0.1:6379> scard name4
(integer) 1
127.0.0.1:6379> sismember name4 wangwu
(integer) 1
127.0.0.1:6379> sismember name4 wangwu
(integer) 1
# 定义两个集合 求交集,差集,并集
127.0.0.1:6379> sadd name5 zhangsan lisi
(integer) 2
127.0.0.1:6379> sadd name6 lisi wangwu
(integer) 2
127.0.0.1:6379> sinter name5 name6
1) "lisi"
127.0.0.1:6379> sdiff name5 name6
1) "zhangsan"
127.0.0.1:6379> sunion name5 name6
1) "lisi"
2) "wangwu"
3) "zhangsan"