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 | 等同hset | Hset 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值 |
hlen | filed数量 | Hlen key | 返回哈希表中filed的数量 |
hkeys | 全部filed | Hkeys key | 返回哈希表中全部filed |
hvals | 全部value | Hvals key | 返回哈希表中全部value |
hexists | 判断是否存在 | Hexists key filed | 判断哈希表中 filed是否存在 |
hdel | 删除指定filed | Hdel key filed1 filed2... | 删除哈希表中指定的多个键值对 |
hincrby | +增量值 | Hincrby key filed [num] | 向哈希表中指定的整数filed执行 "+增量值" 操作 |
1、Hset 向哈希表中添加一对键值 (添加)
语法:
Hset key filed1 value [filed2 ...]
# 1.添加单个field-value 到user1对象中 (键值对:name-wpf)
[127.0.0.1:6379> hset user1 id 3
(integer) 1
# 查询user2
[127.0.0.1:6379> hgetall user1
1) "id"
2) "3"
# 2.添加多个field-value 到user2对象中 (键值对:name-wpf age-18)
[127.0.0.1:6379> hset user2 name wpf age 18
(integer) 2
# 查询user2
[127.0.0.1:6379> hgetall user2 # [hgetall key] 获取哈希表key中所有的键值对
1) "name"
2) "wpf"
3) "age"
4) "18"
2、Hsetnx 哈希表中不存在field,则添加 (不存在则添加)
语法:
Hsetnx key filed value
# 添加一对键值(key-value)到 map1哈希表中 (nam-lisa)
[127.0.0.1:6379> hset map1 name lisa
(integer) 1
# 1. 如果不存在name这个field,则添加,如果存在,就忽略此次操作
127.0.0.1:6379> hsetnx map1 name rose
(integer) 0
# 查询哈希表map1的所有键值(上述添加rose失败,因为存在name这个field了,即key已存在)
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
# 2. 继续使用“不存在则添加”命令,往哈希表map1中添加键值对 age-20
127.0.0.1:6379> hsetnx map1 age 20
(integer) 1
# 查询哈希表map1的所有键值(age添加成功了)
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"
3、Hget 查询哈希表中单个filed的value值 (查询单个filed的值)
语法:
Hget key filed
# 查询哈希表map1的所有键值
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"
# 查询哈希表map1中指定的age的值
127.0.0.1:6379> hget map1 age
"20"
4、Hmget 查询哈希表中多个filed的value值 (查询多个filed的值)
语法:
Hmget key filed1 filed2...
# 查询哈希表map1的所有键值
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"
# 查询哈希表map1中 name和age的值
127.0.0.1:6379> hmget map1 name age
1) "lisa"
2) "20"
5、Hlen 查询哈希表中filed的数量 (查询filed数量)
语法:
Hlen key
# 查询哈希表map1的所有键值
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"
# 查询哈希表map1 的filed数量(name、age)
127.0.0.1:6379> hlen map1
(integer) 2
6、Hkeys 查询哈希表中所有的filed (查询全部filed)
语法:
Hkeys key
# 查询哈希表map1的所有键值
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"
# 查询哈希表map1中所有的filed(即key)
127.0.0.1:6379> hkeys map1
1) "name"
2) "age"
8、Hvals 查询哈希表中所有的value值 (查询全部value)
语法:
Hvals key
# 查询哈希表map1的所有键值
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"
# 查询哈希表map1中所有 filed的value值
127.0.0.1:6379> hvals map1
1) "lisa"
2) "20"
9、Hexists 查询哈希表中是否存在某个filed (判断是否存在filed)
语法:
Hexists key
# 查询哈希表map1的所有键值
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"
# 查询哈希表map1中 是否存在filed为id的
127.0.0.1:6379> hexists map1 id
(integer) 0 #不存在,返回0
# 查询哈希表map1中 是否存在filed为name的
127.0.0.1:6379> hexists map1 name
(integer) 1 #存在,返回1
10、Hdel 删除哈希表中指定的filed (删除filed)
语法:
Hdel key filed1 filed2 ...
# 添加 [name-jack]、[age-28]、[id-5] 键值对到 map1哈希表中
127.0.0.1:6379> hmset map1 name jack age 28 id 5
OK
# 查询哈希表map1的所有键
127.0.0.1:6379> hkeys map1
1) "name"
2) "age"
3) "id"
# 删除map1中的age、name
127.0.0.1:6379> hdel map1 age name
(integer) 2
# 查询哈希表map1的所有键 (只剩"id",另外两个已被删除)
127.0.0.1:6379> hkeys map1
1) "id"
11、Hincrby 删除哈希表中指定的filed (给某个整数添加增量值)
语法:
Hincrby key filed1 filed2 ...
# 查询哈希表map1的所有键值对
127.0.0.1:6379> hgetall map1
1) "id"
2) "5"
给map1中的id键的值累加+3
127.0.0.1:6379> hincrby map1 id 3
(integer) 8 #原始5,加3后等于8
给map1中的id键的值累加+1
127.0.0.1:6379> hincrby map1 id 1
(integer) 9 #原始8,加1后等于9
四、Hash结构优缺点
-
优点:简单直观,将同类数据归类整合储存(同一个key),方便数据管理相比String储存更节省空间
-
缺点:要控制和减少 哈希 在
ziplist
和hashtable
两种 内部编码 的 转换,hashtable
会消耗 更多内存。