内容简介:版本:2.9支持的数据类型:
Redis 底层数据结构
版本:2.9
支持的数据类型:
- 字符串
- 散列
- 列表
- 集合
- 有序集合
字符串
Redis 利用原生的 c 字符串进行了一次封装。封装的字符串叫做简单动态字符串:SDS(simple dynamic string)
Redis 使用的简单动态字符串比 c 语言原生的字符串有以下优点:
- 获取字符串长度的复杂度为O(1)
- 不存在缓存区溢出
- 修改字符串长度时,不需要频繁分配内存
- 空间预分配策略
- 惰性空间策略
- 二进制安全
- 二进制安全的意思是,可以将二进制数据使用 SDS 存储,而不会存在 c 语言中,遇到 \0 是字符串结尾的情况。
- 兼容部分 c 字符串函数
- 因为 SDS 遵循 c 语言以 \0 结尾的惯例,所以 SDS 可以使用 <string.h> 函数库,避免了重复代码
链表
链表作为最常用的数据结构之一,在 redis 中的使用场景是很多的,其中包括:
- 发布、订阅
- 列表键
- 慢查询
- 监视器
- 多个客户端状态
- 客户端缓冲区
Redis 中链表的几个特性:
- 双向链表
- 无环
- 有表头和表尾指针
- 有链表长度计数器
- 多态(可以用来保存不同类型的值)
字典
字典又叫符号表,在 PHP 中叫关联数组,在 JAVA 中叫映射(map),在 Python 中叫字典(dict)。别管这么多叫法,字典就是一种保存键值对的一种数据结构。
使用场景
- 散列(hash)
- Redis 数据库
字典实现
Redis 使用 c 语言构建了自己的字典实现。hash 算法使用的是 murmurhash3 算法。遇到键的 hash 值冲突使用的解决方法是链地址法。当需要扩展时,Redis 利用两个哈希表进行渐进式的 rehash。
字典(内部的哈希表)扩展与收缩条件
哈希表内部会通过公式计算一个负载因子。公式为:
load_factor=ht[0].used/ht[0].Size
扩展条件:
- 服务器目前没有在执行 BGSAVE 命令或者 BGREWRITEAOF 命令,并且哈希表的负载因子大于等于1。
- 服务器目前正在执行 BGSAVE 命令或者 BGREWRITEAOF 命令,并且哈希表的负载因子大于等于5。
收缩条件:负载因子小于 0.1
跳跃表
跳跃表的结构:
跳跃表是一种对标平衡树的一种数据结构。但是比平衡树更简单、更快速、使用更少空间。所以一般都会使用跳跃表。
跳跃表在 Redis 中的使用场景暂时仅限于实现有序集合。
跳跃表的实现参见: http://blog.jobbole.com/111731/
整数集合
整数集合的使用场景为元素不多且只包含整数元素的集合。
使用 c 数组实现。
压缩列表(ziplist)
压缩列表是 Redis 为了节省内存实现的。当列表键和哈希键的项比较少,并且存储的值比较小时,会使用压缩列表节省内存。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 深入理解 MySQL 索引底层数据结构
- 深入理解 MySQL 索引底层数据结构
- Redis中五大数据结构的底层实现
- Redis(二)--- Redis的底层数据结构
- 图解 Redis 五种数据结构底层实现
- 浅谈Redis五种数据结构的底层原理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Data Structures and Algorithms
Alfred V. Aho、Jeffrey D. Ullman、John E. Hopcroft / Addison Wesley / 1983-1-11 / USD 74.20
The authors' treatment of data structures in Data Structures and Algorithms is unified by an informal notion of "abstract data types," allowing readers to compare different implementations of the same......一起来看看 《Data Structures and Algorithms》 这本书的介绍吧!