一、特殊编码:
自从redis 2.2之后,很多数据类型都可以通过特殊编码的方式来进行存储空间的优化。其中,hash、list和由integer组成的sets都可以通过该方式来优化存储结构,以便占用更少的空间,在有些情况下,可以省去9/10的空间。
这些特殊编码对于redis的使用而言是完全透明的,事实上,它只是cpu和内存之间的一个交易而言。如果内存使用率方面高一些,那么在操作数据时消耗的cpu自然要多一些,反之亦然。在redis中提供了一组配置参数用于设置与特殊编码相关的各种阈值,如:
从redis 2.2开始,redis提供了getrange/setrange/getbit/setbit四个用于字符串类型key/value的命令。通过这些命令,我们便可以像操作数组那样来访问string类型的值数据了。比如唯一标识用户身份的id,可能仅仅是string值的其中一段子字符串。这样就可以通过getrange/setrange命令来方便的提取。再有就是可以使用bitmap来表示用户的性别信息,如1表示male,0表示female。用这种方式来表示100,000,000个用户的性别信息时,也仅仅占用12mb的存储空间,与此同时,在通过setbit/getbit命令进行数据遍历也是非常高效的。
三、尽可能使用hash:
由于小的hash类型数据占用的空间相对较少,因此我们在实际应用时应该尽可能的考虑使用hash类型,比如用户的注册信息,这其中包括姓名、性别、email、年龄和口令等字段。我们当然可以将这些信息以key的形式进行存储,而用户填写的信息则以string value的形式存储。然而redis则更为推荐以hash的形式存储,以上信息则以field/value的形式表示。
现在我们就通过学习redis的存储机制来进一步证明这一说法。在该篇博客的开始处已经提到了特殊编码机制,其中有两个和hash类型相关的配置参数:hash-max-zipmap-entries和hash-max-zipmap-value。至于它们的作用范围前面已经给出,这里就不再过多的赘述了。现在我们先假设存储在hash value中的字段数量小于hash-max-zipmap-entries,而每个元素的长度又同时小于hash-max-zipmap-value。这样每当有新的hash类型的key/value存储时,redis都会为hash value创建定长的空间,最大可预分配的字节数为:
total_bytes = hash-max-zipmap-entries * hash-max-zipmap-value
这样一来,hash中所有字段的位置已经预留,并且可以像访问数组那样随机的访问field/value,他们之间的步长间隔为hash-max-zipmap-value。只有当hash value中的字段数量或某一新元素的长度分别超过以上两个参数值时,redis才会考虑将他们以hash table的方式进行重新存储,否则将始终保持这种高效的存储和访问方式。不仅如此,由于每个key都要存储一些关联的系统信息,如过期时间、lru等,因此和string类型的key/value相比,hash类型极大的减少了key的数量(大部分的key都以hash字段的形式表示并存储了),从而进一步优化了存储空间的使用效率。
如对本文有疑问, 点击进行留言回复!!
将音频文件转二进制分包存储到Redis的实现方法(奇淫技巧操作)
网友评论