redis | 七、redis之Hash

redis系列文章:
https://liudongdong.top/categ...
本篇来源:
https://liudongdong.top/archi...
公众号:雨中散步撒哈拉
备注:欢迎关注公众号,一起学习,共同进步!
一、基本概念
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
【redis | 七、redis之Hash】hash类型可以理解为map集合,{key1:value1,key2:value2}
实例
127.0.0.1:6379> hmset map name liudd age 2 sex man OK 127.0.0.1:6379> hgetall map 1) "name" 2) "liudd" 3) "age" 4) "2" 5) "sex" 6) "man" 127.0.0.1:6379>

Hash 的应用场景:
将一个用户作为一个 hash ,然后其属性和值就作为内部的 k-v 集合进行存储
例如
hmset user:1 name 张 age 18 job stu

user:1 代表第 1 个用户,然后这个用户具有 name,age,job 这些字段,因为 redis 效率很高,因此适合将属性值经常变动的对象作为 hash 存储
二、命令分类
个人理解和便于学习,进行了简单分类!
分为以下几类:
  1. 增加映射
  2. 删除映射
  3. 查询映射
  4. 特有命令
1. 增加命令
  1. hset:设置一个key中的属性映射
  2. hsetnx:属性映射不存在,则创建成功
  3. hmset:批量设置属性映射
2. 删除映射
  1. hdel:删除一个或多个属性字段
3. 查询映射
  1. hget:查询一个key的属性映射
  2. hmget:查询多个key对应的属性映射
  3. hgetall:查询指定的key中所有的属性映射和值
  4. hexists:判断属性值是否存在
  5. hlen:统计集合有多少个属性
  6. hkeys:列出所有的key的属性
  7. hvals:列出所有的属性对应的value
4. 特有命令
  1. incrby:指定属性增加整数增量
  2. incrbyfloat:指定属性增加浮点型增量
三、命令实践
1. 增加映射
127.0.0.1:6379> keys * (empty list or set) # 设置属性name 127.0.0.1:6379> hset map name liudd (integer) 1 127.0.0.1:6379> hgetall map 1) "name" 2) "liudd" # 批量设置属性 127.0.0.1:6379> hmset map age 2 sex man OK 127.0.0.1:6379> hgetall map 1) "name" 2) "liudd" 3) "age" 4) "2" 5) "sex" 6) "man" # 属性ff不存在,则创建成功,反之存在则失败 127.0.0.1:6379> hsetnx map ff vv (integer) 1 127.0.0.1:6379> hgetall map 1) "name" 2) "liudd" 3) "age" 4) "2" 5) "sex" 6) "man" 7) "ff" 8) "vv" 127.0.0.1:6379> hsetnx map ff xx (integer) 0 127.0.0.1:6379> hgetall map 1) "name" 2) "liudd" 3) "age" 4) "2" 5) "sex" 6) "man" 7) "ff" 8) "vv" 127.0.0.1:6379>

2. 删除映射
127.0.0.1:6379> hgetall map 1) "name" 2) "liudd" 3) "age" 4) "2" 5) "sex" 6) "man" 7) "ff" 8) "vv" # 删除属性ff 127.0.0.1:6379> hdel map ff (integer) 1 127.0.0.1:6379> hgetall map 1) "name" 2) "liudd" 3) "age" 4) "2" 5) "sex" 6) "man" 127.0.0.1:6379>

3. 查询映射
# 查询所有属性和值 127.0.0.1:6379> hgetall map 1) "name" 2) "liudd" 3) "age" 4) "2" 5) "sex" 6) "man" # 查询map集合key-value有多少对 127.0.0.1:6379> hlen map (integer) 3 # 查询属性name值 127.0.0.1:6379> hget map name "liudd" # 批量查询属性值 127.0.0.1:6379> hmget map name age sex 1) "liudd" 2) "2" 3) "man" # 查询key的列表 127.0.0.1:6379> hkeys map 1) "name" 2) "age" 3) "sex" # 查询value的列表 127.0.0.1:6379> hvals map 1) "liudd" 2) "2" 3) "man" # 查询ff属性是否存在 127.0.0.1:6379> hexists map ff (integer) 0 127.0.0.1:6379> hexists map name (integer) 1 127.0.0.1:6379>

4. 特有命令
127.0.0.1:6379> hgetall map 1) "name" 2) "liudd" 3) "age" 4) "2" 5) "sex" 6) "man" # age属性增加整数7 127.0.0.1:6379> hincrby map age 7 (integer) 9 127.0.0.1:6379> hgetall map 1) "name" 2) "liudd" 3) "age" 4) "9" 5) "sex" 6) "man" # age属性增加浮点型1.5 127.0.0.1:6379> hincrbyfloat map age 1.5 "10.5" 127.0.0.1:6379> hgetall map 1) "name" 2) "liudd" 3) "age" 4) "10.5" 5) "sex" 6) "man" 127.0.0.1:6379>

附录
下表列出了 redis hash 基本的相关命令:
序号 命令及描述
1 [HDEL key field1 field2] 删除一个或多个哈希表字段
2 HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
3 HGET key field 获取存储在哈希表中指定字段的值。
4 HGETALL key 获取在哈希表中指定 key 的所有字段和值
5 HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment 。
6 HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
7 HKEYS key 获取所有哈希表中的字段
8 HLEN key 获取哈希表中字段的数量
9 [HMGET key field1 field2] 获取所有给定字段的值
10 [HMSET key field1 value1 field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。
11 HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。
12 HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。
13 HVALS key 获取哈希表中所有值。
14 HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的键值对。
更多命令请参考:https://redis.io/commands

    推荐阅读