Redis
的字典是无序字典。Redis
的字典的值只能是字符串,当 hash
移除了最后一个元素之后,该数据结构自动被删除,内存被回收。
hash
结构也可以用来存储用户信息,不同于字符串一次性需要全部序列化整个对象,hash
可以对用户结构中的每个字段单独存储。这样当我们需要获取用户信息时可以进行部分获取。而以整个字符串的形式去保存用户信息的话就只能一次性全部读取,这样就会比较浪费网络流量。
hash
也有缺点,hash
结构的存储消耗要高于单个字符串,到底该使用 hash
还是字符串,需要根据实际情况再三权衡。
1. hash 类型相关命令
命令 | 说明 |
---|---|
hset key field value | 设置hash里面一个字段的值 |
hget key field | 获取hash中field的值 |
hexists key field | 判断field是否存在hash中 |
hgetall key | 从hash中读取全部的域和值 |
hkeys key | 获取hash 中所有field |
hvals key | 获取hash的所有值 |
hlen key | 获取hash中所有字段的数量 |
hdel key field[field…] | 删除一个或多个hash的field |
hmget key field[field…] | 获取hash里面指定字段的值 |
hmset key field[field…] | 设置hash字段值 |
hsetnx key field value | 设置hash的一个字段,只有这个字段不存在是有效 |
hstrlen key field | 获取hash里面指定field的长度(Redis 版本>= 3.2.0) |
hscan key cursor | 迭代hash里面的元素 |
hincrby key field increment | 将hash中指定域的值增加给定的值 |
hincrbyfloat key field increment | 将hash中指定域的值增加给定的浮点数 |
2. 使用示例
127.0.0.1:6379> hset student name "jack"
(integer) 1
127.0.0.1:6379> hget student name
"jack"
127.0.0.1:6379> hexists student name
(integer) 1
127.0.0.1:6379> hexists student gender
(integer) 0
127.0.0.1:6379> hset student gender "male"
(integer) 1
127.0.0.1:6379> hgetall student
1) "name"
2) "jack"
3) "gender"
4) "male"
127.0.0.1:6379> hkeys student
1) "name"
2) "gender"
127.0.0.1:6379> hvalues student
(error) ERR unknown command 'hvalues'
127.0.0.1:6379> hvals student
1) "jack"
2) "male"
127.0.0.1:6379> hlen student
(integer) 2
127.0.0.1:6379> hmget student name gender
1) "jack"
2) "male"
127.0.0.1:6379> hmset student grade 90 country "USA"
OK
127.0.0.1:6379> hmget student name grade gender country
1) "jack"
2) "90"
3) "male"
4) "USA"
127.0.0.1:6379> hdel student country
(integer) 1
127.0.0.1:6379> hgetall student
1) "name"
2) "jack"
3) "gender"
4) "male"
5) "grade"
6) "90"
127.0.0.1:6379>
127.0.0.1:6379> hmset student grade 90 country "USA"
OK
127.0.0.1:6379> hgetall
(error) ERR wrong number of arguments for 'hgetall' command
127.0.0.1:6379> hgetall student
1) "grade"
2) "90"
3) "country"
4) "USA"
127.0.0.1:6379> hstrlen student grade
(integer) 2
127.0.0.1:6379> hstrlen student country
(integer) 3
127.0.0.1:6379>
127.0.0.1:6379> hgetall student
1) "grade"
2) "90"
3) "country"
4) "USA"
127.0.0.1:6379> hincrby student grade 5
(integer) 95
127.0.0.1:6379> hgetall student
1) "grade"
2) "95"
3) "country"
4) "USA"
127.0.0.1:6379>