前言
最近看了相关的Redis设计核心相关的书籍,对Redis有了一些小的认识,然后自己也做一些产出加深映象,我会从几个方面去总结Redis设计的核心内容:Redis底层数据结构总结、Redis高性能由哪些基础支撑、Redis应用场景、那些有趣的功能。
概述
本篇主要内容是Redis底层数据结构总结。Redis供用户直接使用的数据结构有String、List、Set、Zset、Hash等结构,而这些结构下层又基于一些数据结构,这些数据结构被设计的非常优美,来提供了Redis高效的性能、低内存占用、多样的功能等,他们有Dict、RedisObject、SDS、ZipList、QuickList、Listpak、Skiplist,我将从是什么、为什么使用、设计思想、特点、实现结构几个方面去总结。
目录
为什么previous_entry_length要小于254?
Dict
是什么
Dict是一种查找结构,用来解决查询问题,是一种哈希散列表结构,采用拉链法解决哈希冲突,类似于JDK中HashTable但其特点是渐进式扩容,将单次指令触发扩容的时间分散到多次指令渐进扩容,避免了单次响应时间的剧烈波动,符合其响应效率的特点。
为什么使用
一般查找结构有常用的两种结构:1.各种平衡树,内部对数据排序,时间复杂度趋近于O(logn),但是需要维护其平衡结构,较耗费性能并且实现复杂,可执行标识查找和范围查询;2.哈希散列表结构,不对元素排序,通过hash()定位元素在数组上的位置,利用了数组的索引O(1)查找特点,快速定位元素,其实现相对简单但只提供标识查询,时间复杂度为O(1)。
设计思想
Dict是字典结构,采用了散列表结构,利用数组索引定位O(1)的特点来实现快速操作,但区别于JDK的散列表实现,Dict使用数组存储元素,拉链法解决hash冲突,并且最突出的是使用渐进式扩容。HashMap扩容是一次性同步扩容,既单次add指令导致元素数量达到临界点,触发同步全量扩容,导致单次的响应时间剧烈波动。而Dict是将一次指令的同步扩容分散到多次指令上,每次执行指令时都会触发一部分扩容,避免了单次响应时间的剧烈波动,这也是体现其设计核心--响应效率优先。