redis讨论下Hash底层数据结构及应用场景

238 阅读1分钟

概述

Hash结构对于我们来说太熟悉了,Java中我们几乎天天都要使用hash这种数据类型,也很清楚Hash的底层数据结构是HashTable.其实redis也类似,Hash底层也采用了HashTable,毕竟时间复杂度是O(1),但其实redis的Hash底层结构同时使用了两种数据结构,另外一种是Ziplist(压缩列表).两种结构有不同的使用场景,我们来分析一下.

数据结构图

redis整体结构图 image.png

entry结构图 image.png

hashtable结构图

image.png

ziplist结构图

image.png

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也没关系