DCache 分布式存储系统|List 缓存模块的创建与使用
在之前的DCache系列文章中,我们介绍了 DCache 及其 KV 和 K-K-Row 缓存模块的使用,本文将继续介绍如何使用 DCache 中的列表类型缓存模块 —— List 缓存模块。
系列文章:
DCache 分布式存储系统|安装部署与应用创建
DCache 分布式存储系统|Key-Value 缓存模块的创建与使用
DCache 分布式存储系统|K-K-Row 缓存模块的创建与使用
-  
   
List 模块简介  -  
   
创建 List 缓存模块  -  
   
获取 DCache 接口文件  -  
   
创建缓存服务代理  -  
   
调用 List 缓存模块服务  -  
    
List 模块读写操作  -  
    
实例  -  
   
其它 List 缓存模块服务接口  -  
   
总结  
key-value(键值对),k-k-row(多键值),list(列表),set(集合),zset(有序集合)等,满足多种业务需求。 
 list 即链表,常用于消息的排列,比如 QQ、微信的聊天消息排序。常用的有单向链表和双向链表,由若干链表节点组成,如下图。 
 list  中某一段的 API,你可以直接查询、删除、替换和裁剪  list  中某一段的元素。如下图为双向链表的结构及替换操作的原理。 
 list  缓存服务 
 -  
   
创建 List 缓存模块  -  
   
获取 DCache 接口文件  -  
   
创建缓存服务代理  -  
   
调用 List 缓存模块服务  
TestDemo  介绍如何创建 List 缓存模块,以及怎么在 TARS 服务中调用该服务来缓存数据。 
 TestDemoList , cache 类型  选择  List(MKVCache) 
 我们提到过,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  介绍了如何创建缓存服务代理来调用服务。 
 TestDemo ,新增一个模块名  ModuleTestDemoList ,值为我们前面创建的模块名  TestDemoList ,用于之后通过代理调用该模块,如下 
 TestDemo  代理服务的代理对象和模块名  TestDemoList ,我们就能够调用前面创建的 List 缓存模块的接口了。本部分将通过简单示例,介绍  list  类型缓存模块部分接口的使用。关于其它接口的信息,参见 Proxy 接口指南(文末附链接)。 
 那么接下来,我们来看看怎么使用 DCache 的 List 缓存模块。
List模块读写操作
List 模块即列表缓存模块。这里介绍写接口 pushList 和读接口 getList,其它接口用法类似。
向列表插入数据
接口 pushList 用于向列表头部或者末尾插入数据,定义如下
int pushList(const PushListReq &req) 
 其中结构 PushList 定义如下
struct PushListReq{1 require string moduleName; // 模块名2 require string mainKey; // 主key3 require vector<InsertKeyValue> data; // 待插入数据4 require bool atHead = true; // true 表示插入到 list 头部,false 表示插入尾部};
使用示例如下
void testPushList(const string &mainKey, const vector<map<string, string>> &data, DCache::ProxyPrx prx){// 构造请求DCache::PushListReq req;req.moduleName = ModuleTestDemoList;req.mainKey = mainKey;req.atHead = false;
for(auto item : data){DCache::InsertKeyValue insertValue;insertValue.mainKey = mainKey;insertValue.expireTimeSecond = 60* 60* 24;map<string, string>::const_iterator it = item.begin();while(it != item.end()){// 构建 UpdateValueinsertValue.mpValue[it->first] = genUpdateValue(DCache::SET, it->second);++it;}req.data.push_back(insertValue);}prx->pushList(req);}
获取列表数据
接口 getList 用于根据指定的主 key 和索引查询列表的数据,定义如下
int getList(constGetListReq&req, GetListRsp&rsp) 
 其中请求消息结构 GetListReq 和返回消息结构 GetListRsp 及其嵌套结构 Entry 的定义如下
struct GetListReq{1 require string moduleName; // 模块名2 require string mainKey; // 主key3 require string field; // 需要查询的字段集,多个字段用','分隔如 "a,b", "*"表示所有4 require long index; //索引5 require string idcSpecified = ""; //idc区域};struct GetListRsp{1 require Entry entry; // 查询结果};struct Entry{1 require map<string, string> data;};
使用示例如下
void testGetList(const string &mainKey, constlong &index, DCache::ProxyPrx prx){// 构造请求DCache::GetListReq req;req.moduleName = ModuleTestDemoList;req.mainKey = mainKey;req.field = "*";req.index = index;
DCache::GetListRsp rsp;prx->getList(req, rsp);
// 打印返回值printMapData(rsp.entry.data);}
实例
我们来实际运行一下上面的使用示例。完整的使用示例可以在 GitHub 仓库 DCacheDemo (文末附链接)中获取。
我们通过 testList 测试上节提到的两个 List 读写接口,我们向主键为 test 的列表中插入一个值 test,如下
void testList(DCache::ProxyPrx prx){cout << START << " testList"<< endl;
string mainKey = "test";vector<map<string, string>> data;map<string, string> item;item["VALUE"] = "test";data.push_back(item);testPushList(mainKey, data, prx);long index = 0;testGetList(mainKey, index, prx);
cout << END<< " testList"<< endl;}
接着,在 main 函数中执行
int main(int argc, char*argv[]){...auto prx = comm->stringToProxy<DCache::ProxyPrx>(DCacheTestDemoObj);// 调用 DCache 缓存服务testList(prx);...}
除了获取列表数据接口 getList 和读取键值接口 pushList,DCache 中还提供了丰富的 List 操作接口,包括批量插入(insertMKVBatch), 删除(delMKV), 更新(updateMKV) 等,如下
// 获取列表上指定的某一数据int getList(GetListReq req, out GetListRsp rsp);// 获取列表上指定范围的数据int getRangeList(GetRangeListReq req, out BatchEntry rsp);// 向列表头部或尾部插入数据int pushList(PushListReq req);// 弹出列表头部或尾部的数据int popList(PopListReq req, out PopListRsp rsp);// 替换列表中的数据int replaceList(ReplaceListReq req);// 裁剪列表,只保留指定区间,删除区间外的数据int trimList(TrimListReq req);// 从列表头部或者尾部删除一条或多条数据int remList(RemListReq req);
接口的使用方式与前面介绍的 getList 和 pushList 是类似的,关于接口的具体入参和出参结构可以参考 Proxy 接口指南。
本文简要介绍了 DCache 中的 list 缓存模块的原理和使用流程,同时通过具体实例对部分接口的使用进行了详细介绍,帮助读者理解并能够快速上手使用 list 缓存模块。
文中链接:
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小姐姐变好看
本文分享自微信公众号 - TARS星球(TarsCloud)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
关注公众号
					低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 
							
								
								    上一篇
								    
								
								UMS v2.2.32 已经发布,用户管理脚手架
UMS v2.2.32 已经发布,这是一个用户管理脚手架。 此版本更新内容包括: Fixes and Improvements: jwt/修复: jwsSetJsonString 格式不正确. jwt/修复: jwt decode bug. jwt/新增: AuthenticationEntryPoint 认证错误, 返回 json 错误信息的配置. 详情查看:https://gitee.com/pcore/UMS/releases/v2.2.32
 - 
							
								
								    下一篇
								    
								
								去年,一道蚂蚁金服笔试题,还行,中等难度
你好,我是 yes。 最近不是跳槽季嘛,今儿我就来分享一道我之前遇到的笔试题(上机写代码,这里统称笔试),这道题遇到的几率还是比较高的。 很多人可能准备去一波阿里或者其他大厂,而这些大厂面试过程一般都会有笔试。 不过有很多人可能没经历过笔试,所以我先分享一下我之前去面蚂蚁金服时候的笔试经历。 一般没特意去练练是真的不习惯的。 1 当时我在经历了 1 个多小时的 BB 之后,面试官就让我打开邮箱,会有这么一条邮件。 邮件里面有网址,打开网址之后,出来的就是这样的界面: 当然现在截图上是没题目的,但真正面试的时候界面上就能看到面试官已经给你准备好的题目。 我当时的题目是实现个 LRU,面试官给了接口的定义,然后一些使用方法,以及一些注释说明(下文会有具体题目)。 一般而言,看个注释和使用方式就可以得知要实现什么东西了。 这里要注意,不理解题目的要问清楚,不要自己瞎理解,不然咱就渐行渐远了。 还有一点要注意,这里写代码是不会联想的,是不会联想的,是不会联想的。 因此所有的类名、方法名都得你一个字母一个字母的敲。 这对于习惯用 IDE 的我们来说,是个致命打击。 你可以试试看看优先队列、锁这些...
 
相关文章
文章评论
共有0条评论来说两句吧...

			














 
         
				
				
				
				
				
				
				
微信收款码
支付宝收款码