作者 | Eaton

导语 | 随着微服务与云的倒退,分布式架构的需要变得越来越广泛,传统的 SQL 结构化存储计划曾经跟不上脚步,于是 NoSQL 呈现了。DCache 作为基于 TARS 的分布式 NoSQL 缓存零碎,完满反对 TARS 服务。在前一篇文章中,咱们介绍了 DCache 的个性、如何在 TARS 上部署 DCache 并创立一个利用 TestDemo。本文将持续介绍如何创立和应用 DCache 中的 KV 缓存模块。

系列文章

  • DCache 分布式存储系统|DCache 部署与利用创立
  • DCache 分布式存储系统|Key-Value 缓存模块的创立与应用

目录

  • 简介
  • 利用场景
  • 创立 KV 缓存模块
  • 获取 DCache 接口文件
  • 创立缓存服务代理
  • 调用缓存模块服务
  • 总结

简介

DCache 是一个基于 TARS 框架开发的分布式 NoSQL 存储系统,反对多种数据结构,包含了 key-value(键值对),k-k-row(多键值),list(列表),set(汇合),zset(有序汇合)等,满足多种业务需要。

其中 key-value 是最简略也是最罕用的类型,咱们只需实现以下步骤即可在服务中应用 key-value 缓存服务

  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.tars 和 DCache/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 是否存于 hashint checkKey(CheckKeyReq req, out CheckKeyRsp rsp);// 依据 key 查问 valueint getKV(GetKVReq req, out GetKVRsp rsp);// 批量查问int getKVBatch(GetKVBatchReq req, out GetKVBatchRsp rsp);// 获取 cache 中所有的 key,不蕴含落地 DB 的 keyint 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);// 批量 eraseint 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/bu...

获取《TARS官网培训电子书》:https://wj.qq.com/s2/7849909/...

或扫码获取: