Redis哈希(Hash)

简介

Redis hash 是一个键值对集合。
Redis hash是一个string类型的fieldvalue的映射表,hash特别适合用于存储对象。
类似Java里面的Map
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储
主要有以下2种存储方式:

  1. 每次修改用户的某个属性需要,先反序列化改好后再序列化回去。开销较大。
    Redis哈希(Hash)_第1张图片
  2. 用户ID数据冗余
    Redis哈希(Hash)_第2张图片
    而采用hash结构:
    Redis哈希(Hash)_第3张图片
    通过 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更加适合字符串存储!

你可能感兴趣的:(redis,redis)