
作者 | 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(const AddSetReq &req)
其中结构 AddSetReq 及其嵌套结构 AddSetKeyValue 的定义如下
struct AddSetReq
{
1 require string moduleName; // 模块名
2 require AddSetKeyValue value; // 待写入数据
};
struct AddSetKeyValue
{
1 require string mainKey; // 主key
2 require map<string, UpdateValue> data; // 其他字段数据
3 require int expireTime; // 过期时间
4 require bool dirty = true; // 是否设置为脏数据
};
使用示例如下

本文详细介绍了DCache中的Set和ZSet缓存模块,包括它们的特性、创建与使用方法。Set用于存储无序不重复的数据,而ZSet则是一个有序集合,通过score进行排序。文中通过实例展示了如何进行添加值、获取集合等操作,并提到了DCache提供的丰富集合操作接口。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



