Redis学习笔记-Redis内部数据结构
Redis内部数据结构
Redis和其他key-value数据库的很大区别是它支持非字符串类型的value值。它支持的value值的类型如下:
- sds (simple dynamic string) 简单动态字符串
- 双端链表
- 字典(dictionary/map/associative array)
- 跳跃表(skiplist)
下面将对以上的各个类型在redis内部的实现进行分析。
一、sds (simple dynamic string) 简单动态字符串
Redis并没有使用C的字符串,而是在其上面进行了封装,以适应更多频繁的耗时操作。在前面的内容中,我们一直将sds 作为一种抽象数据结构来说明,实际上,它的实现由以下两部分组成:
typedef char *sds;
struct sdshdr {
// buf 已占用长度
int len;
// buf 剩余可用长度
int free;
// 实际保存字符串数据的地方
char buf[];
};
这样的设计对于strlen()和append()操作来说是效率很高的。对于strlen()操作来说,很明显可以通过len属性在O(1)的时间内拿到。对于append()操作,参考下面的例子:
redis> SET msg "hello world"
OK
redis> APPEND msg " again!"
(integer)
redis> GET msg
"hello world again!"
看看这个过程中sdshdr的变化情况:
首先,set msg后,sdshdr如下:
struct sdshdr {
len = ;
free = ;
buf = "hello world\0";
}
然后,append msg后,sdshdr如下:
struct sdshdr {
len = ;
free = ;
// 空白的地方为预分配空间,共18 + 18 + 1 个字节
buf = "hello world again!\0 ";
}
可以看到,Redis的sds会预分配2倍自己大小的空间,这样就减少了内存的追加操作,即减少了字符串追加操作的时间。
Redis学习笔记-Redis内部数据结构的更多相关文章
- Redis学习笔记一:数据结构与对象
1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...
- Redis学习笔记之底层数据结构
1.简单动态字符串(simple dynamic string, SDS) 定义: struct sdshdr { int len;//记录buf中使用的字节数量 int ...
- redis学习笔记——内存映射数据结构
内存映射数据结构 解决问题:当一个对象包含的元素数量并不多,或者元素本身的体积并不大时,使用代价高昂的内部数据结构并不是最好的办法. 内存映射数据结构是一系列经过特殊编码的字节序列,创建它们所消耗的内 ...
- Redis学习笔记~Redis主从服务器,读写分离
回到目录 Redis这个Nosql的存储系统一般会被部署到linux系统中,我们可以把它当成是一个数据服务器,对于并发理大时,我们会使用多台服务器充当Redis服务器,这时,各个Redis之间也是分布 ...
- redis学习笔记-redis的安装
Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择, ...
- redis学习笔记——Redis过期键的删除策略
Redis过期键的删除策略 对于过期键一般有三种删除策略 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作: 惰性删除:放任键过期 ...
- Redis学习笔记——Redis的基本操作
之前介绍过如何在ubuntu安装Redis服务器:https://www.cnblogs.com/zifeiy/p/9062738.html 接下来,我们在Redis上进行一些基本的操作. 所县使用命 ...
- Redis学习笔记~Redis事务机制与Lind.DDD.Repositories.Redis事务机制的实现
回到目录 Redis本身支持事务,这就是SQL数据库有Transaction一样,而Redis的驱动也支持事务,这在ServiceStack.Redis就有所体现,它也是目前最受业界认可的Redis ...
- Redis学习笔记~Redis并发锁机制
回到目录 redis客户端驱动有很多,如ServiceStack.Redis,StackExchange.Redis等等,下面我使用ServiceStack.Redis为例,介绍一下在redis驱动中 ...
随机推荐
- java中的BigInteger
头文件 import java.io.*; import java.math.*; 读入 Scanner cin = Scann(System.in); while(cin.hasNext()) &l ...
- TestList汇总
[基本类型] 类的构造方法调用问题 重载复写的区别 Final finally finalized 的区别 定义final变量是否需要初始化 forward和redirect的区别 equals方法和 ...
- 弱电系统标准CAD图例识图讲解
弱电系统标准CAD图例识图讲解 http://www.360doc.com/content/17/0317/16/33642774_637680009.shtml
- 国内 docker 仓库镜像对比
http://www.datastart.cn/tech/2016/09/28/docker-mirror.html
- lodop 控件实现web打印功能
WEB套打可选方案不多,理想的更少,利用免费控件Lodop+JavaScript实现精确套打,算是较为经典的选择.这种方案其实比较简单,利用一个htm文件就可以实现模板设计过程,几乎是“空手套”式的开 ...
- [置顶]
kubernetes资源类型--secret和Service Account
secret 概念 secret对象类型主要目的是保存和处理敏感信息/私密数据,比如密码,OAuth tokens,ssh keys等信息.将这些信息放在secret对象中比 直接放在pod或dock ...
- 设计模式之适配器模式(php实现)
/* github地址:https://github.com/ZQCard/design_pattern * 适配器模式:将一个类的接口转换成客户希望的另外一个接口. * 适配器模式使得原本由于接口不 ...
- Java里日期转换及日期比较大小
1.比较日期的大小: DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//创建日期转换对象hh:mm:ss为 ...
- Spring获取properties文件中的属性
1.前言 本文主要是对这两篇blog的整理,感谢作者的分享 Spring使用程序方式读取properties文件 Spring通过@Value注解注入属性的几种方式 2.配置文件 applicatio ...
- python解析json文件报错No JSON object could be decoded
2017-04-25 可用Nodepad++将json文件打开并以UTF8无BOM格式保存.