redis实验环境
针对学习redis 我们可以为您提供一套完善的学习环境
点击此处跳转
章节叙述
本章节我们介绍一下Hash
类型,几乎所有的编程语言都提供了哈希(Hash
)类型,它们的叫法可能是哈希,字典,关联数组。在 Redis
中,哈希类型是指键值,本身又是一个键值对结构。Redis
键值对和哈希类型的二者关系可以用下图表示:
常用命令
我们这里只介绍一些常用的命令,在本章节的附件中提供了Hash
类型所有的命令,以及示例。
-
1,单个设置值,获取值
Redis
可以通过hset
命令来创建一个Hash
类型的键值对,它可以一次设置多个field
:hset hash1 field1 val1 field2 val2
返回的是您新建成功的个数,我们可以通过
hget
来获取具体的field
的值hget hash1 field1
当前如果您想获取到指定
key
下边所有的filed和value
的话,您也可以使用如下的命令hgetall hash1
-
2,删除操作
我们在开始的基础设置以及了解到
del
可以删除指定的key
,Redis
针对Hash
类型来提供了删除指定field
的命令:hdel hash1 field1
您可以使用这个命令删除指定的
field
,当然也支持同时删除多个hdel hash1 field1 field2
-
3,计算
field
的个数Redis
也提供了指定key
计算field
个数的方法hlen hash1
返回的为
field
的个数。 -
4,批量设置,获取
field-value
同样
Redis
也提供了Hash
类型批量设置和获取的方法hmset
和hmget
,我们来简单使用一下hmset hash1 field1 val1 field2 val2
大家可能会发现这个方法使用和
hset
方法一致。这个方法在Redis 4.0.0
的时候弃用了,如果您的Redis
版本低于4.0.0
还是需要使用hmset
来存储多个field-value
的,如下是官方文档介绍As per Redis 4.0.0, HMSET is considered deprecated. Please use HSET in new code. 根据Redis 4.0.0,HMSET被视为已弃用。请在新代码中使用HSET。
获取多个
field-value
目前还需要使用hmget
如下hmget hash1 field1 field2
内部编码
接下来我们来了解一下Hash
类型的内部编码。
-
1,
zipList
(压缩列表)当哈希类型元素个数小于
hash-max-ziplist-entries
配置(默认512个)、同时所有值小于hash-max-ziplist-value
配置(默认64字节)时,Redis
会使用ziplist
作为哈希的内部实现,ziplist
使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hshtable
更加优秀 -
2,
hashtable
(哈希表)当哈希类型无法满足
ziplist
的所有条件时,Redis
会使用hashtable
作为哈希的内部实现,因为此时ziplist
的读写效率会下降,而hashtable
的读写时间复杂度为0(1)
常见使用场景
-
1,用于缓存
Redis
的hash
类型的(key,field,value)的结构与对象的(对象id,属性,值)的结构相似,可以用来存储热点的对象数据。与 string 类型存储的区别如下String+json
hash
效率 很高 高 容量 低 低 灵活性 低 高 序列化 简单 复杂 当对象的某个属性需要频繁修改时,不合适用
string + json
,因为它不够灵活,每次修改都需要重新将整个对象序列化并赋值,如果使用 hash 类型则可以针对某个属性单独修改。另外使用string + json
格式存储查询检索方式单一,只能通过key
的方式查询,如果使用hash
类型存储则可以使用key +field
的方式进行检索。综上: 一般对象使用
string + json
存储,对象中如果有某些频繁变化的属性建议使用hash
存储