RedisObject
Redis中任意数据类型的键和值都会被封装成RedisObject,也叫redis对象。
-
unsigned type:4bit;表示的数据类型,即redis五大数据类型:
string、set、zset、list和hash。
-
unsigned encoding:4bit; 底层数据编码方式,同一数据类型存在不同的编码方式。如sds动态字符串就存在5种不同的编码。
-
unsigned lru:LRU_BITS;24bit;标识最后一次被访问的时间,占用24bit。便于判断空闲时间太久的key。
-
int refcount:4byte;对象引用计数器,计数器为0时,代表该对象无人引用,可以被回收。类似JVM垃圾回收机制。
-
void *ptr: 8byte;数据内容指针,占用8个byte。
注意:
单个redisObject占用 4bit + 4bit +24bit + 4byte + 8byte = 16byte。
所以当十万个字符串数据全部使用sds动态字符串保存时,全被封装成redisObject,也就浪费十万 * 16byte的内存,造成巨大的内存浪费。所以,当数据较多时,选择合适的数据类型(最好别全部使用string类型),节省内存空间。
Redis编码方式
Redis会根据存储的数据类型不同,选择不同的编码,共包含11种数据类型编码。
五种基础数据类型对应的数据编码如下: