Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 对象的Redis编码和大小影响_Memory_Redis_Redis Cli_Redis Cache - Fatal编程技术网

Memory 对象的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 <<<

当我将一些对象写入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 <<<< 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采用三种方法对值字符串进行编码:

  • Int:如果值字符串可以转换为整数,例如
    -2^63
    ~
    2^63
    ,Redis将值保存为整数。这是最有效的编码
  • 嵌入字符串:如果值字符串的大小小于或等于
    44
    字节,Redis将字符串保存在Redis对象本身的同一块中。这比
    原始字符串
    编码更节省内存。而且,它对缓存更友好
  • 原始字符串:否则,Redis使用原始编码
  • 在您的情况下:

  • 设置1
    设置“1”
    :该值是可以转换为
    1
    的字符串。因此Redis使用Int编码,即
    编码:Int
  • 设置一个\x01
    设置一个'\x01'
    :该值是一个包含
    4个
    字符的字符串(注意:由于该字符串包含在单引号中,因此不会转义)。无法将其转换为整数,且其大小小于
    44
    。因此Redis使用嵌入字符串编码,即
    编码:embstr
  • 设置一个“\x01”
    :由于字符串用双引号括起,因此该值将作为二进制字符串转义,其长度(即
    1
    字节)小于
    44
    ,并且无法转换为整数。因此Redis使用嵌入字符串编码,即
    编码:embstr
  • 设置一个大的json字符串:该值是一个大于
    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