Redis 源码学习-Simple Dynamic String

简介:
+关注继续查看

Redis只会使用C字符串作为字面量,在大多数情况下,Redis使用SDS作为字符串表示。

比起C字符串,SDS具有以下优点:

  1. 常数复杂度获得字符串长度。
  2. 杜绝缓冲区溢出。
  3. 减少修改字符串长度时所需的内存重分配次数。
  4. 二进制安全。
  5. 兼容部分C字符串函数。
数据结构
struct sdshdr {
    
    // buf 中已占用空间的长度
    int len;

    // buf 中剩余可用空间的长度
    int free;

    // 数据空间
    char buf[];
};
解析

len记录buf数组中已使用字节的数量,等于SDS所保存的字段长度。free记录buf数组中未使用字节的数量。buf为字符串的数据空间,它的长度为len+free+1,因为它需要多存一个'0'作为结束标识。

为什么要多存'0'

C语言中的字符串为Null-terminated String,它用'0'来表示字符串的结束。并且除了字符串末尾之外,字符串内不能包含空字符,否则最先被读到的空字符会被误认为结束标识。

这种存储二进制和读取不一致的情况被称为Binary Unsafe。为了实现二进制安全,redis采用len属性来记录当前字符串长度。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 JSON 自然语言处理
Redis基础学习
Redis基础学习
38 0
|
1月前
|
存储 消息中间件 缓存
Redis 学习 | Redis 初识与安装
Redis 学习 | Redis 初识与安装
|
1月前
|
存储 分布式计算 NoSQL
Python | Python学习之Redis交互详解
Python | Python学习之Redis交互详解
|
2月前
|
存储 NoSQL Redis
Redis底层学习(六)—存储类型-ZSet篇
Redis底层学习(六)—存储类型-ZSet篇
|
2月前
|
存储 NoSQL Redis
Redis底层学习(五)—存储类型-Set篇
Redis底层学习(五)—存储类型-Set篇
|
2月前
|
存储 NoSQL Java
Redis底层学习(四)—存储类型-Hash篇
Redis底层学习(四)—存储类型-Hash篇
|
2月前
|
存储 消息中间件 NoSQL
Redis底层学习(三)—存储类型-List篇
Redis底层学习(三)—存储类型-List篇
|
2月前
|
存储 缓存 JSON
Redis底层学习(二)—存储类型-String篇
Redis底层学习(二)—存储类型-String篇
|
2月前
|
存储 缓存 NoSQL
Redis底层学习(一)—概述篇
Redis底层学习(一)—概述篇
|
2月前
|
存储 NoSQL Redis
【Redis 系列】redis 学习 18,redis 存储结构原理 2
我正在参与掘金创作者训练营第4期,点击了解活动详情,一起学习吧! 咱们接着上一部分来进行分享,我们可以在如下地址下载 redis 的源码
推荐文章
更多