2.3 哈希
几乎所有的编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组。在Redis中,哈希类型是指键值本身又是一个键值对结构,形如value={{field1,value1},...{fieldN,valueN}},Redis键值对和哈希类型二者的关系可以用下图来表示。

哈希类型中的映射关系叫作field-value,注意这里的value是指field对应的值,不是键对应的值,请注意value在不同上下文的作用。
2.3.1 命令
- 设置值
hset key field value
新增一个哈希数据,同set和setnx的关系,Redis也提供了hsetnx的命令,只不过作用域变成了field.
- 获取值
hget key field
- 删除值
hdel key field [field ...]
hdel会删除一个或多个field,返回结果为成功删除field的个数.
- 计算field个数
hlen key
- 批量设置或获取field-value
hmget key field [field ...]
hmset key field value [field value ...]
- 判断field是否存在
hexists key field
- 获取所有的field
hkeys key
hkeys命令应该叫hfields更为恰当,它返回指定哈希键所有的field,而不是里面的值。
- 获取所有value
hvals key
- 获取所有的field-value
hgetall key
在使用hgetall时,如果哈希元素个数比较多,会存在阻塞Redis的可能。如果开发人员只需要获取部分field,可以使用hmget,如果一定要获取全部field-value,可以使用hscan命令,该命令会渐进式遍历哈希类型,hscan将在2.7节介绍。
- hincrby hincrbyfloat
hincrby key field
hincrbyfloat key field
hincrby和hincrbyfloat,就像incrby和incrbyfloat命令一样,但是它们的作用域是filed。
- 计算value的字符串长度
hstrlen key field
2.3.2 内部编码
哈希类型的内部编码有两种:ziplist(压缩列表)和hashtable(哈希表)。
ziplist的压缩效率更高,在数据元素个数比较小同时所有值也比较小的时候会使用ziplist,ziplist参数的调整可能会大大优化内存的使用率。
2.3.3 使用场景
哈希类型的使用场景更多是凸显在数据结构方面。
比如把关系型数据库里面的二维表可以转换为Redis的哈希类型来存储。在要给二维表中的某行数据增加一个字段,关系型数据库通常要对整个表进行操作,而哈希类型值需要直接添加对应field即可,更加灵活方便。当然关系型数据库可以使用SQL来做查询,功能更加强大。
此外,哈希类型也可以用作缓存的数据类型,并且有更高的压缩率。使用字符串类型的话,每个属性都有一个键值对,需要消耗大量的键值对;而使用哈希类型,用用户信息(user)来举例,一个用户只需要一个哈希类型,大大节约了内存的占用。
网友评论