欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈redis数据结构之哈希

程序员文章站 2022-07-13 11:10:27
...

1. 哈希

       哈希(hash)类型是一种比较常用的数据类型,绝大多数的编程语言都提供了hash类型,它们的叫法可能是哈希、字典、关联数组。在redis中,哈希类型是指键(K)值本身又是一个键值对结构。

       哈希的形式类似于这样:value={{field1,value1},...{fieldN,valueN}},redis键值对和哈希类型两者的关系如下图所示:

浅谈redis数据结构之哈希
            
    
    博客分类: Redis redishash 

 

        这里有个概念需要说明下,哈希类型中的映射关系叫作field-value,这里的value是指field对应的值,不是键(K)对应的值。

 

2. 操作命令

2.1 基本命令

       由于篇幅所限,这里就简单的做个演示,如下图所示:

浅谈redis数据结构之哈希
            
    
    博客分类: Redis redishash 

 

浅谈redis数据结构之哈希
            
    
    博客分类: Redis redishash 

 

浅谈redis数据结构之哈希
            
    
    博客分类: Redis redishash 

 

       这里hgetall命令需要注意一下:在使用 hgetall 时,如果哈希元素个数比较多,会存在阻塞Redis的可能。如果开发人员只需要获取部分field,可以使用hmget,如果一定要获取全部 field-value,可以使用hscan命令,该命令会渐进式遍历哈希类型。操作命令如下图所示:

浅谈redis数据结构之哈希
            
    
    博客分类: Redis redishash 

 

2.2 不常用命令

       这里也是因为篇幅所限,就简单的做个演示,如下图所示:

浅谈redis数据结构之哈希
            
    
    博客分类: Redis redishash 

从图上看,hstrlen key field报错了,这个命令是有redis版本限制的,版本号必须不能低于3.2.0。

 

2.3 哈希类型命令的时间复杂度

       下面是我这边整理的关于哈希类型命令的时间复杂度,如下表所示:

命令 时间复杂度
hset key field value O(1)
hget key field O(1)
hdel key field [field .....] O(k),k是field个数
hlen key O(1)
hgetall key O(n),n是field个数
hmget field [field ...] O(k),k是field个数
hmset field value [field value ...] O(k),k是field个数
hexists key field O(1)
hkeys key O(n),n是field个数
hvals value O(n),n是field个数
hsetnx key field value O(1)
hincrby key field increment O(1)
hincrbyfloat key field increment O(1)
hstrlen key field O(1)

 

3. 内部编码

       哈希类型的内部编码有两种:压缩列表(ziplist),哈希表(hashtable)。

3.1 ziplist

       当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。

 

3.2 hashtable

       当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为 O(1)。

       下面的示例演示了哈希类型的内部编码,以及相应的变化。当field个数 比较少,且没有大的value时,内部编码为ziplist:

浅谈redis数据结构之哈希
            
    
    博客分类: Redis redishash 

 

4. 应用场景

       因为redis的hash数据结构和列表数据结构,是比较常用且重要的数据结构,以及篇幅所限,后面会有专门的篇幅研究这两种数据结构的应用场景,小伙伴们敬请期待。

相关标签: redis hash