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"

4、sortedset有序集合(zset)

以上是关于Redis的8种数据类型,什么场景使用?的主要内容,如果未能解决你的问题,请参考以下文章

最全Redis数据类型使用场景总结

Redis五种数据类型

[redis]redis五种数据类型和应用场景

Redis是单线程还是多线程?Redis的10种数据类型,有哪些应用场景?

redis五种数据类型的使用场景

Redis五种基本数据类型的典型应用场景