作者 | Eaton
导语 | 随着微服务与云的发展,分布式架构的需求变得越来越普遍,传统的 SQL 结构化存储方案已经跟不上脚步,于是 NoSQL 出现了。DCache 作为基于 TARS 的分布式 NoSQL 缓存系统,完美支持 TARS 服务。在前一篇文章中,我们介绍了 DCache 的特性、如何在 TARS 上部署 DCache 并创建一个应用 TestDemo
。本文将继续介绍如何创建和使用 DCache 中的 KV 缓存模块。
系列文章
- DCache 分布式存储系统|DCache 部署与应用创建
- DCache 分布式存储系统|Key-Value 缓存模块的创建与使用
目录
简介
DCache 是一个基于 TARS 框架开发的分布式 NoSQL 存储系统,支持多种数据结构,包括了 key-value
(键值对),k-k-row
(多键值),list
(列表),set
(集合),zset
(有序集合)等,满足多种业务需求。
其中 key-value
是最简单也是最常用的类型,我们只需完成以下步骤即可在服务中使用 key-value
缓存服务
- 创建 KV 缓存模块
- 获取 DCache 接口文件
- 创建缓存服务代理
- 调用缓存模块服务
DCache 中为 KV 提供了插入、替换、删除和批量操作键值等丰富的操作接口,使用上非常方便。本文将基于 TestDemo
介绍如何创建 Key-Value 缓存模块,以及怎么在 TARS 服务中调用该服务来缓存数据。
本文使用的示例可以在 GitHub 仓库 DCacheDemo 中查看。
应用场景
DCache 的 KV 缓存模块为常规 key-value
缓存应用,一个键 key 对应一个值 value。value 一般为字符串类型。适用于结构简单的数据,常用于常规计数,如微博数, 粉丝数等,如下图。
对于一些复杂的结构化数据,比如需要为一个 key 存储多个值,通常有两种实现方式。一种是通过序列化存储实现,将多个字段存储在 value
中,需要处理多个字段并发读写的问题。另一种是通过将 id
和字段作为 key 的方式存储多个键值对实现,比如 Jane_age
存储 Jane 的年龄, Jane_email
存储 Jane 的邮箱,这样 key 中会有大量重复用户 ID。如下图
因此一般会使用其它缓存类型来存储结构化数据,比如 DCache 中的 k-k-row
。该类型我们将在下一篇文章详细介绍。
创建 KV 缓存模块
与 TARS 中应用与服务之间的关系相似,一个 DCache 应用中能够创建多个缓存模块服务。每个缓存模块支持一种缓存数据结构,通过在一个应用中创建多个不同数据结构的缓存模块,能够实现多种数据类型的存储,满足多种需求。本文将介绍如何创建 KV 模块,其他数据类型相关内容将在之后的文章中分享。
首先,在 DCache 页面进入 服务创建 > 创建模块
,选择我们之前创建的应用 TestDemo
,模块名要求以应用名开头,这里我们因为创建的是 KV 模块,我们命名 TestDemoKV
,如下
进入第二步的模块配置,cache 类型
选择 key-value(KVCache)
,填充备注
第三步服务配置,选好服务 IP 节点,并选择一个 MySQL 实例,在前一篇文章中我们已经添加过一个 MySQL 实例。如果需要使用新的 MySQL 服务,选中下方的 MySQL 实例信息
输入实例信息即可。如下,点击 下一步
弹出字段配置窗口,保持默认即可,点击 确定
确认好已配置信息后,点击 安装发布
即可完成发布。
到这里,我们就可以在其它服务中使用该缓存模块来缓存 Key-Value 数据了。
总体来说,创建缓存模块的过程分为三步:模块创建、模块配置和服务配置。模块配置时,大家按需选择缓存类型即可。
获取 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
,就会自动创建一个路由服务 TestDemoRouterServer
和一个代理服务 TestDemoProxyServer
。TestDemo
下每个缓存模块都是通过代理服务 TestDemoProxyServer
来访问的。
因此,在 TARS 服务或客户端中,我们只需要创建一个该代理服务的代理对象即可调用 TestDemo
下的缓存模块。
例如,我们在 main.cpp
中通过如下代码创建 TestDemoProxyServer
的代理对象 prx
// main.cpp
#include <iostream>
#include <map>
#