概述
Hash结构对于我们来说太熟悉了,Java中我们几乎天天都要使用hash这种数据类型,也很清楚Hash的底层数据结构是HashTable.其实redis也类似,Hash底层也采用了HashTable,毕竟时间复杂度是O(1),但其实redis的Hash底层结构同时使用了两种数据结构,另外一种是Ziplist(压缩列表).两种结构有不同的使用场景,我们来分析一下.
数据结构图
redis整体结构图
entry结构图
hashtable结构图
ziplist结构图
1.hash和string有着明显区别,hash是属于集合类型
2.hash底层采用了两种数据结构,一个是hashtable,一个是ziplist
3.hashtable一般是不存在性能问题,时间复杂度是O(1),但是ziplist获取某个节点值,需要便利
整个列表,时间复杂度O(n),所以redis在达到hash-max-ziplist-entries默认512;
hash-max-ziplist-value默认64字节这个阈值情况会有性能问题,会转换为hashtable
4.hashtable就数据结构内部来看, 元数据开销还是有的,比较耗费内存,但是ziplist,元数据几乎不占用内存
使用场景
1.保存的数据是个集合情况下,建议采用hash,虽然可以保存为多个string,也不好管理,至于内存方面
我觉得这种情况不考虑,主要是好管理,不是分散的
2.保存数据非常大情况下,并且单条数据占用字节少,建议拆分成多个hash保存
这样可以使用ziplist节省内存开销,否则使用单个hash,底层采用hashtable也没关系