作者 | Eaton
导语 | 在之前的系列文章中,我们介绍了 DCache 及其 KV 和 K-K-Row 缓存模块的使用,本文将继续介绍如何使用 DCache 中的列表类型缓存模块 —— List 缓存模块。
系列文章
- DCache 分布式存储系统|安装部署与应用创建
- DCache 分布式存储系统|Key-Value 缓存模块的创建与使用
- DCache 分布式存储系统|K-K-Row 缓存模块的创建与使用
- DCache 分布式存储系统|List 缓存模块的创建与使用
目录
DCache 是一个基于 TARS 框架开发的分布式 NoSQL 存储系统,支持多种数据结构,包括了 key-value
(键值对),k-k-row
(多键值),list
(列表),set
(集合),zset
(有序集合)等,满足多种业务需求。
在前面的文章中,我们介绍过 key-value
和 k-k-row
两种类型缓存模块的使用方式,本文将继续介绍 list
类型缓存模块的使用。
List 模块简介
list
即链表,常用于消息的排列,比如 QQ、微信的聊天消息排序。常用的有单向链表和双向链表,由若干链表节点组成,如下图。
单向链表,每个节点存储该节点的数据和下一个节点的地址;双向链表的每个节点则额外包含上一个节点的地址。
DCache 中的 List 模块是基于双向链表实现的,每一个内存数据单元 Block 包含两个指针,分别指向前一个 Block 和后一个 Block。DCache 还提供了操作 list
中某一段的 API,你可以直接查询、删除、替换和裁剪 list
中某一段的元素。如下图为双向链表的结构及替换操作的原理。
同样地,与其它模块相似,我们完成以下步骤即可在服务中使用 list
缓存服务
- 创建 List 缓存模块
- 获取 DCache 接口文件
- 创建缓存服务代理
- 调用 List 缓存模块服务
本文将继续基于 TestDemo
介绍如何创建 List 缓存模块,以及怎么在 TARS 服务中调用该服务来缓存数据。
本文使用的示例可以在 GitHub 仓库 DCacheDemo 中查看。
创建 List 缓存模块
前面的文章我们已经介绍过缓存模块的创建,各类型缓存模块创建流程是相似的,这部分不再赘述
过程类似,这里命名为 TestDemoList
,cache 类型
选择 List(MKVCache)
获取 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
介绍了如何创建缓存服务代理来调用服务。
我们继续使用 TestDemo
,新增一个模块名 ModuleTestDemoList
,值为我们前面创建的模块名 TestDemoList
,用于之后通过代理调用该模块,如下。
// main.cpp
#include <iostream>
#include <map>
#include "servant/Communicator.h"
#include "servant/ServantProxy.h"
#include "Proxy.h"
using namespace std;
using namespace tars;
#define START "[\033[32mSTART\033[0m]"
#define END "[ \033[31mEND\033[0m ]"
#define SUBTEST_PREFIX "\t-- "
// TestDemo 代理服务对象名
static string DCacheTestDemoObj = "DCache.TestDemoProxyServer.ProxyObj";
// 缓存模块名
static string ModuleTestDemoKV = "TestDemoKV";
static string ModuleTestDemoKKRow = "TestDemoKKRow";
static string ModuleTestDemoList = "TestDemoList";
int main(int argc, char *argv[])
{
CommunicatorPtr comm = new Communicator();
try
{
TC_Config conf;
// 解析配置文件
conf.<