4、Redis高性能的根本原理
内存的读写速度很快
Epoll 模型
常用的五大Redis的数据结构,及他们各自的底层实现结构
string hash list set sortset(zset)
string 的底层实现是 简单动态字符串(SDS -simple dynamic string)
hash 的底层实现是 hash表 或则 压缩列表(ziplist)
list 的底层实现是 双向列表(quicklist) 或者 压缩列表
set 的底层实现是 hash表(hashtable) 或者 整数数组
sortset(zset) 的底层实现是 压缩列表 或者 跳表
各个数据结构的底层实现概览
value是 string 类型的时候分为三种情况
(1)、当设置的值是整数类型的时候,redis底层会将 string 类型转化为 int 来存储
(2)、设置的值小于等于44个字节的时候,使用的编码是 embstr
(3)、设置的值大于44个字节的时候,使用的编码是 raw
redis是用C语言编写的,在C语言中 string 类型是用字符数组 char[] 来实现的。redis实现字符串的底层并没有直接使用C语言中的字符数组的形式,而是进行了改造,构造出了一种SDS的数据结构
list的底层使用 快速双向链表quicklist 或者 压缩链表ziplist 来实现的。
list的底层并没有使用传统的双向链表的结构是因为
(1)、双向链表需要有一个 前指针 和 后指针 ,每个指针占用的空间分别都是8byte, 占用内存 比较多
(2)、双向链表所通用的一个问题是会形成很多的 内存碎片
压缩链表 ziplist 结构是
快速双向链表 quicklist 结构
hash的底层实现为 hashtable 或者 ziplist 。
hashtable的底层实现
当数据量比较小或者单个元素的时候,底层使用的是ziplist存储,具体可以通过配置来制定
1、 hashtable 是无序的 ziplist 是有序的
2、在能使用 hash 的情况下优先使用 hash ,不要使用 String ,因为使用太多的 String ,则会创建出过多的 key ,当 key 大量的时候,就会容易发生 hash碰撞 ,所以就需要频繁的 rehash ,每次 rehash 就会创建2倍的内存,造成内存浪费
hash的底层实现为 整数数组intset 或者 hashtable 。
当set都为整数的时候,set的底层实现都是使用 intset 结构实现
如果set中存在字符串的值,则使用 hashtable 来实现
intset 是有序的, hashtable 是无序的
sortset 底层使用 压缩列表ziplist 或 跳表skiplist 的结构实现
当数据量小的情况下,使用 ziplist 实现,当数据量大的情况下使用 ziplist 实现,具体可以通过配置设置
默认设置下的底层结构
skiplist 的底层实现
查找对应元素的时候,先从最高的索引层找,例如找c 150,则先从L1找,L1的指针指向b,查看b120小于150,则继续往后找,b的指针指向null,则向下一层找,向下一层b的指针指向c,查看c的score为150,所以找到对应的元素c
1、 https://blog.csdn.net/u010710458/article/details/80604740