前言:

  在Redis使用中,我们最常使用的操作是set key value,或 get key value 。这里面包含了redis最基本的数据类型:String,字符串类型是redis中最基本的类型,它能存储任何形式的字符串,包括二进制数据(JSON,Image...)。

大家有没有思考过redis是通过何种数据结构来存储数据的呢?今天来带大家一探究竟。

源码打开方式:

  打开我们下载好的redis源码包,进入src目录,思考,怎么才能知道哪一个是String的结构类型的源码呢? 然后我们慢慢找,慢慢找, 哪一个像String的结构类型的源码呢? 诶,大兄嘚, 找到了, 这个sds.c像是String的源码,哈哈哈哈哈哈哈哈哈哈哈哈哈,真是机智! 实时证明,这是一种效率极其低下的方式。

  正确的打开源码的方式是,查找官方文档。在Redis官方页面中,有Quick links,有官方的Github. 我们进入GitHub。在GitHub中,有对源码的简要描述。我们通过往下翻,找到如下描述:

  

我们可以看到官方介绍的很清楚,sds.c是Redis的字符串库。接下来,我们就可以快乐的去看源码了。

源码剖析:

part1: sds.h

  在源码包中,有sds.c和sds.h文件。在C语言中,.h文件一般为头文件,.c为源文件。在源文件中可以调用头文件中定义的变量,结构体,等一些数据或数据类型。所以我们先查看一下头文件定义的数据类型。

   

在文件头中定义了5种结构体,分别是:sdshdr5,sdshdr8,sdshdr16,32,64,每种结构体中的数据类型相同(当然,长度定义的不同)。每个参数具体的含义(暂时不考虑sdshdr5,上面写的很清楚,sdshdr5 is never used.):

  • len:表示当前sds的长度,
  • alloc:表示为sds分配的内存大小
  • flag:用来表示当前sds的类型。如上图所示 001,010,011,100分别为8,16,32,64
  • char buf[]:sds实际存放的数据

当然,头文件中还定义了许多方法,通过名称我们可以大概知其意。如:static inline size_t sdslen(const sds s)  获取sds的长度, static inline void sdsinclen(sds s, size_t inc) 长度+1,还有许多。

part2:sds.c

  在sds.c中,引用了sds.h中定义的数据结构,已申明的方法和已实现的方法等。此文件中主要定义了对sds数据结构的具体操作,如:初始化方式,设置sds的len,等一些列操作,感兴趣的可以具体研究下源码。此处不一一详解啦(水平有限,误导不好)。

结束语

  通过本文,了解了Redis中存储String类型采用的数据结构,以及数据结构中具体的数据,参数等,还有String 是如何操作的。希望对大家有帮助, 谢谢!

Redis数据存储结构之String的更多相关文章

  1. redis数据存储的细节

    redis是一个K-V NoSql非关系型数据库,redis有物种数据类型,分别是String,Hash,list,set,zset:这五种类型都是针对K-V中的V设计的. 1.总体介绍:关于redi ...

  2. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  3. kafka 数据存储结构+原理+基本操作命令

    数据存储结构: Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的.每个topic又可以分成几个不同的partition(每个topic有几个partitio ...

  4. Cassandra 的数据存储结构——本质是SortedMap<RowKey, SortedMap<ColumnKey, ColumnValue>>

    Cassandra 的数据存储结构 Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型.它借鉴了 Amazon 的 Dynamo 和 Google's BigTab ...

  5. Redis之数据存储结构

    今天去中关村软件园面试,被问到:你做项目用到的Redis处理数据用的什么结构?顿时石化,”用到的结构,不就是key-value嘛,还有什么结构?“.面试官说:“平时除了工作,要加强学习,下面的面试我觉 ...

  6. 仿Redis用来作前端浏览器的数据存储结构

    用js写了一个类似redis存储结构的类库,目前只有的存储类型只有hash.set两个, 还没测试过性能,欢迎各位猿友能够帮我指出程序代码的缺陷, 后期有时间会完善其他几个类型的存储结构. /**** ...

  7. 直接在安装了redis的Linux机器上操作redis数据存储类型--String类型

    一.概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型 ...

  8. Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析

    Hashtable 是一个很常见的数据结构类型,前段时间阿里的面试官说只要搞懂了HashTable,hashMap,HashSet,treeMap,treeSet这几个数据结构,阿里的数据结构面试没问 ...

  9. Redis数据存储优化机制(转)

    原文:Redis学习笔记4--Redis数据存储优化机制 1.zipmap优化hash: 前面谈到将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象.省内存的原因是新建一个h ...

随机推荐

  1. jQuery对象和语法

    jQuery类型 引入jquery.js时,其实是向全局作用域中,添加了一个新的类型--jQuery. 构造函数:负责创建jQuery类型的对象. 原型对象:保存jQuery对象可用的所有简化版API ...

  2. 对象析构谈—— delete this 的使用及注意事项

    this对象是必须是用 new操作符分配的(而不是用new[],也不是用placement new,也不是局部对象,也不是global对象): delete this后,不能访问该对象任何的成员变量及 ...

  3. Django框架-模板层

    Django框架-模板层 一.模板语法传值 1.验证是否python所有的数据类型都可以传递到前端 locals()的妙用:该方法虽然好用,但是在某些情况下会造成资源的浪费 结论:整型.浮点型.字符串 ...

  4. 【Python collections】

    目录 namedtuple deque Counter OrderedDict defaultdict "在内置数据类型(dict.list.set.tuple)的基础上,collectio ...

  5. jmeter实现对Oracle数据库的操作

    实现目的 有时候,根据业务需要,可能需要直接对数据库进行性能测试,此时可利用jmeter对Oracle.MySQL等数据库进行相关测试. 脚本实现 添加JDBC Connection Configur ...

  6. jmeter 进行websocket数据帧过大导致code 1009

    Response message: Received: Close frame with status code 1009 and close reason 'No async message sup ...

  7. 6_3 矩阵链乘(UVa424)<用栈实现简单的表达式解析>

    假设你必须做A*B*C*D*E的运算,在这里A,B,C,D,E都是矩阵(matrix).由于矩阵相乘具有连接性(associative),所以相乘的顺序可以是任意的.然而所需要的基本乘法数却与不尽相同 ...

  8. vue使用过程中遇到的细节问题

    1. 在methods 中添加一个方法.如果这个方法使用箭头函数的话,箭头函数中的this不是当前的vue实例,所以通过this.xxx是获取不到实例上面的属性的,这时我们可以用函数的简写来获取到实例 ...

  9. Spring Boot 操作 Excel

    Excel 在日常操作中经常使用到,Spring Boot 中使用 POI 操作 Excel 本项目源码 github 下载 1 新建 Spring Boot Maven 示例工程项目 注意:本示例是 ...

  10. cordova将vue项目打包成apk

    1,若vue项目不在cordova项目里,直接把它复制进来,避免改动代码的麻烦 2,直接按照以下链接进行操作即可 链接:https://www.cnblogs.com/qirui/p/8421372. ...