中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SylixOS移植Redis庫總結

發布時間:2020-07-29 17:19:09 來源:網絡 閱讀:758 作者:qq58f47049ce44d 欄目:建站服務器

1. Redis簡介

    Redis是一個開源軟件項目(BSD許可),用ANSI C編寫,適用于大多數的POSIX系統,是一個可用作數據庫、緩存和消息代理的內存數據庫。Redis是一個非關系型數據庫,Redis可以存儲鍵與五種不同數據結構類型之間的映射,這五種類型分別為:字符串、列表、集合、有序集合和散列。Redis通常將整個數據集保存在內存中,Redis通過兩種不同的方式實現持久性:一種是快照,另一種是AOF(AppendOnly File)。Redis支持主從復制,來自任何Redis服務器的數據可以復制到任意數量的從站。Redis還包含發布/訂閱、Lua腳本等其他功能。

2. 資源獲取

    在官網下載第三方中間件的資源,Redis的官方下載網站為:https://redis.io/download。本文中使用的版本是redis-3.2.8,下載后解壓文件,文件目錄如圖 2-1所示。

SylixOS移植Redis庫總結 

圖 2-1  Redis解壓后的文件

    src目錄包含Redis的實現,tests目錄包含使用tcl語言實現的單元測試,deps目錄包含Redis所需要使用的庫,SylixOS只需要提供libc的POSIX兼容接口以及一個C編譯器即可。

3. Linux平臺編譯

    將文件夾拷貝到Linux平臺下,由于文件夾中已有Makefile文件,所以可直接編譯,Makefile文件如圖 3-1所示。

SylixOS移植Redis庫總結 

圖 3-1  Makefile文件

    Redis可以手動選擇內存分配器進行編譯,Redis支持libc malloc以及jemalloc,并且在Linux系統上jemalloc是默認值,因此要強制使用libc malloc編譯需要添加命令參數,編譯命令如圖 3-2所示。

SylixOS移植Redis庫總結

圖 3-2  編譯命令

4. 移植工作

    Redis采用的服務器客戶端模型,并且支持命令行模式以及hiredis API接口,因此需要編譯出服務器的可執行程序以及根據具體需求編譯出客戶端的可執行程序。

4.1 服務器工程創建

    在Real-Evo IDE中創建redis-server的應用工程,刪除工程中src目錄下的redis-server.c文件,導入源碼包中的src和deps兩個文件夾。導入完成后的工程文件如圖 4-1所示。

 SylixOS移植Redis庫總結

圖 4-1  工程文件

    改為專家模式,修改源文件和頭文件路徑,頭文件路徑如圖 4-2所示。

 SylixOS移植Redis庫總結

圖 4-2  頭文件路徑

部分源文件如圖 4 3所示。

 SylixOS移植Redis庫總結

圖 4-3  源文件名

    鏈接base工程內的cextern動態庫,如圖 4-4所示。

SylixOS移植Redis庫總結 

圖 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所示。

 SylixOS移植Redis庫總結

圖 4-5  使用時定義的錯誤

    修改編譯器選項,具體配置如圖 4-6所示。

 SylixOS移植Redis庫總結

圖 4-6  配置編譯器

    代碼中有多個main入口,由于需要生成服務器的可執行文件,因此需要注釋掉多余的main入口,只需要保留server.c的main入口。
    部分代碼中函數名一致,導致編譯報錯,因此需要為對應的函數加static修飾,報錯如圖 4-7所示。

 SylixOS移植Redis庫總結

圖 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, &threadAttrLW_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函數進行功能替換,替換完成后編譯工程,生成服務器的可執行程序即可。

4.2 動態庫工程創建

    創建libredis動態庫工程,刪除libredis.c文件,導入hiredis文件夾,工程如圖 4-8所示。

SylixOS移植Redis庫總結 

圖 4-8  動態庫工程

    鏈接cextern動態庫,在專家模式下修改源文件和頭文件目錄,如圖 4-9所示。

 SylixOS移植Redis庫總結

圖 4-9  源文件和頭文件路徑

    編譯完成即可。

5. Redis的使用

    運行服務器,redis.conf為服務器配置文件,可對服務器功能進行配置,運行服務器如圖 5-1所示。

SylixOS移植Redis庫總結 

圖 5-1  運行Redis服務器

    運行測試程序,測試Redis的API功能是否正常,運行結果顯示功能正常,具體現象如圖 5-2所示。

SylixOS移植Redis庫總結 

圖 5-2  測試用例運行結果

6. 參考資料

官網:
https://redis.io/
博客: 
http://blog.csdn.net/kingqizhou/article/details/8104693
文檔:
《Redis命令參考手冊》
《Redis實戰》

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新泰市| 玛曲县| 凌云县| 新建县| 湄潭县| 葵青区| 胶南市| 年辖:市辖区| 二手房| 浙江省| 奇台县| 拉孜县| 卫辉市| 和平区| 平果县| 高邮市| 京山县| 乌兰县| 宿迁市| 云霄县| 麻城市| 泾阳县| 开鲁县| 灯塔市| 信丰县| 岳阳县| 许昌市| 淳安县| 平顺县| 永和县| 高清| 乌海市| 博湖县| 比如县| 兴海县| 思南县| 无锡市| 阿巴嘎旗| 大庆市| 阿坝| 隆回县|