redis五种数据类型

redis提供了丰富的数据类型常见的五种分别是String(字符串),Hash(哈希),List(列表),Set(集合),Zset(有序集合)。

redis版本的更新后续又增了4种数据类型:BitMap(位),Geo(地理),Stream(流),HyperLogLog。

1.String(字符串)

定义:String是最基本的KEY_VALUE结构,key是唯一标识,value是具体值,value不仅可以使字符串,也可以是数字,value最多可以容纳数据长度512M。

内部实现:String类型的底层的数据结构实现主要是int和SDS(简单动态字符串)。

1.SDS不仅可以保存文本数据,还可以保存二进制数据。

2.SDS获取字符串长度的时间复杂度为O(1)

3.redis的SDS API是安全的,拼接字符串不会造成缓冲区溢出。

常用指令

普通字符串的基本操作
1.设置key_value类型的值

>SET name lin

2.根据key获得对应的value

>GET name

> lin

3.判断某个key是否存在

>EXISETS name

4.返回KEY所存储的字符串长度值

>STRLEN name

(integer) 3

5.删除某个key对应的值

DEL name

(integer) 1

批量设置
1.批量设置key-value的值

>MSET key1 value1 key2 value2

OK

2.批量获取多个key对应的值

>MGET key1 key2

>value1

>value2

计数器
1.设置key-value类型的值

>SET number 0

>OK

2.将key中储存的值增一

>INCR number

(integer) 1

3.将key中储存的数字值加十

>INCRBY number 10

(integer) 11

4.将key中储存的值进行减一

>DECR number

(integer) 10

5.将key中储存的值进行减十

DECRBY number 10

(integer) 0

过期
1.设置key的值60s后过期

EXPIRE name 60

(integer) 1

2,查看数据还有多就过期

TTL name

(integer) 51

3.设置key_value类型的值,并设置该key的过期时间为60s

> SET key value EX 60

OK

> SETEX key 60

value

OK

应用场景

缓存对象

使用 String 来缓存对象有两种方式:

• 直接缓存整个对象的 JSON,命令例子: SET user:1 '{"name":"xiaolin", "age":18}'。

• 采用将 key 进行分离为 user:ID:属性,采用 MSET 存储,用 MGET 获取各属性值,命令例子: MSET user:1:name xiaolin user:1:age 18 user:2:name xiaomei user:2:age 20。

常规计数

因为 Redis 处理命令是单线程,所以执行命令的过程是原子的。因此 String 数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等等。

2.List(列表)

定义:List列表是简单的字符串列表,按照i插入顺序进行排序,列表的最大长度为2^32-1。

内部实现:List类型的底层数据结构是由双向链表和压缩列表实现的

常用命令

1.将·一个或多个值value插入到列表表头

>LPUSH key value [value...]

2.将·一个或多个值value插入到列表表尾

>RPUSH key value [value...]

3.移除并返回key列表的头元素

LPOP key

4.移除并返回key列表的尾元素

RPOP key

5.返回列表指定区间内的元素

LRANGE key start stop

6.从key列表表头弹出一个元素,没有就阻塞timeout秒,如果timeout=0则一直阻塞

BLPOP key [key ...] timeout

7.从key列表表尾弹出一个元素,没有就阻塞timeout秒,如果timeout=0则一直阻塞

BRPOP key [key ...] timeout

应用场景

消息队列

消息队列在存取消息时,必须要满足三个需求,分别是消息保序、处理重复的消息和保证消息可靠性。

1.如何满足消息保序需求?

List本身就是按先进先出的顺序对数据进行存取的,所以List作为消息队列保存消息的话,就能已经满足消息保序的需求了。

List可以使用LPUAH和RPOP命令实现消息队列。

2.如何处理重复消息?

消费者要实现重复消息的判断,需要 2 个方面的要求:

• 每个消息都有一个全局的 ID。

• 消费者要记录已经处理过的消息的 ID。当收到一条消息后,消费者程序就可以对比收到的消息

ID 和记录的已处理过的消息 ID,来判断当前收到的消息有没有经过处理。如果已经处理过,

那么,消费者程序就不再进行处理了。

但是 List 并不会为每个消息生成 ID 号,所以我们需要自行为每个消息生成一个全局唯一ID,生

之后,我们在用 LPUSH 命令把消息插入 List 时,需要在消息中包含这个全局唯一 ID。

3.如何保证消息的可靠性?

当消费者程序从 List 中读取一条消息后,List 就不会再留存这条消息了。所以,如果消费者程序

在处理消息的过程出现了故障或宕机,就会导致消息没有处理完成,那么,消费者程序再次启

动后,就没法再次从 List 中读取消息了。

为了留存消息,List 类型提供了 BRPOPLPUSH 命令,这个命令的作用是让消费者程序从一个 List

中读取消息,同时,Redis 会把这个消息再插入到另一个 List(可以叫作备份 List)留存。

总结

消息保序:使用LPUSH+RPOP

阻塞读取:使用BRPOP

重复消息处理:生产者自行实现全局唯一实例ID

消息的可靠性:使用BRPOPLPUSH

3.Hash(哈希)

定义:Hash 是一个键值对(key - value)集合,其中 value 的形式如: value=[{field1,

value1},...{fieldN,valueN}]。Hash 特别适合用于存储对象。

内部实现:Hash 类型的底层数据结构是由压缩列表或哈希表实现的。

常用命令

1.存储一个哈希表key的键值

HSET key field value

2. 获取哈希表key对应的field键值

HGET key field

3. 在一个哈希表key中存储多个键值对

HMSET key field value

field value...

4.批量获取哈希表key中多个field键值

HMGET key field

field ...

5. 删除哈希表key中的field键值

HDEL key field

field ...

6.返回哈希表key中field的数量

HLEN key

7.返回哈希表key中所有的键值

HGETALL key

8.为哈希表key中field键的值加上增量n

HINCRBY key field n

应用场景

缓存对象

Hash 类型的 (key,field, value) 的结构与对象的(对象id, 属性, 值)的结构相似,也可

以用来存储对象。

4.Set(集合)

定义:Set 类型是一个无序并唯一的键值集合,它的存储顺序不会按照插入的先后顺序进行存储。

内部实现:Set 类型的底层数据结构是由哈希表或整数集合实现的。

常用命令

1. 往集合key中存入元素,元素存在则忽略,若key不存在则新建

SADD key member

member ...

2. 从集合key中删除元素

SREM key member

member ...

3.获取集合key中所有元素

SMEMBERS key

4.获取集合key中的元素个数

SCARD key

5.判断member元素是否存在于集合key中

SISMEMBER key member

6. 从集合key中随机选出count个元素,元素不从key中删除

SRANDMEMBER key

count

7.从集合key中随机选出count个元素,元素从key中删除

SPOP key

count

SET运算

1.交集运算

SINTER key

key ...

2.将交集结果存入新集合destination中

SINTERSTORE destination key

key ...

3. 并集运算

SUNION key

key ...

4.将并集结果存入新集合destination中

SUNIONSTORE destination key

key ...

5. 差集运算

SDIFF key

key ...

6. 将差集结果存入新集合destination中

SDIFFSTORE destination key

key ...

应用场景

点赞

Set 类型可以保证一个用户只能点一个赞,这里举例子一个场景,key 是文章id,value 是用户id。

uid:1 、uid:2、uid:3 三个用户分别对 article:1 文章点赞了。

共同关注

Set 类型支持交集运算,所以可以用来计算共同关注的好友、公众号等。

key 可以是用户id,value 则是已关注的公众号的id。

uid:1 用户关注公众号 id 为 5、6、7、8、9,uid:2 用户关注公众号 id 为 7、8、9、10、11。

抽奖活动

存储某活动中中奖的用户名 ,Set 类型因为有去重功能,可以保证同一个用户不会中奖两次。

5.Zset(有序集合)

定义:Zset 类型(有序集合类型)相比于 Set 类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序集合的元素值,一个是排序值。

内部实现:Zset 类型的底层数据结构是由压缩列表或跳表实现的。

常用命令

1.往有序集合key中加入带分值元素

ZADD key score member

\[score member\]...

2.往有序集合key中删除元素

ZREM key member

member...

3.返回有序集合key中元素member的分值

ZSCORE key member

4.返回有序集合key中元素个数

ZCARD key

5.为有序集合key中元素member的分值加上increment

ZINCRBY key increment member

6.正序获取有序集合key从start下标到stop下标的元素

ZRANGE key start stop

WITHSCORES

7.倒序获取有序集合key从start下标到stop下标的元素

ZREVRANGE key start stop

WITHSCORES

8.返回有序集合中指定分数区间内的成员,分数由低到高排序。

ZRANGEBYSCORE key min max

WITHSCORES\] \[LIMIT offset count

9.返回指定成员区间内的成员,按字典正序排列, 分数必须相同。

ZRANGEBYLEX key min max

LIMIT offset count

10.返回指定成员区间内的成员,按字典倒序排列, 分数必须相同

ZREVRANGEBYLEX key max min

LIMIT offset count

11.并集计算(相同元素分值相加),numberkeys一共多少个key,WEIGHTS每个key对应的分值乘积

ZUNIONSTORE destkey numberkeys key

key...

12.交集计算(相同元素分值相加),numberkeys一共多少个key,WEIGHTS每个key对应的分值乘积

ZINTERSTORE destkey numberkeys key

key...

应用场景

排行榜

有序集合比较典型的使用场景就是排行榜。例如学生成绩的排名榜、游戏积分排行榜、视频播放排名、电商系统中商品的销量排名等。

电话姓名排序

使用有序集合的 ZRANGEBYLEX 或 ZREVRANGEBYLEX 可以帮助我们实现电话号码或姓名的排序,我们以 ZRANGEBYLEX (返回指定成员区间内的成员,按 key 正序排列,分数必须相同)为例。

总结

Redis 常见的五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及

Zset(sorted set:有序集合)。

Redis 五种数据类型的应用场景:

• String 类型的应用场景:缓存对象、常规计数、分布式锁、共享session信息等。

• List 类型的应用场景:消息队列(有两个问题:1. 生产者需要自行实现全局唯一 ID;2. 不能以消

费组形式消费数据)等。

• Hash 类型:缓存对象、购物车等。

• Set 类型:聚合计算(并集、交集、差集)场景,比如点赞、共同关注、抽奖活动等。

• Zset 类型:排序场景,比如排行榜、电话和姓名排序等。

相关推荐
不如打代码KK2 小时前
MySQL死锁排查指南
数据库·mysql
北城以北88882 小时前
SpringBoot--Spring Boot原生缓存基于Redis的Cacheable注解使用
java·spring boot·redis·缓存·intellij-idea
打不了嗝 ᥬ᭄3 小时前
【MySQL】数据类型以及库和表的操作
数据库·mysql
ohoy10 小时前
mysql 30天自动补0
数据库·mysql
摇滚侠13 小时前
Redis 零基础到进阶,Redis 哨兵监控,笔记63-73
数据库·redis·笔记
利剑 -~13 小时前
mysql面试题整理
android·数据库·mysql
老华带你飞13 小时前
物流信息管理|基于springboot 物流信息管理系统(源码+数据库+文档)
数据库·vue.js·spring boot
程序员卷卷狗13 小时前
Redis事务与MySQL事务有什么区别?一文分清
数据库·redis·mysql
挺6的还13 小时前
5.string类型
redis