前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DCache 分布式存储系统|K-K-Row 缓存模块的创建与使用

DCache 分布式存储系统|K-K-Row 缓存模块的创建与使用

作者头像
TARS基金会
发布2021-03-15 11:17:41
7120
发布2021-03-15 11:17:41
举报
文章被收录于专栏:TARS基金会

随着微服务与云的发展,分布式架构的需求变得越来越普遍,传统的 SQL 结构化存储方案已经跟不上脚步,于是 NoSQL 出现了。DCache 作为基于 TARS 的分布式 NoSQL 缓存系统,完美支持 TARS 服务。前一篇文章中,我们介绍了怎么创建并使用 KV 模块,本文将继续介绍如何创建和使用 DCache 中的 K-K-Row 缓存模块。

  • K-K-Row 模块简介
  • 创建 K-K-Row 缓存模块
  • 获取 DCache 接口文件
  • 创建缓存服务代理
  • 调用K-K-Row缓存模块服务
    • K-K-Row 模块读写操作
    • 运行示例
  • K-K-Row缓存模块服务接口
  • 总结

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

我们在文章 Key-Value 缓存模块的创建与使用中介绍了 key-value 类型的使用,也提到了其在结构化数据存储上的缺点。而 k-k-row 类型就是一种结构化存储方案。

k-k-row,与 key-value 相似,但这里 value 不是字符串,而是相当于一张表,能够存储结构化数据。k-k-rowkey key row,指通过两个 key,即主索引/主键(Main Key)和联合索引(Union Key),能够唯一确定一条记录 row,如下

不难看出,k-k-row 的存储结构和 SQL 数据库很像,主键相当于表名,映射到 Value。既不需要重复存储数据,也不会带来序列化和并发修改控制的问题,很好的解决了问题。

与 KV 模块相似,我们只需完成以下步骤即可在服务中使用 k-k-row 缓存服务

  1. 创建 K-K-Row 缓存模块
  2. 获取 DCache 接口文件
  3. 创建缓存服务代理
  4. 调用缓存模块服务

本文将继续基于 TestDemo 介绍如何创建 K-K-Row 缓存模块,以及怎么在 TARS 服务中调用该服务来缓存数据。

本文使用的示例可以在 GitHub 仓库 DCacheDemo(文末附链接) 中查看。

在文章 Key-Value 缓存模块的创建与使用 中,我们已经介绍过如何创建 Key-Value 缓存模块,各类型缓存模块创建流程是相似的,这部分不再赘述,仅介绍不同的部分。

这里我们将缓存模块服务命名为 TestDemoKKRowcache 类型 选择 k-k-row(MKVCache),如下

K-K-Row 为多键值类型,配置字段时可以新增多个联合索引或数据字段,点击 添加,如下

确认好已配置信息后,点击 安装发布 即可完成发布。

到这里,我们就可以在其它服务中使用该缓存模块来缓存 K-K-Row 数据了。

DCache 是基于 TARS 开发的,因此使用上和 TARS 服务一样,也是通过 .tars 接口文件来调用对应缓存服务的接口。

我们复制 DCache/src/TarsComm 下的 CacheShare.tars, ProxyShare.tarsDCache/src/Proxy 下的 Proxy.tars 到自己项目目录下即可(以上文末附有链接)。

例如本文 Demo 获取 DCache 接口文件后的项目文件结构如下

代码语言:javascript
复制
DCacheDemo├── CacheShare.tars├── ProxyShare.tars├── Proxy.tars├── config.conf├── main.cpp└── makefile

前一篇文章我们提到过,创建一个应用后会自动创建一个路由服务和代理服务,并通过 TestDemo 介绍了如何创建缓存服务代理来调用服务。

我们继续使用 TestDemo,新增一个模块名 ModuleTestDemoKKRow,值为我们前面创建的模块名 TestDemoKKRow,用于之后通过代理调用该模块,如下。

通过 TestDemo 代理服务的代理对象和模块名 TestDemoKKRow,我们就能够调用前面创建的K-K-Row 缓存模块的接口了。

本部分将通过简单示例,介绍 k-k-row 类型缓存模块部分接口的使用。关于其它接口的信息,参见 Proxy 接口指南(文末附链接)

接口调用流程与 TARS 服务接口调用流程一致。如果你还不清楚 TARS 服务的调用方式和流程,可以阅读文章 TARS RPC 通信框架|提供多种远程调用方式了解 TARS 服务的调用方式。

后面的示例中,会使用到三个工具函数,定义如下

genUpdateValue 用于构建 DCache::UpdateValue 结构,该结构用于存储插入或更新的数据值,在其它类型模块的接口中,经常会用到。printMapDataprintVectorMapData 用于方便打印返回的数据。

那么接下来,我们来看看怎么使用 K-K-Row 缓存模块。

K-K-Row 模块读写操作

K-K-Row 即多键值模块,一个主键可以对应多条记录。这里我们仅介绍写接口 insertMKV 和读接口 getMKV,其它接口类似。

插入数据

接口 insertMKV 用于插入键值对数据,定义如下

代码语言:javascript
复制
int insertMKV(const InsertMKVReq &req)

其中结构 InsertMKVReq 及其嵌套结构 InsertKeyValue 的定义如下

代码语言:javascript
复制
structInsertMKVReq{    1 require string moduleName;    // 模块名    2 require InsertKeyValue data;  // 待写入数据};struct InsertKeyValue{    1 require string mainKey;  // 主key    2 require map<string, UpdateValue> mpValue;  // 除主key外的其他字段数据    3 require byte ver = 0;           // 版本号    4 require bool dirty = true;      // 是否设置为脏数据    5 require bool replace = false;   // 如果记录已存在且replace为true时则覆盖旧记录    6 require int  expireTimeSecond = 0;  // 数据过期时间};

使用示例如下

代码语言:javascript
复制
void testInsertMKV(const string &mainKey, const map<string, string> &data, DCache::ProxyPrx prx){    cout << "\t-- "<< "insertMKV ";    // 打印准备插入的数据    printMapData(data);    // 构造插入数据    DCache::InsertKeyValue insertData;    insertData.mainKey = mainKey;        map<string, string>::const_iterator it = data.begin();    while(it != data.end())    {        // 构造 UpdateValue        insertData.mpValue[it->first] = genUpdateValue(DCache::SET, it->second);++it;    }    // 构造请求    DCache::InsertMKVReq insertReq;    insertReq.moduleName = ModuleTestDemoKKRow;    insertReq.data = insertData;        prx->insertMKV(insertReq);}
获取数据

接口 getMKV 用于根据主键获取主键对应的键值对,定义如下

代码语言:javascript
复制
int getMKV(const GetMKVReq &req, GetMKVRsp &rsp)

请求消息结构 GetMKVReq 及返回消息结构 GetMKVRsp 的定义如下

代码语言:javascript
复制
struct GetMKVReq{    1 require string moduleName;  // 模块名    2 require string mainKey;     // 主key    3 require string field;       // 需要查询的字段集,多个字段用','分隔如 "a,b", "*"表示所有    4 require vector<Condition> cond;   // 查询条件集合,除主Key外的其他字段,多个条件直间为And关系    5 require bool retEntryCnt = false; // 是否返回主key下的总记录条数    6 require string idcSpecified = ""; // idc区域};struct GetMKVRsp{    1 require vector<map<string, string> > data;  //查询结果};

使用示例如下

代码语言:javascript
复制
void testGetMKV(const string &key, DCache::ProxyPrx prx){    cout << "\t-- "<< "getMKV    "<< '\n';    // 构造请求    DCache::GetMKVReq req;    req.moduleName = ModuleTestDemoKKRow;    req.mainKey = key;    req.field = "*";    DCache::GetMKVRsp rsp;    prx->getMKV(req, rsp);    // 打印返回数据    printVectorMapData(rsp.data);}

运行示例

我们来实际运行一下上面的使用示例。完整的使用示例可以在 GitHub 仓库 DCacheDemo(文末附链接) 中获取。

我们通过 testKKRow 测试上节提到的模块读写接口,我们向同一主键插入两条记录,UID 分别为 test1, test2,如下

代码语言:javascript
复制
void testKKRow(DCache::ProxyPrx prx){    cout << START << " testKKRow"<< endl;     string mainKey = "Key";    map<string, string> data;    data["UID"] = "test1";    data["VALUE"] = "hello";    testInsertMKV(mainKey, data, prx);        
    data["UID"] = "test2";    data["VALUE"] = "hey";    testInsertMKV(mainKey, data, prx);        
    testGetMKV(mainKey, prx);        cout << END<< " testKKRow"<< endl;}

接着,在 main 函数中执行

代码语言:javascript
复制
int main(int argc, char*argv[]){    ...        auto prx = comm->stringToProxy<DCache::ProxyPrx>(DCacheTestDemoObj);        
        // 调用 DCache 缓存服务        testKKRow(prx);    ...}

编译构建并运行示例,结果如下

可以看到,getMKV 返回了两条记录。以上就是DCache缓存模块的具体使用流程。到此,我们成功调用了 DCache 的 K-K-Row 缓存服务。

除了设置键值接口 insertMKV 和读取键值接口 getMKV,DCache 中还提供了丰富的 K-K-Row 操作接口,包括批量插入(insertMKVBatch), 删除(delMKV), 更新(updateMKV) 等,如下

接口的使用方式与前面介绍的 insertMKVgetMKV 是类似的,关于接口的具体入参和出参结构可以参考 Proxy 接口指南(文末附链接)。

本文通过使用示例,介绍了 DCache 中 K-K-Row 缓存模块的创建和使用方式,满足开发者对结构化缓存数据的需求。

文中链接:

DCacheDemo:

https://github.com/ETZhangSX/DCacheDemo

CacheShare.tars:

https://github.com/Tencent/DCache/blob/master/src/TarsComm/CacheShare.tars

ProxyShare.tars:

https://github.com/Tencent/DCache/blob/master/src/TarsComm/ProxyShare.tars

Proxy.tars:

https://github.com/Tencent/DCache/blob/master/src/Proxy/Proxy.tars

Proxy 接口指南:

https://github.com/Tencent/DCache/blob/master/docs/proxy_api_guide.md


TARS基金会是Linux基金会下的非营利性、微服务基金会,致力于建设一个强大而灵活的微服务生态系统。无论你在哪个行业,无论你使用什么技术栈,这里能助你快速实现你的创意。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TARS星球 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • K-K-Row 模块读写操作
    • 插入数据
      • 获取数据
      • 运行示例
      相关产品与服务
      数据保险箱
      数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档