redis的数据类型 

174 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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,支持消费者模式(同一个消费组的消费者不能消费同一条信息)

      • 消息对列