2013-09-30 60 views
1

當我讀取redis源代碼時,我發現redis只在little endian中存儲內存數據。提取這些數據時,必須將其轉換爲本地機器字節順序。如在ziplist.c:爲什麼redis僅在小端存儲內存數據?

static int64_t zipLoadInteger(unsigned char *p, unsigned char encoding) { 
    int16_t i16; 
    int32_t i32; 
    int64_t i64, ret = 0; 
    if (encoding == ZIP_INT_8B) { 
     ret = ((int8_t*)p)[0]; 
    } else if (encoding == ZIP_INT_16B) { 
     memcpy(&i16,p,sizeof(i16)); 
     memrev16ifbe(&i16); 
     ret = i16; 
    } //...... 
    return ret; 
} 

我認爲存儲內存中的數據在本機格式(無論是在LE和BE)的最有效的方法,並有何時數據寫入磁盤或從磁盤讀取它們,那麼數據可以轉換成特定的格式。由於內存中的數據操作比磁盤中的操作更頻繁,所以我認爲redis中的方式並不那麼有效。

或者我誤解了一些東西?

回答

1

這可能是一種策略,但另一方面:

  • 我敢肯定的Redis的生產部署99%的英特爾/ AMD箱(即小尾數箱)上運行。所以在實踐中,它沒有什麼影響。

  • 使用相同的內存中的表示將數據存儲在存儲器中,在磁盤上是保持轉儲時間低(因此減小寫入時複製存儲器的開銷)是有用的。由於後臺保存進程和寫時複製的分叉,轉儲時間越長,浪費的內存就越多。通過對ziplist使用相同的表示形式,Redis RDB函數可以將ziplist內容轉儲到文件中,而無需解析它,從而節省了許多CPU緩存缺失。

  • 即使選擇了另一個持久性機制,也可以使用RDB轉儲機制,因爲它也用於初始化從屬。因此其性能至關重要。

+0

我可以寫入數據或從磁盤讀取數據,它們與內存中的字節順序相同。這對於具有不同字節順序的機器來說是不利的,但在實踐中很少見,您可以將一個字節順序標誌保存在磁盤文件中並避免錯誤。處理字節順序非常麻煩! – zadecn

相關問題