redis设计与实现-数据结构
1,redis存储有5种数据对象,有7种数据结构底层实现

2,sds简单字符串
- 不直接使用字符数组或是string
- 封装了长度变量,加快获得字符串长度
- 杜绝缓冲区溢出(拼接字符串的时候不会因为内存里连线的内存不够就会溢出,每次分配会先检查
- 减少内存分配次数,不用每次变长都申请,申请多一倍,够就直接用
- 二进制安全(使用len来判断,不会中途停止
3,链表
- 用于列表键,发布订阅,慢查询,监视器
- 双端链表,无环
4,字典(hash表差不多
- 用于数据库和哈希键
- 通常有两个哈希表,再扩容reahsh的时候使用(开辟出一个新的哈希表,懒替换,每次用到的时候才去替换,逐渐完整替换
- 基本上和Java得hashmap差不多
5,跳跃表
- 用于有序列表的实现
- 跳表的查找时间复杂度是LogN,可以和平衡二叉树相当。但是平衡二叉树实现略复杂,所以redis就采用了实现上稍简单的skiplist。
6,整数集合
- 当集合键都是整数的时候,底层就是整合集合
- 整数数组的类型可以是16位的,32位的,64位的。当数组里所有的整数都是16位长度的,如果新加入一个32位的整数,那么整个16的数组将升级成一个32位的数组。
- 整数数组里数据是(大小上)有序的。
7,压缩列表
- 列表键和哈希键比较小的情况下,底层数据结构未压缩列表
- 特点是在一串内存中,比较节约内存
8,对象和底层编码转换
string
- int编码 全是整数,若有字符出现或者大于32字节变成raw,浮点数是embstr
- embstr 初次的字符串是用这个,是短字符串的一种优化,内存连线,embstr应该是只读的,若是有修改操作,则变成raw
- raw
list对象
- ziplist :满足每个对象字节小于64,数量小于512个。
- linkedlist
set对象
- intset:使用整数集合的时候和不能超过512个对象
- hashtable:
zset对象
- ziplist:每个元素字节少于64,元素数量少于128,有一个字典辅助,提高查找速录
- skiplist
哈希对象
- ziplilst:小于64字节和数量少于512
- hashtable
redis设计与实现-数据结构的更多相关文章
- Redis设计与实现——数据结构与对象
SDS 简单动态字符串 在redis数据库里面,包含字符串值得键值对在底层都是由SDS实现的. redis > set msg "hello world" 1)键值对的键是 ...
- 探索Redis设计与实现8:连接底层与表面的数据结构robj
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现6:Redis内部数据结构详解——skiplist
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现7:Redis内部数据结构详解——intset
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现5:Redis内部数据结构详解——quicklist
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现4:Redis内部数据结构详解——ziplist
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现3:Redis内部数据结构详解——sds
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现2:Redis内部数据结构详解——dict
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现1:Redis 的基础数据结构概览
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
随机推荐
- VS2012里面使用EF框架的增删改查和分页的方法
public class BaseRepository<T> where T : class { //实例化EF框架 DataModelContainer ...
- rgba 和 opacity 的对比.
rgba 中 的 a 指的是透明度: 1. rgba 的 设置的 透明度 不会被子级 元素继承; opacity 设置的透明度会被子级元素继承 . 因此 ,有时候 使用 rgba 会比 opa ...
- css 利用border 绘制三角形. triangle
1.基础三角形. <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 深入浅出 - vue变化侦测原理
废话真多!!! 其实在一年前我已经写过一篇关于 vue响应式原理的文章,但是最近我翻开看看发现讲的内容和我现在心里想的有些不太一样,所以我打算重新写一篇更通俗易懂的文章. 我的目标是能让读者读完我写的 ...
- DeployMan,发布文件的利器
利用Delphi开发app,有时候需要发布文件,如果文件少还不是问题,但文件多的情况下,IDE带的发布功能,就显得捉襟见肘,效率低下了. 通过Project-Deployment,打开发布窗口,如下图 ...
- HDU 6060 17多校3 RXD and dividing(树+dfs)
Problem Description RXD has a tree T, with the size of n. Each edge has a cost.Define f(S) as the th ...
- Win7+Ubuntu双系统时间不一致
转自:http://blog.sina.com.cn/s/blog_55546df90100xkf3.html 最近装了ubuntu和win7双系统,但是发现每次进入win7后时间总是不对,总是比当地 ...
- html+css实现小米商城首页静态页面
学了一个星期的html和css,用新学的东西写点东西,仿照小米商城的首页按照它的页面布局盗用它的图片写了个小米商城的静态页面. 源代码:链接:https://pan.baidu.com/s/1qf63 ...
- [LeetCode&Python] Problem 796. Rotate String
We are given two strings, A and B. A shift on A consists of taking string A and moving the leftmost ...
- Justified Jungle
Problem J: Justified Jungle Time limit: 6 s Memory l imit: 512 MiB As you probably know, a tree is a ...