Redis 源码学习-Simple Dynamic String

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

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天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
7 1
|
1天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
8 0
|
1天前
|
存储 安全 测试技术
【C++】string学习 — 手搓string类项目
C++ 的 string 类是 C++ 标准库中提供的一个用于处理字符串的类。它在 C++ 的历史中扮演了重要的角色,为字符串处理提供了更加方便、高效的方法。
6 0
|
2天前
|
NoSQL Java Unix
Redis基础操作 String List
Redis基础操作 String List
6 0
|
15天前
|
存储 NoSQL 安全
Redis入门到通关之Redis数据结构-String篇
Redis入门到通关之Redis数据结构-String篇
35 1
|
15天前
|
存储 缓存 NoSQL
Redis入门到通关之String命令
Redis入门到通关之String命令
18 0
|
16天前
|
存储 消息中间件 缓存
Redis 命令全解析之 String类型
Redis 命令全解析之 String类型
14 1
|
4月前
|
存储 NoSQL 关系型数据库
图解 Redis String 底层数据结构 SDS 与计数器实战
图解 Redis String 底层数据结构 SDS 与计数器实战
58 0
|
12月前
|
存储 缓存 JSON
Redis进阶-string底层数据结构精讲
Redis进阶-string底层数据结构精讲
183 0