DCache 分佈式存儲系統|Key-Value 緩存模塊的建立與使用

做者 | Eatonhtml

導語 | 隨着微服務與雲的發展,分佈式架構的需求變得愈來愈廣泛,傳統的 SQL 結構化存儲方案已經跟不上腳步,因而 NoSQL 出現了。DCache 做爲基於 TARS 的分佈式 NoSQL 緩存系統,完美支持 TARS 服務。在前一篇文章中,咱們介紹了 DCache 的特性、如何在 TARS 上部署 DCache 並建立一個應用 TestDemo。本文將繼續介紹如何建立和使用 DCache 中的 KV 緩存模塊。ios

系列文章git

目錄

  • 簡介
  • 應用場景
  • 建立 KV 緩存模塊
  • 獲取 DCache 接口文件
  • 建立緩存服務代理
  • 調用緩存模塊服務
  • 總結

簡介

DCache 是一個基於 TARS 框架開發的分佈式 NoSQL 存儲系統,支持多種數據結構,包括了 key-value(鍵值對),k-k-row(多鍵值),list(列表),set(集合),zset(有序集合)等,知足多種業務需求。github

其中 key-value 是最簡單也是最經常使用的類型,咱們只需完成如下步驟便可在服務中使用 key-value 緩存服務api

  1. 建立 KV 緩存模塊
  2. 獲取 DCache 接口文件
  3. 建立緩存服務代理
  4. 調用緩存模塊服務

DCache 中爲 KV 提供了插入、替換、刪除和批量操做鍵值等豐富的操做接口,使用上很是方便。本文將基於 TestDemo 介紹如何建立 Key-Value 緩存模塊,以及怎麼在 TARS 服務中調用該服務來緩存數據。緩存

本文使用的示例能夠在 GitHub 倉庫 DCacheDemo 中查看。數據結構

應用場景

DCache 的 KV 緩存模塊爲常規 key-value 緩存應用,一個鍵 key 對應一個值 value。value 通常爲字符串類型。適用於結構簡單的數據,經常使用於常規計數,如微博數, 粉絲數等,以下圖。架構

對於一些複雜的結構化數據,好比須要爲一個 key 存儲多個值,一般有兩種實現方式。一種是經過序列化存儲實現,將多個字段存儲在 value 中,須要處理多個字段併發讀寫的問題。另外一種是經過將 id 和字段做爲 key 的方式存儲多個鍵值對實現,好比 Jane_age 存儲 Jane 的年齡, Jane_email 存儲 Jane 的郵箱,這樣 key 中會有大量重複用戶 ID。以下圖併發

所以通常會使用其它緩存類型來存儲結構化數據,好比 DCache 中的 k-k-row。該類型咱們將在下一篇文章詳細介紹。框架

建立 KV 緩存模塊

與 TARS 中應用與服務之間的關係類似,一個 DCache 應用中可以建立多個緩存模塊服務。每一個緩存模塊支持一種緩存數據結構,經過在一個應用中建立多個不一樣數據結構的緩存模塊,可以實現多種數據類型的存儲,知足多種需求。本文將介紹如何建立 KV 模塊,其餘數據類型相關內容將在以後的文章中分享。

首先,在 DCache 頁面進入 服務建立 > 建立模塊,選擇咱們以前建立的應用 TestDemo,模塊名要求以應用名開頭,這裏咱們由於建立的是 KV 模塊,咱們命名 TestDemoKV,以下

進入第二步的模塊配置,cache 類型 選擇 key-value(KVCache),填充備註

第三步服務配置,選好服務 IP 節點,並選擇一個 MySQL 實例,在前一篇文章中咱們已經添加過一個 MySQL 實例。若是須要使用新的 MySQL 服務,選中下方的 MySQL 實例信息 輸入實例信息便可。以下,點擊 下一步

彈出字段配置窗口,保持默認便可,點擊 肯定

確認好已配置信息後,點擊 安裝發佈 便可完成發佈。

到這裏,咱們就能夠在其它服務中使用該緩存模塊來緩存 Key-Value 數據了。

整體來講,建立緩存模塊的過程分爲三步:模塊建立、模塊配置和服務配置。模塊配置時,你們按需選擇緩存類型便可。

獲取 DCache 接口文件

咱們提到過,DCache 是基於 TARS 開發的,所以使用上和 TARS 服務同樣,也是經過 .tars 接口文件來調用對應緩存服務的接口。不一樣的是,DCache 的接口文件是固定的,咱們只需複製 DCache/src/TarsComm 下的 CacheShare.tars, ProxyShare.tarsDCache/src/Proxy 下的 Proxy.tars 到本身項目目錄下便可。

例如本文 Demo 獲取 DCache 接口文件後的項目文件結構以下

DCacheDemo
├── CacheShare.tars
├── ProxyShare.tars
├── Proxy.tars
├── config.conf
├── main.cpp
└── makefile

建立緩存服務代理

當咱們建立了一個應用,它會自動建立一個路由服務和代理服務。好比咱們以前建立的 TestDemo,就會自動建立一個路由服務 TestDemoRouterServer 和一個代理服務 TestDemoProxyServerTestDemo 下每一個緩存模塊都是經過代理服務 TestDemoProxyServer 來訪問的。

所以,在 TARS 服務或客戶端中,咱們只須要建立一個該代理服務的代理對象便可調用 TestDemo 下的緩存模塊。

例如,咱們在 main.cpp 中經過以下代碼建立 TestDemoProxyServer 的代理對象 prx

// main.cpp
#include <iostream>
#include <map>
#include "servant/Communicator.h"
#include "servant/ServantProxy.h"
#include "Proxy.h"

using namespace std;
using namespace tars;

// TestDemo 代理服務對象名
static string DCacheTestDemoObj = "DCache.TestDemoProxyServer.ProxyObj";

// 緩存模塊名
static string ModuleTestDemoKV    = "TestDemoKV";

int main(int argc, char *argv[])
{
    CommunicatorPtr comm = new Communicator();
    try
    {
        TC_Config conf;
        // 解析配置文件
        conf.parseFile("config.conf");
        // 加載配置
        comm->setProperty(conf);
        // 生成代理
        auto prx = comm->stringToProxy<DCache::ProxyPrx>(DCacheTestDemoObj);

        // TODO: 調用 DCache 緩存服務
    }
    catch (exception &e)
    {
        cerr << "error: " << e.what() << endl;
    }
    catch (...)
    {
        cerr << "Unknown Error" << endl;
    }
}

調用 KV 緩存模塊服務

經過 TestDemo 代理服務的代理對象,咱們就可以調用 TestDemo 中緩存模塊的接口了。本部分將經過簡單示例,介紹 key-value 類型緩存模塊部分接口的使用。關於其它接口的信息,參見 Proxy 接口指南

接口調用流程與 TARS 服務接口調用流程一致。若是你還不清楚 TARS 服務的調用方式和流程,能夠閱讀文章 TARS RPC 通訊框架|提供多種遠程調用方式

那麼接下來,咱們來看看怎麼使用 KV 緩存模塊。

Key-Value 模塊

即鍵值對模塊,這裏咱們介紹寫接口 setKV 和讀接口 getKV,其它操做接口的使用相似。

設置鍵值對

接口 setKV 可以設置鍵值對,定義以下

int setKV(const SetKVReq &req)

其中結構 SetKVReq 及其嵌套結構 SSetKeyValue 的定義以下

struct SetKVReq
{
  1 require string moduleName;  // 模塊名
  2 require SSetKeyValue data;
};

struct SSetKeyValue
{
  1 require string keyItem;  // 鍵
  2 require string value;    // 值
  3 require byte   version = 0;    // 數據版本,缺省爲0
  4 require bool   dirty = true;   // 是否設置爲髒數據,缺省爲true
  5 require int    expireTimeSecond = 0;  // 過時時間,缺省爲0,表示永不過時
};

moduleName 指緩存模塊名,經過它來找到具體調用的模塊,鍵值對信息則存儲在 data 中。使用時先構造鍵值對數據,而後構造請求結構體,最後發起調用,以下

void testSetKV(const string &key, const string &value, DCache::ProxyPrx prx)
{
    // 構造鍵值對
    DCache::SSetKeyValue setReq;
    setReq.keyItem = key;
    setReq.value = value;

    // 構造請求
    DCache::SetKVReq setRsp;
    setRsp.moduleName = ModuleTestDemoKV;
    setRsp.data = setReq;

    prx->setKV(setRsp);
}

獲取鍵值

接口 getKV 可以讀取鍵值,定義以下

int getKV(const GetKVReq &req, GetKVRsp &rsp)

其中請求消息結構 GetKVReq 和返回消息結構 GetKVRsp 的定義以下

struct GetKVReq  
{  
  1 require string moduleName;  // 模塊名  
  2 require string keyItem;     // 鍵  
  3 require string idcSpecified = ""; // idc區域  
};

struct GetKVRsp  
{  
  1 require string value;   // 值  
  2 require byte ver;       // 數據版本號  
  3 require int expireTime = 0;  // 過時時間  
};

使用示例以下

void testGetKV(const string &key, DCache::ProxyPrx prx)
{
    // 構建請求
    DCache::GetKVReq getReq;
    getReq.moduleName = ModuleTestDemoKV;
    getReq.keyItem = key;

    // 返回數據結構體
    DCache::GetKVRsp getRsp;

    prx->getKV(getReq, getRsp);
    cout << getRsp.value << endl;
}

運行示例

咱們來實際運行一下上面的使用示例。完整的使用示例能夠在 GitHub 倉庫 DCacheDemo 中獲取。

咱們經過 testKV 測試上節提到的各模塊讀寫接口,以下

void testKV(DCache::ProxyPrx prx)
{
    testSetKV("hello", "world", prx);
    testGetKV("hello", prx);
}

接着,在 main 函數中執行

int main(int argc, char *argv[])
{
    ...

        auto prx = comm->stringToProxy<DCache::ProxyPrx>(DCacheTestDemoObj);

        // 調用 DCache 緩存服務
        testKV(prx);
    ...
}

編譯構建並運行示例,結果以下

經過上述 DCache 緩存模塊的具體使用流程,咱們成功調用了 DCache 的 KV 緩存服務。

KV 緩存模塊服務接口

除了設置鍵值接口 setKV 和讀取鍵值接口 getKV,DCache 中還提供了豐富的 KV 操做接口,包括插入(insertKV), 刪除(delKV), 更新(updateKV) 等,以下

// 根據 key 檢測 value 是否存於 hash
int checkKey(CheckKeyReq req, out CheckKeyRsp rsp);
// 根據 key 查詢 value
int getKV(GetKVReq req, out GetKVRsp rsp);
// 批量查詢
int getKVBatch(GetKVBatchReq req, out GetKVBatchRsp rsp);
// 獲取 cache 中全部的 key,不包含落地 DB 的 key
int getAllKeys(GetAllKeysReq req, out GetAllKeysRsp rsp);
// 單條寫入
int setKV(SetKVReq req);
// 批量寫入
int setKVBatch(SetKVBatchReq req, out SetKVBatchRsp rsp);
// key 不存在則插入一條記錄,key 已存在則失敗
int insertKV(SetKVReq req);
// 更新記錄
int updateKV(UpdateKVReq req, out UpdateKVRsp rsp);
// 刪除 key 對應的值,只刪除 Cache 的數據,不刪 DB 數據
int eraseKV(RemoveKVReq req);
// 批量 erase
int eraseKVBatch(RemoveKVBatchReq req, out RemoveKVBatchRsp rsp);
// 刪除 key 對應的值,包括 DB 裏的數據
int delKV(RemoveKVReq req);
// 批量刪除
int delKVBatch(RemoveKVBatchReq req, out RemoveKVBatchRsp rsp);

接口的使用方式與前面介紹的 setKVgetKV 是相似的,關於接口的具體入參和出參結構能夠參考 Proxy 接口指南

總結

本文基於上一篇文章,經過一系列使用示例,介紹了 DCache 中 KV 緩存模塊的建立和使用方式。由於 DCache 基於 TARS 開發,緩存服務的使用上基本和 TARS 服務調用無異,開發者可以快速上手。同時 DCache 支持直接鏈接 DB 進行數據持久化,無需開發者自行實現 DB 鏈接持久化的相關邏輯,使開發者可以更加專一於業務。

TARS 能夠在考慮到易用性和高性能的同時快速構建系統並自動生成代碼,幫助開發人員和企業以微服務的方式快速構建本身穩定可靠的分佈式應用,從而令開發人員只關注業務邏輯,提升運營效率。多語言、敏捷研發、高可用和高效運營的特性使 TARS 成爲企業級產品。

TARS微服務助您數字化轉型,歡迎訪問:

TARS官網:https://TarsCloud.org

TARS源碼:https://github.com/TarsCloud

Linux基金會官方微服務免費課程:https://www.edx.org/course/building-microservice-platforms-with-tars

獲取《TARS官方培訓電子書》:https://wj.qq.com/s2/7849909/01b0/

或掃碼獲取:

QR

相關文章
相關標籤/搜索