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 ...
随机推荐
- Java 容器
摘录来至https://www.cnblogs.com/LipeiNet/p/5888513.html https://www.cnblogs.com/acm-bingzi/p/javaMap.htm ...
- [Paper] LCS: An Efficient Data Eviction Strategy for Spark
Abstract Classical strategies do not aware of recovery cost, which could cause system performance de ...
- <Codis><JedisPool><DeadLock>
Overview Background: I start a thread [call thread A below]in Spark driver to handle opening files i ...
- json pickle xml shelve configparser
json:# 是一种跨平台的数据格式 也属于序列化的一种方式pickle和shevle 序列化后得到的数据 只有python才可以解析通常企业开发不可能做一个单机程序 都需要联网进行计算机间的交互 J ...
- 性能测试-3.Fiddler进行弱网测试
fiddler模拟限速的原理(原文地址) 我们可以通过fiddler来模拟限速,因为fiddler本来就是个代理,它提供了客户端请求前和服务器响应前的回调接口,我们可以在这些接口里 面自定义一些逻辑. ...
- JAVA中关于对像的读写
/** * 针对对象的文件读写 */ //导入包 import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...
- 第七十七课 最小生成树(Kruskal)
添加kruskal算法: #ifndef GRAPH_H #define GRAPH_H #include "Object.h" #include "SharedPoin ...
- 最长可重区间集 spfa费用流
给定实直线L上的n个开区间,和一个正整数k 选取若干个区间,在保证实直线L上的任意一个点最多被选出区间覆盖k次的情况下,使得这些区间的长度和最大 先把区间按照左端点排序, 考虑到重复其实就代表着相交, ...
- 【leetcode】21-MergeTwoSortedLists
problem MergeTwoSortedLists 一种方法是迭代,一种方法是递归: code /** * Definition for singly-linked list. * struct ...
- Unity 3D-Navigation网格导航系统使用教程
Unity自带导航系统 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创 ...