简介
Redis hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
类似Java里面的Map<String,Object>
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储
主要有以下2种存储方式:
- 每次修改用户的某个属性需要,先反序列化改好后再序列化回去。开销较大。
- 用户ID数据冗余
而采用hash结构:
通过key(用户ID) + field(属性标签)
就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题
常用命令
hset <key><field><value>给<key>集合中的 <field>键赋值<value>
hget <key1><field>从<key1>集合<field>取出 value
hmset <key1><field1><value1><field2><value2>... 批量设置hash的值
hexists<key1><field>查看哈希表 key 中,给定域 field 是否存在。
hkeys <key>列出该hash集合的所有field
hvals <key>列出该hash集合的所有value
hincrby <key><field><increment>为哈希表 key 中的域 field 的值加上增量 1 -1
hsetnx <key><field><value>将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .
数据结构
Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。
常用命令举例
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> hset myhash field1 zhubayi # set一个具体 key-vlaue
(integer) 1
127.0.0.1:6379> hget myhash field1 # 获取一个字段值
"zhubayi"
127.0.0.1:6379> hmset myhash field1 hello field2 world # set多个 key-vlaue
OK
127.0.0.1:6379> hmget myhash field1 field2 # 获取多个字段值
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash # 获取全部的数据,
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field1 # 删除hash指定key字段!对应的value值也就消了!
(integer) 1
127.0.0.1:6379> hgetall myhash # 获取全部的数据,
1) "field2"
2) "world"
127.0.0.1:6379>
hlen
127.0.0.1:6379> hgetall myhash # 获取全部的数据
1) "field2"
2) "world"
127.0.0.1:6379> hlen myhash # 获取hash表的字段数量!
(integer) 1
127.0.0.1:6379> hset myhash field1 haha
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
3) "field1"
4) "haha"
127.0.0.1:6379> hlen myhash # 获取hash表的字段数量!
(integer) 2
127.0.0.1:6379>
HEXISTS
127.0.0.1:6379> hgetall myhash #获取全部数据
1) "field2"
2) "world"
3) "field1"
4) "haha"
127.0.0.1:6379> hexists myhash field1 # 判断hash中指定字段是否存在!
(integer) 1
127.0.0.1:6379> hexists myhash field3 # 判断hash中指定字段是否存在!
(integer) 0
127.0.0.1:6379>
只获得所有field
只获得所有value
127.0.0.1:6379> hgetall myhash #获取所有数据
1) "field2"
2) "world"
3) "field1"
4) "haha"
127.0.0.1:6379> hkeys myhash #只获得所有field
1) "field2"
2) "field1"
127.0.0.1:6379> hvals myhash # 只获得所有value
1) "world"
2) "haha"
127.0.0.1:6379>
incr decr
127.0.0.1:6379> hset myhash field3 5
(integer) 1
127.0.0.1:6379> hincrby myhash field3 1 #指定增量!
(integer) 6
127.0.0.1:6379> hincrby myhash field3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash field4 hello # 如果不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 world # 如果存在则不能设置
(integer) 0
127.0.0.1:6379>
hash变更的数据 user name age,尤其是是用户信息之类的,经常变动的信息! hash 更适合于对象的存储,String更加适合字符串存储!