不瘦原来对redis也是有个大概的了解(就你知道的多), 但是最近和大神聊天的过程中才明白自己知道的简直就是鸡毛蒜皮(让你得瑟),所以不瘦打算从头在捋一遍,顺便把过程也记录下来,如果能给大家在学习redis的道路上提供一条清晰的线索,不瘦胖也瞑目了.

我们知道redis没有直接使用C语言中的字符串,而是定义了简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。其中SDS数据结构如下:

struct sdshdr {
int len; // len表示buf中存储的字符串的长度
int free; // free表示buf中空闲空间的长度
char buf[]; // buf用于存储字符串内容
};

可以看到,就是将一个字符数组和两个整型变量封装在结构体中,但是这一封装加上一些看似简单的方法(大道至简)就为SDS增加了很多特性:

  • 二进制安全

和C语言字符串只能某种编码(如ASCII),并且出结尾不能有'\0'字符相比,SDS也可以存储像图片,音频,视频这样的二进制数据

  • 字符串长度计算,时间复杂度为O(1)

因为在SDS结构体中存储了len,计算长度时直接返回即可(以空间换时间),而C语言要计算字符串长度时间复杂度为O(n)

  • 杜绝缓冲区溢出

我们知道在C语言拼接字符串时,如果超出原字符串申请的内存大小就会导致缓冲区溢出,而SDS的空间分配策略直接避免了溢出的可能性:当对SDS修改时,会先检查剩余空间是否         满足(free变量的作用),如果不满足,则进行自动扩容.

  • 减少修改带来内存分配次数

redis作为数据库经常被用于速度要求严苛、数据被频繁修改的场合,  如果每次修改长度都需要执行一次内存重分配的话, 那么光是执行内存重分配的时间就会占去修改所用时间的       一大部分, 如果这种修改频繁地发生的话, 可能还会对性能造成影响。

为了应对这种应用场景,redis采取了两种策略: 增加长度时空间预分配(每次多申请点),减少长度时空间惰性释放(只改free的大小,不实际释放空间)

注意事项:

  • SDS作为key时长度不能超过512MB

参考:

《Redis设计与实现》

这里是老瘦家的儿子,如需转载请声明,我替老瘦感谢你。

redis 基本数据类型-字符串(String)的更多相关文章

  1. redis 五大数据类型之string篇

    一: 1:string(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value. string类型是二进制安全的.意思是redis ...

  2. Redis基本数据类型以及String(一)

    前言:     Redis也有自己的数据类型,包含string,list,hash,set,sorted set.下面就对每种数据类型原理以及操作做一个详细的介绍.     Redis是面向编程的语言 ...

  3. Redis的数据类型之String

    Redis主要支持的数据类型有5种:String ,Hash ,List ,Set ,和 Sorted Set. Redis数据类型String string类型在redis中是最常见的类型,valu ...

  4. 专题二:redis的数据类型之string

    一.redis的数据存储格式 redis本身是一个Map,其中所有的数据都是采用 "key:value"的方式进行存储的. 我们说的数据类型是数据存储的类型,也就是对应下图的val ...

  5. Javascript基础系列之(三)数据类型 (字符串 String)

    javascript一共有9种数据类型 字符串 String 数值型 Number 布尔型 Boolean 未定义 Undefine 空值 Null 对象 Object 引用Refernce 列表型 ...

  6. python 数据类型: 字符串String / 列表List / 元组Tuple / 集合Set / 字典Dictionary

    #python中标准数据类型 字符串String 列表List 元组Tuple 集合Set 字典Dictionary 铭记:变量无类型,对象有类型 #单个变量赋值 countn00 = '; #整数 ...

  7. Redis常用数据类型及使用场景

    Redis最为常用的数据类型 字符串(String) 字符串列表(list) 字符串集合(set) 哈希(hash) 有序的字符串集合(sorted set) String(字符串) 字符串是最基本的 ...

  8. Redis的数据类型及其常用命令

    快速入门Redis 首先安装redis: windows下安装redis Linux下安装redis 1. 什么是redis Redis属于nosql(非关系型数据库) 关系型数据库是基于关系表的数据 ...

  9. redis基本数据类型和对应的底层数据结构

    Redis的数据类型包含string,list,hash,set,sorted set. Redis中定义了一个对象的结构体: /* * Redis 对象 */ typedef struct redi ...

随机推荐

  1. C#判断奇偶数的函数

    // 现代流行的"程序员"public static bool IsOdd(int n) {     while (true)    {        switch (n)     ...

  2. 选择 Java 编写 iOS 与 安卓 App的八大理由

    [编者按]本文作者为 RoboVM 的 CEO 兼联合创始人 Henric Müller,主要介绍选用 Java 编写移动应用的八大理由.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 在过 ...

  3. Oracle EBS 启动调试日志

    SELECT   * FROM dba_source t WHERE t.TEXT LIKE '%PO_PDOI_TAX_CALCULATION_ERR%' FND:启用调试日志 FND:调试日志级别 ...

  4. C#.NET里面抽象类,接口,虚方法

    1抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明 ...

  5. Oracle 18c新特性一览

    1. 一般新特性 1.1. Shadow Lost Write Protection Shadow lost write protection检测到一个丢失的写,它会导致一个主要的数据损坏.可以在不需 ...

  6. VUE入门准备------>ES6

    声明变量的方式:  var  let   const let  和 var的区别 var定义的变量是全局的会覆盖全局的定义 ; ;i<;i++){ console.log(i) } undefi ...

  7. 如何让触摸事件穿透一个View

    如何让触摸事件穿透一个View 偶然间发现,如何屏蔽或者让触摸事件穿透一个view是一个很简单的事情. 现象: 源码: // // ViewController.m // UserInteractio ...

  8. 设计多选一按钮ChooseOnlyButton

    设计多选一按钮ChooseOnlyButton 效果: 源码: ChooseOnlyButton.h 与 ChooseOnlyButton.m // // ChooseOnlyButton.h // ...

  9. SCCM2012安装、配置

    1.sql server2012,排序规则选择:SQL_Latin1_General_CP1_CI_AS1.扩展AD架构2.打开ad用户和计算机,高级--system 容器授予 sccm服务器 完全控 ...

  10. windows 10最新版镜像资源下载 Win10 ISO下载教程

    最近发现原创写的文章被无良爬走,而且变成了无图尬文,所以开头附上原文地址: http://www.cnblogs.com/xueyudlut/p/7497975.html -------------- ...