您好,登錄后才能下訂單哦!
Redis是一個開源軟件項目(BSD許可),用ANSI C編寫,適用于大多數的POSIX系統,是一個可用作數據庫、緩存和消息代理的內存數據庫。Redis是一個非關系型數據庫,Redis可以存儲鍵與五種不同數據結構類型之間的映射,這五種類型分別為:字符串、列表、集合、有序集合和散列。Redis通常將整個數據集保存在內存中,Redis通過兩種不同的方式實現持久性:一種是快照,另一種是AOF(AppendOnly File)。Redis支持主從復制,來自任何Redis服務器的數據可以復制到任意數量的從站。Redis還包含發布/訂閱、Lua腳本等其他功能。
在官網下載第三方中間件的資源,Redis的官方下載網站為:https://redis.io/download。本文中使用的版本是redis-3.2.8,下載后解壓文件,文件目錄如圖 2-1所示。
圖 2-1 Redis解壓后的文件
src目錄包含Redis的實現,tests目錄包含使用tcl語言實現的單元測試,deps目錄包含Redis所需要使用的庫,SylixOS只需要提供libc的POSIX兼容接口以及一個C編譯器即可。
將文件夾拷貝到Linux平臺下,由于文件夾中已有Makefile文件,所以可直接編譯,Makefile文件如圖 3-1所示。
圖 3-1 Makefile文件
Redis可以手動選擇內存分配器進行編譯,Redis支持libc malloc以及jemalloc,并且在Linux系統上jemalloc是默認值,因此要強制使用libc malloc編譯需要添加命令參數,編譯命令如圖 3-2所示。
圖 3-2 編譯命令
Redis采用的服務器客戶端模型,并且支持命令行模式以及hiredis API接口,因此需要編譯出服務器的可執行程序以及根據具體需求編譯出客戶端的可執行程序。
在Real-Evo IDE中創建redis-server的應用工程,刪除工程中src目錄下的redis-server.c文件,導入源碼包中的src和deps兩個文件夾。導入完成后的工程文件如圖 4-1所示。
圖 4-1 工程文件
改為專家模式,修改源文件和頭文件路徑,頭文件路徑如圖 4-2所示。
圖 4-2 頭文件路徑
部分源文件如圖 4 3所示。
圖 4-3 源文件名
鏈接base工程內的cextern動態庫,如圖 4-4所示。
圖 4-4 鏈接cextern動態庫
由于SylixOS支持endian.h頭文件,因此注釋config.h內的部分代碼,并直接包含頭文件,具體如程序清單 4-1所示。
程序清單 4-1 config.h代碼修改
#if 0 #ifndef BYTE_ORDER #if (BSD >= 199103) # include<machine/endian.h> #else #if defined(linux) ||defined(__linux__) # include<endian.h> #else #define LITTLE_ENDIAN 1234 /* least-significant byte first (vax,pc) */ #define BIG_ENDIAN 4321 /* most-significant byte first(IBM, net) */ #define PDP_ENDIAN 3412 /* LSB first in word, MSW first inlong (pdp)*/ #if defined(__i386__) ||defined(__x86_64__) || defined(__amd64__) || \ defined(vax) || defined(ns32000) || defined(sun386) || \ defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \ defined(__alpha__) || defined(__alpha) #define BYTE_ORDER LITTLE_ENDIAN #endif #if defined(sel) || defined(pyr) ||defined(mc68000) || defined(sparc) || \ defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370)|| \ defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX)||\ defined(apollo) || defined(__convex__) || defined(_CRAY) || \ defined(__hppa) || defined(__hp9000) || \ defined(__hp9000s300) || defined(__hp9000s700) || \ defined (BIT_ZERO_ON_LEFT) || defined(m68k) || defined(__sparc) #define BYTE_ORDER BIG_ENDIAN #endif #endif/*linux */ #endif/* BSD */ #endif/* BYTE_ORDER */ #endif #include<endian.h> |
部分代碼變量在使用時定義,錯誤如圖 4-5所示。
圖 4-5 使用時定義的錯誤
修改編譯器選項,具體配置如圖 4-6所示。
圖 4-6 配置編譯器
代碼中有多個main入口,由于需要生成服務器的可執行文件,因此需要注釋掉多余的main入口,只需要保留server.c的main入口。
部分代碼中函數名一致,導致編譯報錯,因此需要為對應的函數加static修飾,報錯如圖 4-7所示。
圖 4-7 函數重定義錯誤
由于SylixOS默認棧空間大小無法滿足服務器對棧空間的需求,因此修改棧空間大小,具體代碼如程序清單 4-2所示。
程序清單 4-2 設置棧空間大小
int main(intargc,char **argv) { LW_CLASS_THREADATTR threadAttr; LW_HANDLE hThreadId;
__GiArgc = argc; __GppcArgv = argv;
Lw_ThreadAttr_Build(&threadAttr, 350 * LW_CFG_KB_SIZE, LW_PRIO_NORMAL, LW_OPTION_THREAD_STK_CHK, LW_NULL);
hThreadId = Lw_Thread_Create("t_server", redisServer, &threadAttr, LW_NULL); if (hThreadId ==LW_OBJECT_HANDLE_INVALID) { return (PX_ERROR); }
Lw_Thread_Join(hThreadId,NULL);
return ERROR_NONE; } |
SylixOS下rename的實現是用新文件直接替換原文件,由于原文件已經存在可能導致替換失敗,因此在rename前需要先刪除原文件,具體代碼如程序清單 4-3所示。
程序清單 4 3 rename的使用
unlink(filename); if (rename(tmpfile,filename) == -1) { serverLog(LL_WARNING,"Error movingtempappend only file on the final destination: %s",strerror(errno)); unlink(tmpfile); return C_ERR; } |
將工程文件內的fork通過posix_spawn函數進行功能替換,替換完成后編譯工程,生成服務器的可執行程序即可。
創建libredis動態庫工程,刪除libredis.c文件,導入hiredis文件夾,工程如圖 4-8所示。
圖 4-8 動態庫工程
鏈接cextern動態庫,在專家模式下修改源文件和頭文件目錄,如圖 4-9所示。
圖 4-9 源文件和頭文件路徑
編譯完成即可。
運行服務器,redis.conf為服務器配置文件,可對服務器功能進行配置,運行服務器如圖 5-1所示。
圖 5-1 運行Redis服務器
運行測試程序,測試Redis的API功能是否正常,運行結果顯示功能正常,具體現象如圖 5-2所示。
圖 5-2 測試用例運行結果
官網:
https://redis.io/
博客:
http://blog.csdn.net/kingqizhou/article/details/8104693
文檔:
《Redis命令參考手冊》
《Redis實戰》
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。