前言:

  在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. SARS病毒

    每一道题目皆是一处美丽的风景: 何为科技的力量和程序的思维哦,在这暑假的编程之路上,我要好好地体验一番来嘞! 数学规律是:f(n)=2^(n-1)+4^(n-1).     //递推分析可得!具体过程 ...

  2. fileupload插件调用upload.parseRequest(request)解析得到空值问题

    得到的list长度是0,项目配置不能改变,没办法了,只能将HttpServletRequest强换成DefaultMultipartHttpServletRequest ,直接获取表单中的字段了.方法 ...

  3. springmvc、springboot 参数校验

    参数校验在项目中是必不可少的,不仅前端需要校验,为了程序的可靠性,后端也需要对参数进行有效性的校验.下面将介绍在springmvc或springboot项目中参数校验的方法 准备工作: 引入校验需要用 ...

  4. Codeforces A. Serval and Bus

    inputstandard inputoutputstandard outputIt is raining heavily. But this is the first day for Serval, ...

  5. MyBatis(4)——配置文件优化

    配置文件优化 执行流程:读取配置流程->sqlSessionFactory->sqlSession(连接.读取sql并执行相应操作.关闭) a)配置优化:通过中文参考指南的说明可知-> ...

  6. 线性筛-三合一,强大O(n)

    校内CJOJ2395by Jesse Liu 筛法三合一 Euler.Möbius.Prime函数 基于数论的积性函数 gcd(a,b)=1  则  ƒ(ab)=ƒ(a)ƒ(b) #include & ...

  7. git之路

    1.如何clone代码到本地 答:git clone https://github.com/antirez/redis.git 2.

  8. dk7和jdk8的一些新特性

    本文是我学习了解了j 的一些资料,有兴趣的大家可以浏览下下面的内容. 官方文档:http://www.oracle.com/technetwork/java/javase/jdk7-relnotes- ...

  9. P&R 6

    Floorplan: 要做好floorplan需要掌握哪些知识跟技能? 通常,遇到floorplan问题,大致的debug步骤跟方法有哪些? 如何衡量floorplan的QA? Floorplan基本 ...

  10. 妙用python之编码转换

    转自i春秋 文章难易度:★★ 知识点:python.编码转换 前 言 在日常渗透,漏洞挖掘,甚至是CTF比赛中,会遇到各种编码,常常伴随着这些编码之间的各种转换.记得刚入门那个时候,自己处理编码转换问 ...