介绍Redis数据结构hash

  Redis hash是将字符串名称映射到字符串值,它是一种将对象作为Redis数据结构完美方式,Redis提供基础操作方法如get, set, exist等,当然也包括高级操作,见 这里。

  Redis hash也可以作为字典实现,在存储优化上Hash有优化算法,称为ziplist(Redis 2.6之前称为zipmap)。该压缩算法能够优化节省内存,ziplist也用于优化排序set和list集合的存储。当一个hash压偏到这样一个压缩过的集合中时,类似这样排列[key1, value1, key2, value2, ...],带有一些key的Hash能够被打包进入线性数组结构,同时保证get和set时的O(1) 性能。这种方式很显然不会随着hash字段增加时能够保持这样的性能,当hash增长时,它会被转为标准的字典结构来维持O(1)性能,而空间节省特性就会失效,Redis配置参数会控制这个转换:

  • list-max-ziplist-entries 默认 (512): 如果hash增长大于这个限制值,将改变到标准模式(字典)
  • list-max-ziplist-value 默认 (64): 当hash中最大元素超过这个限制值,hash将改变到标准模式

  更多细节见here

  为了节约内存,推荐使用hash替代普通字符串的使用,这就能利用Redis强大的hash特性,因此,请尽可能使用hash,小的hash将被编码使用小的空间,比如如果你在web应用中有很多对象,与其使用不同key分别代表name, surname, email, password, 完全可以使用一个hash代表这四个所有字段。

  Redis Hash自然适合存储这些对象:会话session, 用户,访客等,同时这也是缓存大量数据的选择。

  假设有数以百亿计对象需要存储,每个对象以哈希字符串定位的,我们倾向于开发一个查询系统以便根据ID发现对象的定位。典型做法是使用字符串:

set object:14590860 "007f80f0a62408..."
set object:11678 "009f80abcd0a60..."

  这个方式虽然很好,但是当有大量对象时,就需要耗费很多内存,使用内存优化的hash则可以做得更好,首先我们得给 list-max-ziplist-entries 和 list-max-ziplist-value选择正确的值,list-max-ziplist-value值是需要存储对象的哈希字符串的最大长度,list-max-ziplist-entries得设置足够低,取决于我们放入条目的数量,比如,对于1亿个对象我们选择使用100k个hash,最大条目数量将是100m/100k=1000。

  应用逻辑中根据对象计算hash的方式是:用对象ID除以100k,去除余数即可,比如对象ID是14590860,那么这个对象将进入hash (14590860/100k) = 145

hset object:145 14590860 "007f80f0a62408..."
hget object:145 14590860
> "007f80f0a62408..."

  这种方式不仅轻量,而且提供很好的本地缓存。

 

介绍Redis数据结构set

Redis安装

Redis Cluster快速安装指南

NoSQL专题

缓存专题