Redis基本数据类型Hash详解

    科技2024-07-27  65

    4.6 Hash(哈希)数据类型详解

    4.6.1 简介

    首先想一下,我们Java中的Hash,形式为<key,value>

    那么在我们的redis中存放了这个hash

    即为: key—<key,value> 形式

    数据类型中的hash所有的命令,都是以h开头


    4.6.2 新增获取及批量新增获取与获取全部

    hset key field value 新增hash

    hget key field 获取hash

    hmset key field vlaue field value … 批量新增hash

    hget key field field … 批量获取hash

    hgetall key 获取全部一个key下的全部hash

    ##新增hash 127.0.0.1:6379> hset hash h1 v1 (integer) 1 ##获取hash 127.0.0.1:6379> hget hash h1 "v1" ##批量新增hash 127.0.0.1:6379> hmset hash1 h1 v1 h2 v2 OK ##批量获取hash 127.0.0.1:6379> hmget hash1 h1 h2 1) "v1" 2) "v2" ##批量新增hash,field相同的情况下,更新该数据 127.0.0.1:6379> hmset hash h1 v11 h2 v2 OK ##批量获取hash 这里的h1已经被更新 127.0.0.1:6379> hmget hash h1 h2 1) "v11" 2) "v2" ##获取该Key下的全部hash 127.0.0.1:6379> hgetall hash 1) "h1" 2) "v11" 3) "h2" 4) "v2" ##获取该Key下的全部hash 127.0.0.1:6379> hgetall hash1 1) "h1" 2) "v1" 3) "h2" 4) "v2" 127.0.0.1:6379>

    4.6.3 删除hash指定key字段

    hdel key field

    ##批量获取 127.0.0.1:6379> hmget hash h1 h2 1) "v11" 2) "v2" ##删除hash指定的field 127.0.0.1:6379> hdel hash h1 (integer) 1 ##批量获取 127.0.0.1:6379> hmget hash h1 h2 1) (nil) 2) "v2" 127.0.0.1:6379>

    4.6.4 获取key中的hash键值对数量

    hlen key

    ##获取全部的keys 127.0.0.1:6379> keys * (empty array) ##批量新增hash 127.0.0.1:6379> hmset hash h1 v1 h2 v2 h3 v3 OK ##获取某个Key下的所有键值对 127.0.0.1:6379> hgetall hash 1) "h1" 2) "v1" 3) "h2" 4) "v2" 5) "h3" 6) "v3" ##查询key下的键值对数量 127.0.0.1:6379> hlen hash (integer) 3 127.0.0.1:6379>

    4.6.5 判断hash中指定的字段是否存在

    hexists key field

    ##获取全部的keys 127.0.0.1:6379> keys * (empty array) ##批量新增hash 127.0.0.1:6379> hmset hash h1 v1 h2 v2 h3 v3 OK ##获取某个Key下的所有键值对 127.0.0.1:6379> hgetall hash 1) "h1" 2) "v1" 3) "h2" 4) "v2" 5) "h3" 6) "v3" ##查询key下的键值对数量 127.0.0.1:6379> hlen hash (integer) 3 ##判断hash下的某个字段是否存在 127.0.0.1:6379> hexists hash h1 (integer) 1 ##判断hash下的某个字段是否存在 127.0.0.1:6379> hexists hash h2 (integer) 1 ##判断hash下的某个字段是否存在 127.0.0.1:6379> hexists hash h4 (integer) 0 127.0.0.1:6379>

    4.6.6 获取hash的field字段或Value值

    hkeys key

    hvals key

    ##查询所有的key 127.0.0.1:6379> keys * 1) "hash" 127.0.0.1:6379> hgetall hash 1) "h1" 2) "v1" 3) "h2" 4) "v2" 5) "h3" 6) "v3" 127.0.0.1:6379> hkeys hash 1) "h1" 2) "h2" 3) "h3" 127.0.0.1:6379> hvals hash 1) "v1" 2) "v2" 3) "v3" 127.0.0.1:6379>

    4.6.7 指定hash自增或自减

    hincrby

    hincrby key field increment

    ##批量新增hash 127.0.0.1:6379> hmset hash h1 v1 h2 1 OK ##查询hash的value 127.0.0.1:6379> hvals hash 1) "v1" 2) "1" ##查询所有键值对 127.0.0.1:6379> hgetall hash 1) "h1" 2) "v1" 3) "h2" 4) "1" ##设置自增,步长为1 127.0.0.1:6379> hincrby hash h2 1 (integer) 2 ##获取全部键值对 127.0.0.1:6379> hgetall hash 1) "h1" 2) "v1" 3) "h2" 4) "2" ##设置自增,步长为2 127.0.0.1:6379> hincrby hash h2 2 (integer) 4 ##获取全部键值对 127.0.0.1:6379> hgetall hash 1) "h1" 2) "v1" 3) "h2" 4) "4" ##设置自增,步长为-2 实际就是 ##hdecrby 127.0.0.1:6379> hincrby hash h2 -2 (integer) 2 ##获取全部键值对 127.0.0.1:6379> hgetall hash 1) "h1" 2) "v1" 3) "h2" 4) "2" 127.0.0.1:6379>

    4.6.8 hsetnx方法,类似于String中的setnx

    hsetnx key field value

    ##查询所有的key 127.0.0.1:6379> keys * 1) "hash" ##获取hash的所有键值对 127.0.0.1:6379> hgetall hash 1) "h1" 2) "v1" 3) "h2" 4) "2" ##获取hash的所有keys 127.0.0.1:6379> hkeys hash 1) "h1" 2) "h2" ##新增一个键值对, ##如果key存在则新增失败 127.0.0.1:6379> hsetnx hash h2 1 (integer) 0 ##新增一个键值对, ##如果key不存在,则新增成功 127.0.0.1:6379> hsetnx hash h3 1 (integer) 1 ##查询hash的所有keys 127.0.0.1:6379> hkeys hash 1) "h1" 2) "h2" 3) "h3" ##查询hash的所有values 127.0.0.1:6379> hvals hash 1) "v1" 2) "2" 3) "1" 127.0.0.1:6379>

    4.6.9 Hash的应用

    可以存放我们的编程数据,比如用户信息user,尤其是用户信息的保存或者经常变动的信息

    我们可以把user当作一个Key,然后hash里面设置相应的值,name age gender

    ##批量插入用户属性 127.0.0.1:6379> hmset user:1 user1:name zhangsan user1:age 10 user1:gender man OK ##批量获取用户属性 127.0.0.1:6379> hmget user:1 user1:name user1:age user1:gender 1) "zhangsan" 2) "10" 3) "man" ##批量获取key下的对应的hash的keys 127.0.0.1:6379> hkeys user:1 1) "user1:name" 2) "user1:age" 3) "user1:gender" 127.0.0.1:6379>

    hash更适合存储对象,string更适合存储字符串

    Processed: 0.010, SQL: 8