Memory 对象的Redis编码和大小影响
当我将一些对象写入redis时,我可以得到不同的内存使用统计数据。我想知道这是怎么发生的 简单的例子:Memory 对象的Redis编码和大小影响,memory,redis,redis-cli,redis-cache,Memory,Redis,Redis Cli,Redis Cache,当我将一些对象写入redis时,我可以得到不同的内存使用统计数据。我想知道这是怎么发生的 简单的例子: 127.0.0.1:6379> set a 1 OK 127.0.0.1:6379> MEMORY usage a (integer) 49 127.0.0.1:6379> set a "1" OK 127.0.0.1:6379> MEMORY usage a (integer) 49 127.0.0.1:6379> set a \x01 <<<
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> MEMORY usage a
(integer) 49
127.0.0.1:6379> set a "1"
OK
127.0.0.1:6379> MEMORY usage a
(integer) 49
127.0.0.1:6379> set a \x01 <<<< Message packed of number 1
OK
127.0.0.1:6379> MEMORY usage a
(integer) 55
127.0.0.1:6379> set a '\x01' <<<< Message pack of number 1 but added ''
OK
127.0.0.1:6379> MEMORY usage a
(integer) 55
127.0.0.1:6379> set a "\x01" <<<<< Message pack of number 1 but added ""
OK
127.0.0.1:6379> MEMORY usage a
(integer) 52
稍微复杂一点的值(带数字的字符串)
和一个大的JSON字符串(然后是打包的消息),编码为“原始”
此答案基于64位机器上的Redis 4.0 为了节省内存,Redis采用三种方法对值字符串进行编码:
-2^63
~2^63
,Redis将值保存为整数。这是最有效的编码44
字节,Redis将字符串保存在Redis对象本身的同一块中。这比原始字符串
编码更节省内存。而且,它对缓存更友好设置1
和设置“1”
:该值是可以转换为1
的字符串。因此Redis使用Int编码,即编码:Int
设置一个\x01
和设置一个'\x01'
:该值是一个包含4个
字符的字符串(注意:由于该字符串包含在单引号中,因此不会转义)。无法将其转换为整数,且其大小小于44
。因此Redis使用嵌入字符串编码,即编码:embstr
设置一个“\x01”
:由于字符串用双引号括起,因此该值将作为二进制字符串转义,其长度(即1
字节)小于44
,并且无法转换为整数。因此Redis使用嵌入字符串编码,即编码:embstr
44
的字符串。因此Redis使用原始字符串编码,即编码:原始
我想在“3”中,你的意思是它可以转换成整数,对吗?如果你把一个字符串和一个二进制字符串混合在一起呢?i、 e.“MyLongKeyABC1234”的内存占用与“MyLongKeyABC\xcd\x04\xd2”不同。否,“\x01”不能转换为整数。它与“1”不同,后者的ASCII码是“\x31”。因此
设置“\x31”
与设置1
相同。如果混合使用ascii字符串和二进制字符串,Redis将使用嵌入字符串或原始字符串编码,具体取决于字符串长度。在您的情况下,MyLongKeyABC1234
比MyLongKeyABC\xcd\x04\xd2
长一个字节,因为字符串转义。所以它们有不同的内存占用。
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> DEBUG OBJECT a
Value at:0x7f9858217ba0 refcount:2147483647 encoding:int serializedlength:2 lru:11691925 lru_seconds_idle:222
127.0.0.1:6379> set a "1"
OK
127.0.0.1:6379> DEBUG OBJECT a
Value at:0x7f9858217ba0 refcount:2147483647 encoding:int serializedlength:2 lru:11692152 lru_seconds_idle:1
127.0.0.1:6379> set a \x01
OK
127.0.0.1:6379> DEBUG OBJECT a
Value at:0x7f98563a1398 refcount:1 encoding:embstr serializedlength:5 lru:11692162 lru_seconds_idle:0
127.0.0.1:6379> set a '\x01'
OK
127.0.0.1:6379> DEBUG OBJECT a
Value at:0x7f98563a13e0 refcount:1 encoding:embstr serializedlength:5 lru:11692168 lru_seconds_idle:1
127.0.0.1:6379> set a "\x01"
OK
127.0.0.1:6379> DEBUG OBJECT a
Value at:0x7f98563a1788 refcount:1 encoding:embstr serializedlength:2 lru:11692177 lru_seconds_idle:1
127.0.0.1:6379> set a "abc123"
OK
127.0.0.1:6379> DEBUG OBJECT a
Value at:0x7f985821b260 refcount:1 encoding:embstr serializedlength:7 lru:11692243 lru_seconds_idle:3
127.0.0.1:6379> MEMORY usage a
(integer) 57
127.0.0.1:6379> set a \xa6abc123
OK
127.0.0.1:6379> MEMORY usage a
(integer) 61
127.0.0.1:6379> DEBUG OBJECT a
Value at:0x7f985821b320 refcount:1 encoding:embstr serializedlength:11 lru:11692273 lru_seconds_idle:9
127.0.0.1:6379> set a "\xa6abc123"
OK
127.0.0.1:6379> MEMORY usage a
(integer) 58
127.0.0.1:6379> DEBUG OBJECT a
Value at:0x7f985821b260 refcount:1 encoding:embstr serializedlength:8 lru:11692291 lru_seconds_idle:11
127.0.0.1:6379>
127.0.0.1:6379> set a '[{"id":1,"first_name":"Kyrstin","last_name":"Ifill","email":"kifill0@livejournal.com","count":93,"ip_address":"182.218.153.253"}]'
OK
127.0.0.1:6379> DEBUG OBJECT a
Value at:0x7f98582b96f0 refcount:1 encoding:raw serializedlength:128 lru:11692490 lru_seconds_idle:2
127.0.0.1:6379> MEMORY usage a
(integer) 182
127.0.0.1:6379> set a '\x91\x86\xa5count]\xaafirst_name\xa7Kyrstin\xa9last_name\xa5Ifill\xa5email\xb7kifill0@livejournal.com\xaaip_address\xaf182.218.153.253\xa2id\x01'
OK
127.0.0.1:6379> MEMORY usage a
(integer) 197
127.0.0.1:6379> DEBUG OBJECT a
Value at:0x7f98582b9700 refcount:1 encoding:raw serializedlength:143 lru:11692517 lru_seconds_idle:6
127.0.0.1:6379> set a "\x91\x86\xa5count]\xaafirst_name\xa7Kyrstin\xa9last_name\xa5Ifill\xa5email\xb7kifill0@livejournal.com\xaaip_address\xaf182.218.153.253\xa2id\x01"
OK
127.0.0.1:6379> DEBUG OBJECT a
Value at:0x7f98582b96f0 refcount:1 encoding:raw serializedlength:107 lru:11692535 lru_seconds_idle:2
127.0.0.1:6379> MEMORY usage a
(integer) 158