Redis系列之——深入了解Redis的String,源码层级+极易理解图片解析!

本文深入探讨Redis的String数据类型,揭示为何Redis不使用C语言的字符串,而是采用简单动态字符串(SDS)。SDS提供长度信息,解决了C字符串的一些问题,如内存分配和二进制数据存储。文章还讨论了RedisObject结构,它是如何与SDS结合以优化存储和性能的。
摘要由CSDN通过智能技术生成

前言

在上一篇文章中,我和大家介绍了Redis的前世今生,Redis的诞生就是为了解决mysql中IO性能的瓶颈,这一篇就和大家一起揭秘Redis神秘的面纱,第一个我们就来聊一聊Redis数据类型中的String!

Redis的数据结构

Redis最常用的数据类型有五种

  • String: 字符串
  • Hash: 散列
  • List: 列表
  • Set: 集合
  • Sorted Set: 有序集合

五种其实是Redis键值对中值存储的数据类型,而他们的底层数据结构一共有6种:分别是

  • 简单动态字符串
  • 双向链表
  • 压缩列表
  • 哈希表
  • 跳表
  • 整数数组

数据类型和数据结构的对应关系如下图:

这张图会在未来几篇文章中反复出现,帮大家彻底了解Redis的基础类型。

今天我们就来聊一聊其中的string

Redis是用C写的,那为什么不用C语言的String?

众所周知,Redis是用C语言写的,那Redis为什么没有使用C原生的字符串,而是自己创建了一个简单动态字符串?(SDS simple dynamic string)

  • C语言的字符串底层是用字符数组来实现的,在一片连续的空间中依次存放字符,为了判断字符的结束,他会在最后以'\0'作为识别,这样就会带来以下问题

    1. 无法存放任意的字符,至少'\0'是不可以的,这就会导致一些如图片,音频等出现了'\0'就会出现问题。
    2. 对字符串进行追加等操作的时候,必须遍历到'\0'才可以操作,会导致效率比较低,复杂度为o(n)
  • C语言的字符串是不记录字符串长度的,一旦我们调用了拼接函数等,而没有提前计算好内存,就会产生缓冲区溢出的情况,所以为了不出问题,会进行内存重分配,而这又多出了内存重分配的性能损耗

那么,Redis是怎么处理这些问题的呢?

简单动态字符串(Redis5.0版本)

Redis中的字符串数据是通过简单动态字符串(以下简称SDS)来存储数据的。

SDS到底是什么?

我们先来看看SDS的结构长什么样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾听铃的声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值