开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
redis的数据类型
- 回答分析:基本介绍 -- 内部实现 -- 应用场景
五中基本数据类型
-
String字符串
-
基本介绍:String是最基本的key - value结构,key是唯一标识,value是具体的值。value不仅仅是字符串,也可以是数字
-
底层实现:string的底层实现主要是int和动态字符串
- 如果储存的对象是整数,并且这个整数值可以用lang类型来表示,字符串就会把编码格式换成int
- 如果储存的对象是一个字符串,并且这个字符串的长度小于等于32(不同版本不一样),那么redis就讲使用一个简单动态字符串来保存这个字符串,然后把编码格式设置诶embstr
- 如果储存的字符串比较长,也会使用动态字符串来储存,但是会把编码格式设置为raw。
- rwa和embstr不同的是,embstr通过一次内存分配使用连续的内存来存储redisObject好sds,但是rwa使用两次牛叉你分配分别储存redisObject和sds
-
应用场景:
-
缓存对象:
- 缓存对象序列化后的son;
- 将key进行分离,使用user:ID:字段 的格式进行储存
-
常规计数:
- redis处理命令是单线程,整个过程是原子性的。可以使用string来计算访问次数、点赞、转发、库存等一些计数的场景 INCR 自增
-
共享session信息:在某些分布式系统的场景下,我们可以设置一个统一的redis服务器端来进行一些数据的共享,比如让redis对session信息进行统一管理和储存。这样的话,如果用户两次登录被分配到不同的服务器上,都可以去同一个redis上获取信息
-
-
-
hash哈希
-
基本介绍:哈希是一个键值对的集合 key - 【{f1,v1}、{f2,v2}、{f3,v3}】
-
底层实现:哈希使用压缩列表和哈希表实现
- 如果哈希元素个数小于512个,所有值都小于64字节,redis会使用压缩列表作为hash的底层数据类型
- 如果元素个数过多,数据大,就会使用哈希表
- 在redis7中,同意使用listpack来实现哈希
-
应用场景
- 缓存对象: 和使用string储存json的区别是,如果有的属性会频繁变动,我们就可以抽出来使用哈希储存
- 购物车:可以使用用户id做key,value就是商品id和商品数量的组合
-
-
List列表
-
基本介绍:简单的字符串列表,可以向头部和尾部向list添加元素
-
底层实现:List底层结构在3.2之前使用的是双向链表和压缩列表,在3.2之后使用的quicklist
-
应用场景:
-
消息队列:
- 利用pop和push操作来实现消息的先进先出
- 为每个消息添加一个全局的ID来判断是否处理过
- 使用BRpop来进行阻塞读取
- 使用BRPOPLPUSH进行消息的备份来保证消息的可靠性
-
-
-
set集合
-
基本介绍:是一个无序的键值集合,它的储存顺序不会按照插入的先后顺序储存,而且不能储存重复元素
-
底层实现:使用哈希表和整数集合实现
- 如果集合中的元素都是整数而且元素个数小于512个,redis会使用整数集合作为set的低产能结构
- 否则就会使用hash表作为set的底层结构
-
应用场景:set支持交集、并集、差集计算,当我们需要储存的数据是无序且需要去重的情况下,可以使用set进行储存
- 点赞:set可以保证一个用户只能点一个赞,可以把文章id作为key,value就是用户id
- 抽奖:使用set保证每个用户只能中1次
- 共同关注:也可以使用set储存一个用户的关注用户id,然后使用交集的运算找出共同关注的用户
-
-
Zset有序集合
-
基本介绍:Zset比较set而言多了排序属性分值,对于一个Zser而言,每个元素的都维护了两个字段,排序分值和真正的元素值
-
底层实现:Zset使用压缩列表和跳表实现
- 当元素个数小于128的时候,且每个元素的个数小于64字节时,redis会使用压缩列表作为Zset类型的底层数据结构
- 否则,就会使用跳表来作为Zset的底层结构
-
应用场景:Zset可以对插入的数据进行排序,而且是非重复的
- 排行榜:
- 电话排序
- 姓名排序
-
后面随着版本的更新,又出现了四种数据结构
-
BitMap
-
基本介绍:BitMap就是位图,是一串二进制数组。可以看成一个字节数组,数组中每个元素都只有0和1两种状态,使用偏移量来定位元素
-
应用场景:bitmap非常适合统计只有两种状态的场景,就是是和否。
- 签到统计:签到了记录为1
- 判断用户是否登录
- 记录连续打卡总数:把每天日期做为key,把用户id作为偏移量。然后对7天的bitmap队形一个与操作
-
-
HyperLogLog
-
基本介绍:可以统计一个集合中不重复的元素个数,但是这个统计是基于概率的,有误差,但是误差率很小。
-
应用场景:优点就是非常节约空间,使用12kb就可以计算2^64个不同元素的基数
- 百万级网页UA计数:统计独立访客的页面浏览量
-
-
GEO
- 基本介绍:主要对于地理位置进行储存,把经纬度储存起来二路
- 应用场景:比如滴滴打车
-
Stream
-
基本介绍:是一种专门为消息队列设计出来的数据类型
-
应用场景:支持持久化,支持自动生成全局唯一ID,支持消费者模式(同一个消费组的消费者不能消费同一条信息)
- 消息对列
-