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. 一文了解:Redis的AOF持久化

    Redis的AOF持久化 每当Redis-Server接收到写数据时,就把命令以文本形式追加到AOF文件里,当 […]...

  2. redis 获取自增数

        近期,有一个项目需要用到数字的自增整数,范围是0-199999,但公司数据库是mongodb、同时装有 […]...

  3. Redis6.x学习笔记(四)复制

    复制概述 Redis支持复制的功能,以实现当一台服务器的数据更新后,自动将新的数据异步同步到其它数据库。 Re […]...

  4. Redis Desktop Manager桌面管理工具

    Redis Desktop Manager桌面管理工具,方便管理我们放在redis中的各个缓存 及16个数据库 […]...

  5. 日常Bug排查-系统失去响应-Redis使用不当

    日常Bug排查-系统失去响应-Redis使用不当 前言 日常Bug排查系列都是一些简单Bug排查,笔者将在这里 […]...

  6. 关于redis内存分析,内存优化

    关于redis内存分析,内存优化 对于redis来说,什么是最重要的? 毋庸置疑,是内存。 一、reids 内 […]...

  7. 初识Redis(一)

        一直以来学习新的东西 习惯用word记录,不习惯网上博客写帖子,因为自己写的是自己理解的,不管对错,理 […]...

  8. 京东分布式缓存redis应用实战

           互联网应用特点三高:高并发、高可用、高性能,要达到这几个目标,好的方法方式是建立相应指标, 来进 […]...

随机推荐

  1. 主要旋磁专用术语和公式

    目录:     (一)、插入损耗S21     (二)、回波损耗(反向损耗)S11      (三)、隔离度S […]...

  2. 给 iTerm 终端设置代理

    本文介绍如何为自己的终端设置代理,从而实现在命令行中访问Google。 1. 背景 当你使用SS FQ时,大部 […]...

  3. PHP微信支付开发实例

    这篇文章主要为大家详细介绍了PHP微信支付开发过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下PHP微信支付开发过程,分享给大家,供大家参考,具体内容如下1.开发环境 Thinkphp 3.2.3 微信:服务号,已认证 开...

  4. 新手编程入门体验

    近期学习总结 第一次写博客有点紧张,语言组织得可能不是很好 先总结一下最近学的东西(最近在摸索,所以学的不是很 […]...

  5. 中文版Flash CS5多媒体课件制作案例教程

    中文版Flash CS5多媒体课件制作案例教程 项目一 多媒体课件制作基础知识 学习目标 任务一 了解多媒体课 […]...

  6. 实现select下拉框的无限加载(懒加载)

    在实际开发中我们有时无法避免select下拉功能数据过大导致页面卡顿(如在我在一次迭代中有一个select项接 […]...

  7. struts2接收参数的5种方法

    这里总结下Struts2接收参数的5种方法。 1. 使用Action的属性 在action里面定义要接收的参数 […]...

  8. C#对游戏手柄的编程开发-API篇(2)

    在C#对游戏手柄的编程开发-API篇(1)这篇文章中我们介绍了“被动方式”的开发。在此方式下,我们的程序只扮演 […]...

展开目录

目录导航