在redis原始碼中的輔助工具類中,主要包括大小端轉換、sha演算法以及util.h中對應的演算法。
大小端轉換:
linux系統中有自帶的大小端轉換方法,16位、32位的轉換,但是沒有針對64位的轉換,但是redis中加入了對64位資料的大小端轉換方法,api介面如下:
void memrev16(void *p);
void memrev32(void *p);
void memrev64(void *p);
uint16_t intrev16(uint16_t v);
uint32_t intrev32(uint32_t v);
uint64_t intrev64(uint64_t v);
其中,以64位為例:
void memrev64(void *p)
x[7]與x[0]、x[6]與x[1]、x[5]與x[2]、x[4]與x[3]進行互換,是不是很簡單,一目了然。
在redis中,加密演算法的實現使用的是sha演算法。sha是安全hash演算法,與md5一樣,都是屬於訊息摘要演算法,底層實現的機制是hash,不可逆的,在加密長度上,做了很大的擴充套件,安全性也更高長度不超過2^64位的字串或二進位製流,最終生成乙個20byte的摘要。
typedef struct sha1_ctx;
void sha1transform(uint32_t state[5], const unsigned char buffer[64]);
void sha1init(sha1_ctx* context);
void sha1update(sha1_ctx* context, const unsigned char* data, uint32_t len);
void sha1final(unsigned char digest[20], sha1_ctx* context);
測試方法或者呼叫方法如下:
int sha1test(int argc, char **ar**)
else
negative = 1;
} else
/* check length. */
uint32_t const length = digits10(value)+negative;
if (length >= dstlen) return 0;
/* null term. */
uint32_t next = length;
dst[next] = '\0';
next--;
while (value >= 100)
/* handle last 1-2 digits. */
if (value < 10) else
/* add sign. */
if (negative) dst[0] = '-';
return length;
}
digit[201]就是從00-99的數字字元,餘數的賦值就通過這個陣列,高效,方便,是提高了很多的速度。 Redis原始碼分析之unlock
override public void unlock if opstatus 第一步 發布解鎖訊息刪除key protected rfutureunlockinnerasync long threadid 呼叫lua指令碼,exists命令 若 key 存在返回 1 否則返回 0 publish ...
redis之string原始碼分析
string資料型別的物件編碼有兩種,分別是embstr和raw。兩種編碼的區別並不大,embstr相對於raw,記憶體空間連續。兩者的資料格式見下圖 redis的string資料之所以使用embstr和raw兩種編碼格式,是為了當乙個string物件的值比較小時,使用乙個連續的記憶體分割槽存放re...
Redis原始碼分析之SET流程
本篇分析redis 如何處理set指令 客戶端解析使用者輸入 構造指令 redisformatsdscommandar clisendcommand issuecommandrepeat repl 例如使用者輸入set abcd 2,則構造的指令就是 3 r n 3 r nset r n 4 r n...