保存1 亿张10字节图片标识,String结构用了 6.4GB 的内存,为什么?如何优化?
数据量多时,比较占空间
存储数量量较多的时候,可以使用list数据结构来替代String,以二级编码的方式将数据存入redis
为什么String的内存开销大呢?
除了记录数据外,还需记录元数据
buf:字节数组,保存实际数据。为了表示字节数组的结束,Redis 会自动在数组最后加一个“\0”,这就会额外占用 1 个字节的开销。
len:占 4 个字节,表示 buf 的已用长度
alloc:也占个 4 字节,表示 buf 的实际分配长度,一般大于 len。
RedisObject
针对Long类型的优化:指针直接赋值为对应的值,节省空间
embstr编码方式:
字符串小于等于44字节时,RedisObject的数据是一块连续的内存空间。
raw编码方式
字符串大于等于44字节时,SDS会有独立的空间,用指针指向SDS结构