Redis数据存储结构之String

lifacheng 2019-06-04 原文

Redis数据存储结构之String

前言:

  在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 是如何操作的。希望对大家有帮助, 谢谢!

 

发表于 2019-06-04 18:08 编号94531 阅读() 评论() 编辑 收藏

 

版权声明:本文为lifacheng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lifacheng/p/10974057.html

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

  1. LeetCode 134. Gas Station

    题目描述 题目链接 思路 暴力解法 O(N^2) 我们可以通过生成辅助数组来验证良好出发点 int[]h 这个 […]...

  2. 【推荐】.NETCore 简单且高级的库 csredis v3.0.0

    【推荐】.NETCore 简单且高级的库 csredis v3.0.0 前言 .NETCore 从1.0发布历 […]...

  3. 关于PHP导出数据超时的优化

    一般情况下,导出超时可能都是以下三种情况:   一、sql语句复杂,查询时间过长;   二、处理查询后数据逻辑 […]...

  4. Redis搭建多台哨兵

      搭建多台哨兵 完成spring管理多台哨兵 学习redis如何数据持久化如何管理内存 Redis集群搭建 […]...

  5. 线性表 linear_list 顺序存储结构

    可以把线性表看作一串珠子 序列:指其中的元素是有序的   注意last和length变量的内在关系   注意: […]...

  6. Redis击穿、穿透、雪崩产生原因以及解决思路

    本文总结了Redis击穿、穿透、雪崩的原因以及解决方案并且用图的形式展现出来。 击穿 大家都知道,计算机的瓶颈 […]...

  7. Redis事务操作

    Redis事务操作 Redis事务本质: ​ 一组命令的集合 , 一个事务中的所有命令都会被序列化 , 在事务 […]...

  8. 重学数据结构之图

    一、图 1.基本概念   图是一种抽象的数学结构,研究抽象对象之间的一类二元关系及其拓扑性质。而在计算机的数据 […]...

随机推荐

  1. Github开源项目(企业信息化基础平台)

    JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化) […]...

  2. Inception网络

    2018-12-09 19:39:38 一、1 * 1卷积 pooling可以对feature map的hei […]...

  3. mybatis批量新增报错 BadSqlGrammarException

    mybatis批量新增报错 BadSqlGrammarException Posted on 2019-10- […]...

  4. [斯坦福大学2014机器学习教程笔记]第五章-控制语句:for,while,if语句

          在本节中,我们将学习如何为Octave程序写控制语句。     首先,我们先学习如何使用for循环 […]...

  5. ES6中的Module与Interator

    小编今天在用Vue做项目的时候,发现组件中有import和export,刚好今天看到相关的语法介绍和一些实例, […]...

  6. new Option()——实现时间联动

    1、基础准备:   先来了解下,如何运用js实现select动态添加option。 //1.动态创建selec […]...

  7. 设计模式-原型模式(Prototype)【重点:浅复制与深复制】

    讲故事 最近重温了一下星爷的《唐伯虎点秋香》,依然让我捧腹不已,幻想着要是我也能有一名秋香如此的侍女,夫复何求 […]...

  8. tornado(五)

    tornado(五) tornado的输入 查询字符串(query string),形如key1=value1 […]...

展开目录

目录导航