作者 | Eaton
导语 | 在之前的系列文章中,我们介绍了 DCache 及其 KV, K-K-Row 和 List 缓存模块的使用,本文将继续介绍如何使用 DCache 中的集合类型缓存模块 —— Set 和 ZSet 缓存模块。
系列文章
- DCache 分布式存储系统|DCache 部署与应用创建
- DCache 分布式存储系统|Key-Value 缓存模块的创建与使用
- DCache 分布式存储系统|K-K-Row 缓存模块的创建与使用
- DCache 分布式存储系统|List 缓存模块的创建与使用
- DCache 分布式存储系统|Set, ZSet 缓存模块的创建与使用
目录
DCache 是一个基于 TARS 框架开发的分布式 NoSQL 存储系统,支持多种数据结构,包括了 key-value
(键值对),k-k-row
(多键值),list
(列表),set
(集合),zset
(有序集合)等,满足多种业务需求。
在前面的文章中,我们介绍过 key-value
, k-k-row
和 list
两种类型缓存模块的使用方式,本文将继续介绍集合类型,set
和 zset
缓存模块的使用。
Set 与 ZSet 模块简介
set
即集合,与 list
类似,以列表形式存储数据。不同的地方在于 set
是会对添加的数据进行排重的。如果你需要存储一个列表数据,又不希望出现重复数据时,set
是一个很好的选择。
zset
为有序集合,使用场景与 set
类似,但 set
并不是自动有序的。在 zset
中,提供了一个的参数 score 来为数据成员排序。当你需要一个有序的并且不重复的集合列表,那么可以选择 zset
数据结构。比如微信朋友圈可以以发表时间作为 score 来存储,这样获取时就是自动按时间排好序的。
和 set
相比,zset
关联了一个 double
类型权重参数 score,使得集合中的元素能够按 score 进行有序排列。
同样地,与其它模块相似,使用 set
和 zset
缓存服务的步骤如下
- 创建 Set/ZSet 缓存模块
- 获取 DCache 接口文件
- 创建缓存服务代理
- 调用 Set/ZSet 缓存模块服务
接下来将继续基于 TestDemo
介绍如何创建和使用 Set/ZSet 缓存模块。
本文使用的示例可以在 GitHub 仓库 DCacheDemo 中查看。
创建 Set/ZSet 缓存模块
前面的文章我们已经介绍过缓存模块的创建,各类型缓存模块创建流程是相似的。这里 Set 缓存服务命名为 TestDemoSet
,cache 类型
选择 Set(MKVCache)
新建 ZSet 缓存服务命名为 TestDemoZSet
,cache 类型
选择 Zset(MKVCache)
对于步骤 2 和 3,我们已经在前面的系列文章中介绍过,本文不再赘述。还不了解的朋友请移步 Key-Value 缓存模块的创建与使用。
调用缓存模块服务
本部分将通过简单示例,介绍 set
和 zset
类型缓存模块部分接口的使用。关于其它接口的信息,参见 Proxy 接口指南。
我们继续使用 TestDemo
,新增模块名 ModuleTestDemoSet
和 ModuleTestDemoZSet
,值为我们前面创建的模块名 TestDemoSet
和 TestDemoZSet
,用于之后通过代理调用这两个模块,如下。
// main.cpp
...
static string ModuleTestDemoSet = "TestDemoSet";
static string ModuleTestDemoZSet = "TestDemoZSet";
...
接口调用流程与 TARS 服务接口调用流程一致。如果你还不清楚 TARS 服务的调用方式和流程,可以阅读文章 TARS RPC 通信框架|提供多种远程调用方式 了解 TARS 服务的调用方式。
后面的示例中,会使用到三个工具函数,定义如下
// 构建 UpdateValue
DCache::UpdateValue genUpdateValue(DCache::Op op, const string &value)
{
DCache::UpdateValue updateValue;
updateValue.op = op;
updateValue.value = value;
return updateValue;
}
// 打印 map<string, string> 类型数据
void printMapData(const map<string, string> &data)
{
map<string, string>::const_iterator it = data.begin();
while (it != data.end())
{
cout << "|" << it->first << ":" << it->second;
++it;
}
cout << endl;
}
// 打印 vector<map> 数据
void printVectorMapData(const vector<map<string, string>> &data)
{
for (auto item : data)
{
printMapData(item);
}
}
那么接下来,我们来看看怎么使用 DCache 的 Set/ZSet 缓存模块。
Set 模块读写操作
Set 为集合缓存模块。这里介绍写接口 addSet
和读接口 getSet
,其它接口用法相似。
向集合添加值
接口 addSet
用于向特定集合添加值,定义如下
int addSet