案例:现需要开发一个图片存储系统,要求这个系统能快速记录图片ID和图片在存储系统中保存的ID,同时,还要能够更具图片ID快速查找到图片存储对象ID。因图片数量巨大,所以选用10位数来表示图片ID和土拍你存储对象ID。例如:
photo_id: 1101000051
photo_obj_id: 3301000051
图片ID和图片存储对象ID正好一一对应,是典型的“键 - 单值”模式。所谓单值,就是指键值对中的值就是一个值,而不是一个集合,这和String类型提供的“一个键对应一个值的数据”的保存形式刚好契合。而且,String类型可以保存二进制字节流,只要把数据转换成二进制字节数组,就可以保存了。
所以,第一个方案就是用String保存数据,把图片ID和图片存储对象ID分别作为键值对的key和value来保存,其中图片存储对象ID用了String类型。
保存了1亿张照片后,大约用了6.4GB的内存。但是,随着图片数据量的增加,Redis内存使用量也在增加,结果就遇到了大内存Redis实例因生成RDB而响应慢的问题。很显然,String类型并不是一种好的选择。
String类型是适用于所有场合的,它有一个明显的短板,就是它保存数据时所消耗的内存空间较多。而集合类型有非常节省空间的底层实现结构,但是,集合类型保存的数据模式,是一个键值对应一系列值,并不适合直接保存单值的键值对。
使用二级编码的方法,可以实现用集合类型保存单值键值对,Redis实例的内存空间消耗明显下降了。
为什么String类型内存开销大?
除了记录实际数据,String类型还需