当前位置:   article > 正文

Redis五大数据类型——Hash哈希_redis的hash数据类型

redis的hash数据类型

Redis五大数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sorted set:有序集合)。

 一、介绍

Redis 中的(Hash)类型是一个 String 类型与 field 和 field-value 的映射表,适用于存储对象,将一个对象类型存储在Hash类型中要比存在 String 类型中占用要更小,更加节省内存空间

以下是 String 类型和 Hash 类型的结构比较:

二、数据结构

底层使用两种数据结构存储:

  • ziplist  压缩列表
  • hashtable  普通的哈希表(key为set的值,value为null)

当使用ziplist编码必须满足下面两个条件,否则使用hashtable

  • 哈希对象保存的所有键值对的键和值的字符串长度都小于64字节
  • 哈希对象保存的键值对数量小于512

ziplist这里不再做讲解,我在《Redis五大数据类型——List列表》博文中讲解过,感兴趣的还请翻阅我之前的博文,谢谢

三、操作命令

命令功能语法描述
hset添加Hset key filed1 value filed2..往哈希表中添加一个或多个键值对
hmset等同hsetHset key filed1 value filed2..往哈希表中添加一个或多个键值对
hsetnx不存在则添加Hset key filed value哈希表不存在此filed则添加
hgetall查询全部Hgetall key返回哈希表中全部键值对
hget查询单个Hget key filed返回哈希表中单个filed的value值
hmget查询多个Hmget key filed1 filed2...返回哈希表中多个filed的value值
hlenfiled数量Hlen key返回哈希表中filed的数量
hkeys全部filedHkeys  key返回哈希表中全部filed
hvals全部valueHvals  key返回哈希表中全部value
hexists判断是否存在Hexists  key filed判断哈希表中 filed是否存在
hdel删除指定filedHdel key filed1 filed2...删除哈希表中指定的多个键值对
hincrby+增量值Hincrby key filed [num]向哈希表中指定的整数filed执行 "+增量值" 操作

1、Hset   向哈希表中添加一对键值    (添加)

语法:Hset key filed1 value [filed2 ...]

  1. # 1.添加单个field-value 到user1对象中 (键值对:name-wpf)
  2. [127.0.0.1:6379> hset user1 id 3
  3. (integer) 1
  4. # 查询user2
  5. [127.0.0.1:6379> hgetall user1
  6. 1) "id"
  7. 2) "3"
  8. # 2.添加多个field-value 到user2对象中 (键值对:name-wpf age-18)
  9. [127.0.0.1:6379> hset user2 name wpf age 18
  10. (integer) 2
  11. # 查询user2
  12. [127.0.0.1:6379> hgetall user2 # [hgetall key] 获取哈希表key中所有的键值对
  13. 1) "name"
  14. 2) "wpf"
  15. 3) "age"
  16. 4) "18"

2、Hsetnx   哈希表中不存在field,则添加    (不存在则添加)

语法:Hsetnx key filed value 

  1. # 添加一对键值(key-value)到 map1哈希表中 (nam-lisa)
  2. [127.0.0.1:6379> hset map1 name lisa
  3. (integer) 1
  4. # 1. 如果不存在name这个field,则添加,如果存在,就忽略此次操作
  5. 127.0.0.1:6379> hsetnx map1 name rose
  6. (integer) 0
  7. # 查询哈希表map1的所有键值(上述添加rose失败,因为存在name这个field了,即key已存在)
  8. 127.0.0.1:6379> hgetall map1
  9. 1) "name"
  10. 2) "lisa"
  11. # 2. 继续使用“不存在则添加”命令,往哈希表map1中添加键值对 age-20
  12. 127.0.0.1:6379> hsetnx map1 age 20
  13. (integer) 1
  14. # 查询哈希表map1的所有键值(age添加成功了)
  15. 127.0.0.1:6379> hgetall map1
  16. 1) "name"
  17. 2) "lisa"
  18. 3) "age"
  19. 4) "20"

3、Hget   查询哈希表中单个filed的value值    (查询单个filed的值)

语法:Hget key filed 

  1. # 查询哈希表map1的所有键值
  2. 127.0.0.1:6379> hgetall map1
  3. 1) "name"
  4. 2) "lisa"
  5. 3) "age"
  6. 4) "20"
  7. # 查询哈希表map1中指定的age的值
  8. 127.0.0.1:6379> hget map1 age
  9. "20"

4、Hmget   查询哈希表中多个filed的value值    (查询多个filed的值)

语法:Hmget key filed1 filed2... 

  1. # 查询哈希表map1的所有键值
  2. 127.0.0.1:6379> hgetall map1
  3. 1) "name"
  4. 2) "lisa"
  5. 3) "age"
  6. 4) "20"
  7. # 查询哈希表map1中 name和age的值
  8. 127.0.0.1:6379> hmget map1 name age
  9. 1) "lisa"
  10. 2) "20"

5、Hlen   查询哈希表中filed的数量    (查询filed数量)

语法:Hlen key

  1. # 查询哈希表map1的所有键值
  2. 127.0.0.1:6379> hgetall map1
  3. 1) "name"
  4. 2) "lisa"
  5. 3) "age"
  6. 4) "20"
  7. # 查询哈希表map1 的filed数量(name、age)
  8. 127.0.0.1:6379> hlen map1
  9. (integer) 2

6、Hkeys   查询哈希表中所有的filed    (查询全部filed)

语法:Hkeys key

  1. # 查询哈希表map1的所有键值
  2. 127.0.0.1:6379> hgetall map1
  3. 1) "name"
  4. 2) "lisa"
  5. 3) "age"
  6. 4) "20"
  7. # 查询哈希表map1中所有的filed(即key)
  8. 127.0.0.1:6379> hkeys map1
  9. 1) "name"
  10. 2) "age"

8、Hvals   查询哈希表中所有的value值   (查询全部value)

语法:Hvals key

  1. # 查询哈希表map1的所有键值
  2. 127.0.0.1:6379> hgetall map1
  3. 1) "name"
  4. 2) "lisa"
  5. 3) "age"
  6. 4) "20"
  7. # 查询哈希表map1中所有 filed的value值
  8. 127.0.0.1:6379> hvals map1
  9. 1) "lisa"
  10. 2) "20"

9、Hexists   查询哈希表中是否存在某个filed    (判断是否存在filed)

语法:Hexists key

  1. # 查询哈希表map1的所有键值
  2. 127.0.0.1:6379> hgetall map1
  3. 1) "name"
  4. 2) "lisa"
  5. 3) "age"
  6. 4) "20"
  7. # 查询哈希表map1中 是否存在filed为id的
  8. 127.0.0.1:6379> hexists map1 id
  9. (integer) 0 #不存在,返回0
  10. # 查询哈希表map1中 是否存在filed为name的
  11. 127.0.0.1:6379> hexists map1 name
  12. (integer) 1 #存在,返回1

10、Hdel  删除哈希表中指定的filed    (删除filed)

语法:Hdel key filed1 filed2 ...

  1. # 添加 [name-jack]、[age-28]、[id-5] 键值对到 map1哈希表中
  2. 127.0.0.1:6379> hmset map1 name jack age 28 id 5
  3. OK
  4. # 查询哈希表map1的所有键
  5. 127.0.0.1:6379> hkeys map1
  6. 1) "name"
  7. 2) "age"
  8. 3) "id"
  9. # 删除map1中的age、name
  10. 127.0.0.1:6379> hdel map1 age name
  11. (integer) 2
  12. # 查询哈希表map1的所有键 (只剩"id",另外两个已被删除)
  13. 127.0.0.1:6379> hkeys map1
  14. 1) "id"

11、Hincrby 删除哈希表中指定的filed    (给某个整数添加增量值)

语法:Hincrby key filed1 filed2 ...

  1. # 查询哈希表map1的所有键值对
  2. 127.0.0.1:6379> hgetall map1
  3. 1) "id"
  4. 2) "5"
  5. 给map1中的id键的值累加+3
  6. 127.0.0.1:6379> hincrby map1 id 3
  7. (integer) 8 #原始5,加3后等于8
  8. 给map1中的id键的值累加+1
  9. 127.0.0.1:6379> hincrby map1 id 1
  10. (integer) 9 #原始8,加1后等于9

四、Hash结构优缺点

  • 优点:简单直观,将同类数据归类整合储存(同一个key),方便数据管理相比String储存更节省空间

  • 缺点:要控制和减少 哈希 在 ziplist 和 hashtable 两种 内部编码 的 转换,hashtable 会消耗 更多内存。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/800859
推荐阅读
相关标签
  

闽ICP备14008679号