2012年4月16日 星期一

Redis 導入筆記

Karl Seguin 有在網路上發表了一本免費的電子書: The Little Redis Book, 包含了 Redis 簡介與基礎知識. 一共短短 28 頁, 幾個小時就能獲得相當充足的入門資訊.

目前 Redis 官方尚不支援 Windows 的平台, 但是 Dušan Majkić (dmajkic) 這位老兄有公佈他非官方的 Win32/64 native port. 也有預先編好的執行檔可供下載. 下載完解開, 執行裡面的 redis-server.exe 啟動 server, redis-cli 則是純文字的 client. 可配合入門書邊看邊做些練習. 自己的 Windows C/C++ 程式中若要導入 Redis, 需要的 Redis C binding library - hiredis 也已經被 dmajkic porting 好, 在他的 source tarball 中可以找到.

實際上在 Windows 專案中要導入 Redis 時還會遇到一個問題是 dmajkic 提供的 porting 是基於 MinGW 的編譯環境, 若要在 Visual C++ 的專案中導入 hiredis 會缺少檔頭和 lib 檔這些東西. 不過還好可以在 MinGW 的環境中透過一些方式來補齊. 以下簡列步驟:
  1. 安裝 MinGWVisual Studio
  2. 將 dmajkic 的 source tarball 解開在 msys 的家目錄中 (假設解在 D:\MinGW\msys\1.0\home\zevoid\dmajkic-redis)
  3. 修改 hiredis 的 Makefile 使其可產生 exp 文件, 該文件後續可用來生成 lib 文件. 具體作法為編輯 Makefile, 尋找 MINGW32_NT, 將其後的 DYLIB_MAKE_CMD 內容最後面加上 -Wl,--output-def,hiredis.def
  4. 執行 MinGW 的 Shell, 到 D:\MinGW\msys\1.0\home\zevoid\dmajkic-redis 底下進行 make; 接著切換目錄到 deps/hiredis 中進行 make dynamic, 確認有無 hiredis.dll 和 hiredis.exp 文件產生.
  5. 開啟一個 Visual Studio 的命令列提示, 切換目錄到 D:\MinGW\msys\1.0\home\zevoid\dmajkic-redis\deps\hiredis 底下, 進行 lib /def:hiredis.exp, 確認 hiredis.lib 文件產生
  6. 修改一下 hiredis.h, 移除裡面對於 sys/time.h 的引用 (VC 中沒這檔頭)
  7. 將 dll, lib 和改好的檔頭 .h 這三個文件供 VC 專案使用. 注意 porting 過的 hiredis 需要依賴 Winsock 函式庫, 故專案需要加上對於 ws2_32.lib 的依賴

* 需注意 Winsock 函式庫在使用前需要呼叫 WSAStartup(), 這一點 dmajkic 的 hiredis porting 沒有幫忙做, 使用前要自行動手呼叫.

另外在使用 hiredis 時要注意的一點, 由於 hiredis 的 redisCommand() 函數都是接受 ANSI C 字串, 而大部分的 Visual C/C++ 程式都已改用 wide char (wchar_t) 這類的 UTF-16 字串編碼. 若在這樣的前提之下, 想要透過 hiredis 的 binding 良好地跟 Redis server 做互動, 必需要避免意外的 null terminated 問題. 一個方法是都先把字串都轉成 UTF-8 再丟給 hiredis, 取回時一樣要逆轉. 另一個方法是直接將 UTF-16 字串以 binary 形式存到 Redis 中, 如此在呼叫 hiredis 的 redisCommand() 等等函數時, 在 printf 形式的 format 字串中要使用 %b 這個關鍵字來指定即將要傳入的是 binary, 不應理會 bytes stream 中的 null byte. Ex:
wchar_t *b = L"hahaha abcd";

redisCommand(ctx, "set myrawbytes %b", (unsigned char*)b, wcslen(b)*sizeof(wchar_t));

注意指定 %b 之後, 後面會預期接收 raw byte 指標和一個 byte count.

沒有留言:

張貼留言