redis的hash类型

一些基本概念

Hash类型是String类型的field和value的映射表,或者说是一个String集合。
hash适合用于存储对象,相比较而言,对一个对象类型的存储在hash类型比存储在String类型里占有更少的内存空间,并对整个对象的存取。
可以看成具有key和value的map容器,该类型非常适合于存储值对象的信息
如:uname,upass,age等。
Redis中每个hash可以存储2的32次方-1键值对(40多亿)

Hash命令

赋值命令

  • hset key field value :为指定的key,设定field/value
  • hmset key field value [field1 value2] …… :同时将多个 field-value (域-值)对设置到哈希表key中。

取值命令

  • hget key field : 获取存储在hash中的值,根据field得到value
  • hmget key field[field1] : 获取key所有给定字段的值
  • hgetall key:返回hash表中的所有的字段和值

hkeys key: 获取所有哈希表中的字段
hlen key:获取哈希表中字段的数量

删除语法

hdel key field1[field2] : 删除一个或多个hash表字段
del key : 也可以删除 hash类型值整体删除

其他语法

hsetnx key field value: 只有字段field不存在时,设置哈希表字段的值
hincrby key field increment: 为哈希表key 中的指定字段的证书值加上增量 increment
hincrbyfloat key field increment : 为哈希表key中的指定字段的浮点数值加上增量 increment
hexists key field : 查看哈希表 key 中,指定的字段是否存在

应用场景

1.常用用于存储一个对象
2.为什么不用string存储一个对象呢?

Hash 是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成 hashmap 存放在 redis 中

用户 D 为查找的 key,存储的 value 用户对象包含姓名,年龄,生日等信息,如果用普通的 key-value结构来存储,主要有以下 2 种存储方式

第一种方式将用户工 D 作为意找 key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是, 増加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS 等复杂问题(并发安全问题)。
比如:
user对象有 id name age 三个字段
将对象转成JSON字符串
set user:1 {"id","name":"lisi",score:"20"}
取得时候:json转成对象

第二种方法是这个用户信息对象有多少成员就存成多少个 key- value 对儿,用用户 ID+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID 为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。

set user:1:id 1
set user:1:name lisi
set user:1:score 20

总结:

Redist 提供的 Hash 很好的解決了这个问题,Redis 的 Hash 实际是内部存储的 Value 为一个 Hashmap,

并提供了直接存取这个 Map 成员的接口

你可能感兴趣的:(redis的hash类型)