專案的db中使用了redis+python+mysql的儲存方案,在編譯redis庫的時候,win32_interop.lib與專案中原有的net.lib有編譯衝突,net.lib引用了ws2_32.lib,導致tcp的幾個介面bind()、accept()報重複定義的錯誤。
解決方案 :修改了redis的原始碼,hiredis.lib和win32_interop.lib的源**使用了網路介面的地方,都將函式
重新命名了一下,bind()、accept()介面全部加了字尾_redis,再匯出win32_interop.lib後。工程引用新的lib 後,
編譯正常通過。
修改完原始碼以後,工程編譯x64,發現啟動專案後,專案無法正常連線上redis。
原因是呼叫hiredis.lib的redisconnect()介面,其底層還是呼叫tcp的connect()介面。編譯的時候,connect()
函式沒有報錯,我就沒有全部修改,有遺漏。索性把所有網路相關的介面,全部修改後,再編譯hiredis.lib匯出到
工程引用後,問題解決,可以正常連線上redis資料庫。
x64環境下,rediscommand()執行%b引數會報錯 "out of memory",需要將rediscommand()中int型別修改為
size_t型別(還是去修改hiredis的原始碼,然後編譯匯出新的lib檔案)。
size_t能識別x64和win32,在win32下是4位元組,在x64是8位元組。而rediscommand()中%b的長度預設型別是int,
導致在win32下沒有問題,但編譯x64就會報錯。
ycstoragelib編碼問題encode(「utf-8」)表示將資料以utf-8格式,編碼為二進位制資料,decode()函式將二進位制資料解碼為字串。
以utf-8編碼的二進位制資料,解碼也要utf-8格式,否則解析出來的資料會是亂碼。
二進位制資料解碼為json字串,如果json字串中包含\0,ycstoragelib解析會提前截斷,導致資料不對。
解決方案:將二進位制資料解碼的json字串,用base64編碼,然後儲存到redis中。ycstoragelib從redis中取
出base64編碼的字串,用base64解碼還原為字串。再通過rapidjson來解析字串。
Hiredis 基本使用
0.前言 hiredis是乙個redis的c客戶端庫函式,基本實現了redis的協議的最小集。這裡對hiredis的api作基本的介紹以及應用,主要參考hiredis的readme檔案以及相關原始碼。1.同步api rediscontext,該庫的上下文環境。1 context for a conn...
Hiredis 基本使用
0.前言 hiredis是乙個redis的c客戶端庫函式,基本實現了redis的協議的最小集。這裡對hiredis的api作基本的介紹以及應用,主要參考hiredis的readme檔案以及相關原始碼。1.同步api rediscontext,該庫的上下文環境。1 context for a conn...
hiredis使用簡介
hiredis是redis資料庫的c介面,目前只能在linux下使用,幾個基本的函式就可以操作redis資料庫了。一 api簡介 1 rediscontext redisconnect const char ip,int port 類似的提供了乙個函式rediscontext redisconnec...