Redis原始碼分析之工具類util

2021-09-22 10:22:16 字數 1557 閱讀 6947

在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...