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配置参数会控制这个转换:
更多细节见 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安装
Redis Cluster快速安装指南