当前位置:   article > 正文

redis之String是如何存储的_redis存储string方法

redis存储string方法

写在前面

在这里插入图片描述
redis的String数据类型可能是我们使用最多的了,本文就一起来看下其底层是如何存储的,以及这种存储结构是否可能存在什么问题。下面我们就开始吧!

1:如何存储

首先我们还是要看下,redis的全局数据是如何存储的,redis的全局数据是用一个大的字典来存储的,存储的元素是dictEntry,dictEntry内是指向key的指针,指向value的指针,以及指向哈希冲突的下一个元素的dictEntry指针,结构如下:

在这里插入图片描述

其中key的值value的值部分并非直接存储的实际值,而是RedisObject结构体,其中的元数据用来保存值的创建时间,修改时间等元数据,此时结构变为下图:

在这里插入图片描述

其中的实际值部分才是保存实际值的(可能是指针,或真实的值),各种数据结构的值其实都是保存在这里的,本文要分析的String也不例外。到这里我们需要先看下redis用来存储String具体值的结构体SDS(simple dynamic string),结构体结构如下:

一级高血压

各部分含义如下:

buff:字节数组,存储实际值,以\0作为结束符号,额外占用一个字节
len:buff已经使用的长度,即数据的长度,占4个字节
alloc:buff实际分配的长度,占4个字节
  • 1
  • 2
  • 3

只有在存储的值是字符串时才会使用,如果是整数的话,则在RedisObject中保存的直接是该数字,占用4个字节,否则字符串使用SDS的话则保存的是实际值的指针,占用8个字节,这两种情况RedisObject如下:

在这里插入图片描述

实际上当存储的字符串小于44字节的时候,也是直接存储值的,这样可以有效避免内存碎片的问题,所以具体的存储可以分为整数存储,不超过44字节的字符串的SDS存储,大于44字节的字符串的SDS存储,其中整数存储方式我们叫做Int编码方式,不超过44字节的存储方式叫做embstr编码方式,大于44字节的存储方式叫做raw编码,如下图:

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/402094
推荐阅读
相关标签
  

闽ICP备14008679号