1.哈希(Hash)相当于Java中的一个bean对象
类似于Java中的一个JavaBean(例如:Users(id,name,age,remark))
1.1简介:
Redis hash 是一个string 类型的field和value的映射表,hash特别适合用于存储对象,Redis中每个hash可以存储2^32 - 1键值对(40多亿)
可以看成具有key和value的MAP容器,该类型非常适合于存储值对象的信息,如: uname,upass,age等。该类型的数据仅占用很少的磁盘空间(相比于JSON)
1.2 Hash命令
[1] 赋值语法
hset key field value//为指定的key,设定field/value对
hmset key field value[field1,value1].....同时将多个 field-value(域-值)对设置到哈希表key中
例如: hmset users uname guo age 20 address “北京市”
[2] 取值语法
hget key field//获取存储在hash中的值,根据field得到value
hmget key field [field1] //获取key所有给定字段的值
hgetall key //返回HASH表中所有的字段和值
hkeys key //获取所有哈希表中的字段
hlen key //获取哈希表中字段的数量
[3] 删除语法
hdel key field1[field2] //删除一个或多个HASH表字段
[4] 其他语法:
hsetnx key field value
只有在字段field不存在时,设置哈希表字段的值
hincrby key field increment
为哈希表key中指定字段的整数值加上增量increment
hincrbyfloat key field increment
为哈希表中指定字段的浮点数值加上增量increment
hexists key field
查看哈希表key中,指定的字段是否存在
1.3应用场景
Hash 的应用场景(存储一个用户信息对象数据)
[1] 常用于存储一个对象
[2] 为什么不用string存储一个对象?
hash 是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成 hashmap 存放在redis中。
用户ID 为查找的 key, 存储的 value 为用户对象包含姓名,年龄,生日等信息,如果用普通的用户ID 为查找的 key/value 结构来存储,主要有以下2种存储方式:
第一种方式将用户ID 作为查找 key,把其他信息封装成一个对象以序列化方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题
第二种方法是这个用户信息对象有多少成员就存多少个 key-value 对儿,用用户ID+对应属性名称作为唯一标识取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。
总结:
Redis提供的 Hash 很好解决了这个问题,Redis 的 Hash 实际是内部存储的 Value 为一个 HashMap, 并提供了直接存取这个 Map 成员的接口。