一、简单动态字符串(simple dynamic string--SDS)

Redis使用SDS表示字符串值,键值对都用SDS实现。SDS中的字符数组buf以空字符串结尾,好处是可以直接重用一部分C字符串函数库。s

SDS的一个例子

SDS的优势:
          1、常数复杂度获取字符串的长度,确保获取长度不会成为Redis的性能瓶颈。

2、杜绝缓冲区溢出,SDS的空间分配策略会在执行修改之前,检查SDS的空间是否满足修改的需求,所不满足则自动拓展SDS空间。

3、减少每次修改字符串时需要的内存重分配次数。

SDS通过未使用空间,实现了空间预分配和惰性空间释放两种优化策略。

(1)空间预分配:若修改后SDS长度小于1MB,则分配和len属性值大小相同的未使用空间,则buf数组的实际长度为:len+len+1;若修改后SDS长度大于等                                                  于1MB,那么程序分配1MB,buf数组实际长度为:len+1MB+1byte;

SDS API先检查空间是否足够,若足够直接使用free空间,不需要内存重分配。

(2)惰性空间释放:缩短字符串时,不需要释放内存,使用free将需要释放的字节数记录下来作为未使用空间,等待将来使用。

4、二进制安全。

C字符串中不能含空字符串,否则会被认为是字符串结尾,这使得C字符串只能保存文本数据,不能保存图片等二进制数据。SDS的API是二进制安全的,不                会对数据做限制。SDS使用len的值而不是空字符判断字符串是否结束。

            5、部分兼容C字符串函数。

二、链表

Redis构建了自己的链表实现。 多态性:dup,free,match三个函数的使用。链表被广泛用于Redis各种功能,如列表键,发布和订阅,慢查询,监视器等。

三、字典

Redis构建了自己的字典实现。对数据库的增,删,改,减也是构建在对字典的操作之上,哈希键。

Redis的字典使用哈希表作为底层实现,一个哈希表由多个哈希表节点,每个哈希表节点保存了字典的一个键值对。

3.1 哈希表(struct dictht{...})

3.2 字典(struct dict{...})

type指向dictType结构,包含了一组操作特定类型键值对的函数。

privdata包含了传给那些特定函数的可选参数。

ht属性包含两个dictht哈希表,一般只使用ht[0],ht[1]只会在对ht[0]哈希表进行rehash时使用。

rehashidx 记录rehash目前的进度。

3.3 哈希算法

Redis的数据结构和对象。的更多相关文章

  1. Redis 基础数据结构与对象

    Redis用到的底层数据结构有:简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等,Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包 ...

  2. redis所有数据结构及对象------redis设计与实现

    建议点开原图看

  3. redis 基础数据结构实现

    参考文献 redis数据结构分析 Skip List(跳跃表)原理详解 redis 源码分析之内存布局 Redis 基础数据结构与对象 Redis设计与实现-第7章-压缩列表 在redis中构建了自己 ...

  4. Redis学习笔记一:数据结构与对象

    1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...

  5. Redis 的底层数据结构(对象)

    目前为止,我们介绍了 redis 中非常典型的五种数据结构,从 SDS 到 压缩列表,这都是 redis 最底层.最常用的数据结构,相信你也掌握的不错. 但 redis 实际存储键值对的时候,是基于对 ...

  6. [redis读书笔记] 第一部分 数据结构与对象 对象类型

    - 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis ...

  7. 深入了解Redis【二】对象及数据结构综述

    引言 Redis中每个键值对都是由对象组成: 键总是一个字符串对象(string) 值可以是字符串对象(string).列表对象(list).哈希对象(hash).集合对象(set).有序集合对象(z ...

  8. Redis数据结构和对象三

    1.Redis 对象系统 Redis用到的所有主要数据结构,简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合.跳跃表. Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些 ...

  9. Redis | 第一部分:数据结构与对象 上篇《Redis设计与实现》

    目录 前言 1. 简单动态字符串 1.1 SDS的定义 1.2 空间预分配与惰性空间释放 1.3 SDS的API 2. 链表 2.1 链表与节点的定义 2.2 链表的API 3. 字典 3.1 哈希表 ...

随机推荐

  1. 安卓Recycleview简单的网格布局-初学者的关键点

    导包 def supportVersion = '28.0.0' 定义常量我的sdk版本为28 implementation "com.android.support:recyclervie ...

  2. 法国:5G网络不会排除任何设备厂商

    腾讯科技讯,据国外媒体报道,法国财政部长布鲁诺·勒梅尔(Bruno Le Maire)日前表示,法国有关 5G 电信网络的决定将基于网络的安全和性能,他强调说,法国政府不会将某一个特定的厂商排除在法国 ...

  3. CentOS7基于http方式搭建本地yum源

    1.创建yum软件保存目录[root@localhost ~]# mkdir -p /www/share/yum 2. 修改yum配置文件先备份yum配置文件,修改yum配置文件中yum软件包保存目录 ...

  4. NRF51822和NRF52832的主要区别

    对于NRF51822和NRF52832的选择性相信大家也是非常困惑的,哪个性价比高?下面为大家讲下NRF51822和NRF52832的一个区别,让大家能够更好的快速选型加快研发产品进度!   主要分为 ...

  5. request.getParameter() 接收参数中文乱码

    修改tomcat配置文件 设置url编码集 <Connector port="8080" protocol="HTTP/1.1" connectionTi ...

  6. Oracle SQL语句记录

    1.oracel 查看表空间使用情况. ) AS free_space, tablespace_name FROM dba_free_space GROUP BY tablespace_name; ) ...

  7. 实验吧-隐写术-男神一般都很低调很低调的!!(stegsolve->Image Combiner + DES加密)

    先介绍一下DES加密:(也可参考https://blog.csdn.net/zz_Caleb/article/details/87016017,第14个) 1)对称加密,参考:对称加密和非对称加密 2 ...

  8. opencv运动物体识别

    import cv2 import time import datetime import os def mkdir(path): folder = os.path.exists(path) if n ...

  9. 备份CSDN

    说明:https://blog.csdn.net/Feynman1999/article/details/87908082 源码:https://github.com/Feynman1999/CSDN ...

  10. ACM-Maximum Tape Utilization Ratio

    题目描述:Maximum Tape Utilization Ratio Tags: 贪婪策略 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是li ,1 < ...