字符串对象
对象编码方式有三种:
int: 当值为小的整数值,使用long类型存储
embstr:值为简短的字节数组(同样也是SDS,仅调用一次内存分配函数,分配的连续空间,空间中包含redisObject和sdshdr)
raw:底层采用SDS字符串存储(调用两次内存分配函数,分配给redisObject和sdshdr)
编码变更:
列表对象
对象编码方式有三种:
ziplist:列表中所有字符串元素的长度小于64;元素的数量小于512个,使用ziplist
linkedlist:当ziplist中两个条件有一个不满足时,就会转换为linkedlist。
local:0>rpush blah "hello" "word" "again"
"3"
local:0>object encoding blah
"ziplist"
local:0>rpush blah "wwwwwwwwwwwwwwwwwwwwwmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmlocal:0>"
"5"
local:0>object encoding blah
"linkedlist"
哈希对象
编码方式有两种:
ziplist:压缩列表,当哈希对象保存的所有键值对的字符串的长度都小于64字节;键值对的数量小于512个。
hashtable:哈希表编码,当不满足上述条件之一,就会转换为hashtable存储。
local:0>hset studeng name "wang"
"1"
local:0>object encoding studeng
"ziplist"
# 键值对的值的长度大于了64字节,转换为hashtable
local:0>hset studeng desc "dfijfdoiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiilocal:0>fsooooooooooooooooooooooooooooooooooooooooo"
"1"
local:0>object encoding studeng
"hashtable"
集合对象
集合对象的编码有两种:
intset:整数集合,所有 元素都是整数值;元素数量不超过512个;满足两个条件的话,集合对象将采用整数集合编码存储(两个条件的上限值都可以修改)。
hashtable:哈希表,不满足上述条件,将使用hashtable存储。
local:0>sadd number 1 3 5 76
"4"
local:0>object encoding number
"intset"
local:0>sadd number 'aaa'
"1"
local:0>object encoding number
"hashtable"
有序集合对象
有序集合编码:
ziplist:压缩列表,每个集合元素使用两个紧挨在一起的压缩节点保存,第一个节点为元素的成员,第二个元素为元素的分值。需要满足:元素数量小于128个,元素成员的长度小于64字节
skiplist:跳跃表,按照分值从小到大保存集合元素,zset通常使用字典和跳跃表一起使用,字典负责在O(1)时间内,查看到元素和分数的映射,跳跃表可以进行范围查询。
local:0>eval "for i=1, 128 do redis.call('zadd',KEYS[1], i,i) end" 1 numbers
"null"
local:0>object encoding numbers
"ziplist"
local:0>zadd numbers 3.14 pi
"1"
local:0>object encoding numbers
"skiplist"
local:0>zcard numbers
"129"