redis常用数据类型之Hash

461 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

本文讲解下redis五大常用数据类型当中的hash,主要从其数据结构,以及常用的方法进行讲解。

数据结构

Redis的hash是一个键值对集合

是一个string类型的key和value的映射表,hash适合存储对象,类似Java里面的Map<String,Object>。

通常我们在使用String类型存储对象的时候可以有两种方式:

  • 使用String类型的key/value形式,对象唯一标识做key,对象做value,此方式需要在存储时进行序列化,取出时进行反序列化。
  • 使用对象的id或唯一标识+field属性作为keyfield的值作为value

使用Hash的话,相比于上面两种,更加的合适,省去序列化和反序列化的开销;减少key当中唯一标识的冗余。而且我们可以直接通过key + field去操作对象的某个属性

Hash类型对应的数据结构是两种:

  • ziplist(压缩列表):当field的长度或者个数较小的时候。
  • hashtable(哈希表):当field的长度或者个数较大的时候。

常用命令

hget和hset

  • hset 给key下的对象中的field对应的value赋值,格式hset key field value [field value ...]

    使用示例如下:

    127.0.0.1:6379> hset student name Tom age 20 address usa phone 13333333333
    (integer) 4
    
  • hget 根据key+field取出对象的value,用法hget key field

    使用示例如下:

    127.0.0.1:6379> hget student name
    "Tom"
    
  • hmset 批量设置hash的值,格式hmset key field value [field value ...]

    这个方法看起来和hset没有区别,确实是的。在最新的官方文档中,推荐使用hset,hmset已弃用。对比有以下的原因:

    • hset的时间复杂度是O(1),而hmset是O(n)
    • hset会返回设置值的个数,而hmset只返回OK

查看hash

  • hexists 查看指定key的hash中,field属性是否存在,成功返回1,失败返回0,格式hexists key field

    使用示例如下:

    127.0.0.1:6379> hexists student phone
    (integer) 1
    127.0.0.1:6379> hexists student sex
    (integer) 0
    
  • hkeys 列出该hash集合的所有field,格式hkeys key

    使用示例如下:

    127.0.0.1:6379> hkeys student
    1) "name"
    2) "age"
    3) "address"
    4) "phone"
    
  • hvals 列出该hash集合的所有value,格式hvals key

    使用示例如下:

    127.0.0.1:6379> hvals student
    1) "Tom"
    2) "20"
    3) "usa"
    4) "13333333333
    

修改hash

  • hincrby 指定key中的属性field的值加上增量指定值,格式hincrby key field increment

    使用示例如下:

    127.0.0.1:6379> hincrby student age 2
    (integer) 22
    
  • hsetnx 指定key的属性field的值设置为value,且只有field不存在才会成功,成功返回1,失败返回0,格式hsetnx key field value

    使用示例如下:

    127.0.0.1:6379> hsetnx student sex man
    (integer) 1
    127.0.0.1:6379> hsetnx student name Tom
    (integer) 0
    

到此为止,关于redis的hash的简单介绍就全部完成了。