2012-09-25 35 views
2

我讀過redis中的一些代碼,但我沒有找到它如何處理長整數值(例如SET mykey 123456789123456789)---我的意思是不能直接存儲在ptr字段中的長整數(例如8字節) (我的機器中有4個字節)的robj結構體。redis如何編碼長整數?

PS:我讀取了object.c中tryObjectEncoding函數的代碼,但只發現了REDIS_ENCODING_INT數據類型的編碼。事實上,redis中沒有很長的類型。這是否意味着長度超過4個字節的整數將被編碼爲REDIS_ENCODING_STRING?

回答

3

REDIS_ENCODING_INT實際上代表一個8字節的數字。請參閱util.c中的方法string2l - 它試圖將字符串轉換爲long long。

換句話說,4和8字節之間的整數使用REDIS_ENCODING_INT進行編碼,而不是默認的字符串編碼。

+0

但是在object.c中的tryObjectEncoding函數中,我看到了「o-> ptr =(void *)value;」,如何在不遺失精度的情況下將長整型轉換爲void *指針? – realjin

+0

哦,我嘗試打印sizeof(long)和sizeof(void *),它們在我的機器中都是4個字節。這是巧合還是一些關係? – realjin