侧边栏壁纸
博主头像
Terry

『LESSON 5』

  • 累计撰写 90 篇文章
  • 累计创建 21 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Redis String类型介绍

Terry
2021-01-24 / 0 评论 / 0 点赞 / 313 阅读 / 1,458 字 / 正在检测是否收录...

简述

Redis中的String类型是我们经常使用到的数据类型,而且在Redis中所有的key都是String类型存储的。今天我们来看下Redis的String类型😊。

String类型存储结构

当我们保存64位有符号整数的时候,String类型会把它保存为一个8字节Long类型整数,这种保存方式叫做int编码方式。
如果我们爆粗的数据中包含字符的时候,String类型会使用简单动态字符串(SDS)结构体来保存。
Redis中RedisObject分析我之前也做过了redisObject的分析,有兴趣的小伙伴可以看下。我们知道RedisObject数据结构如下:

string-1

Redis其实还对了数据不同类型做了专门的处理。

  1. Long类型。RedisObject中的指针直接赋值为整数数据,不需要用额外的指针指向整数,节省了指针的空间开销。
  2. String类型。
  • 字符串类型小于等于44字节时,RedisObject中的元数据、指针和SDS是一块连续的内存区域,这样可以避免内存碎片。这种布局方式成为embstr编码方式。
    我这里解释下为什么是44字节。因为新版的SDS做了优化,对于字符串比较小的时候,len和alloc是int8类型,占用一个字节。flags是char类型,取值为0-4,也是占用一个字节。所以sdshdr最小需要3个字节。RedisObject中,元数据占8字节,指针占8字节,所以占用了16字节。加上sdshdr就是19字节。
    redis中,如果超过64字节就是大字符串,所以RedisObject+sdshdr8的总长度是64字节的情况下,留给buf的长度就只剩下45字节了。因为字符串结尾需要一个\0占用了一个字节,所以留给字符串的长度也就只有44字节了。如图所示:
    string-3
  • 字符串大于44字节时,SDS的数据量就开始变多了,Redis认为这是大字符串,不再把SDS和RedisObject布局在一起了,而是会给SDS分配独立的内存空间,并用指针指向SDS数据结构。这种布局方式被称为raw编码模式。

下面的图片就是三种编码模式的示意图。

string-4

总结

在Redis中,我们经常使用的String类型,Redis也帮我们做很多优化。数据类型为Long类型,则RedisObject中的指针直接赋值为整数数据,不需要用额外的指针指向整数,节省了指针的空间开销;数据类型为支付串类型,如果小于等于44字节,RedisObject中的元数据、指针和SDS是一块连续的内存区域,避免内存碎片。如果大于44字节,则会单独给SDS分配独立的内存空间,并用指针指向SDS数据结构。

0

评论区