Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >DCache 分布式存储系统|List 缓存模块的创建与使用

DCache 分布式存储系统|List 缓存模块的创建与使用

作者头像
TARS基金会
发布于 2021-03-15 08:51:57
发布于 2021-03-15 08:51:57
80700
代码可运行
举报
文章被收录于专栏:TARS基金会TARS基金会
运行总次数:0
代码可运行

在之前的DCache系列文章中,我们介绍了 DCache 及其 KV 和 K-K-Row 缓存模块的使用,本文将继续介绍如何使用 DCache 中的列表类型缓存模块 —— List 缓存模块。

  • List 模块简介
  • 创建 List 缓存模块
  • 获取 DCache 接口文件
  • 创建缓存服务代理
  • 调用 List 缓存模块服务
    • List 模块读写操作
    • 实例
  • 其它 List 缓存模块服务接口
  • 总结

DCache 是一个基于 TARS 框架开发的分布式 NoSQL 存储系统,支持多种数据结构,包括了 key-value(键值对),k-k-row(多键值),list(列表),set(集合),zset(有序集合)等,满足多种业务需求。

list 即链表,常用于消息的排列,比如 QQ、微信的聊天消息排序。常用的有单向链表和双向链表,由若干链表节点组成,如下图。

单向链表,每个节点存储该节点的数据和下一个节点的地址;双向链表的每个节点则额外包含上一个节点的地址。

DCache 中的 List 模块是基于双向链表实现的,每一个内存数据单元 Block 包含两个指针,分别指向前一个 Block 和后一个 Block。DCache 还提供了操作 list 中某一段的 API,你可以直接查询、删除、替换和裁剪 list 中某一段的元素。如下图为双向链表的结构及替换操作的原理。

同样地,与其它模块相似,我们完成以下步骤即可在服务中使用 list 缓存服务

  1. 创建 List 缓存模块
  2. 获取 DCache 接口文件
  3. 创建缓存服务代理
  4. 调用 List 缓存模块服务

本文将继续基于 TestDemo 介绍如何创建 List 缓存模块,以及怎么在 TARS 服务中调用该服务来缓存数据。

本文使用的示例可以在 GitHub 仓库 DCacheDemo(文末附链接) 中查看。

前面的文章我们已经介绍过缓存模块的创建,各类型缓存模块创建流程是相似的,这部分不再赘述过程类似,这里命名为 TestDemoListcache 类型 选择 List(MKVCache)

我们提到过,DCache 是基于 TARS 开发的,因此使用上和 TARS 服务一样,也是通过 .tars 接口文件来调用对应缓存服务的接口。不同的是,DCache 的接口文件是固定的,我们只需复制 DCache/src/TarsComm 下的 CacheShare.tars, ProxyShare.tars 和 DCache/src/Proxy 下的 Proxy.tars到自己项目目录下即可。(文末附链接)

例如本文 Demo 获取 DCache 接口文件后的项目文件结构如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DCacheDemo
├── CacheShare.tars
├── ProxyShare.tars
├── Proxy.tars
├── config.conf
├── main.cpp
└── makefile

前面的文章中我们提到过,创建一个应用后会自动创建一个路由服务和代理服务,并通过 TestDemo 介绍了如何创建缓存服务代理来调用服务。

我们继续使用 TestDemo,新增一个模块名 ModuleTestDemoList,值为我们前面创建的模块名 TestDemoList,用于之后通过代理调用该模块,如下

通过 TestDemo 代理服务的代理对象和模块名 TestDemoList,我们就能够调用前面创建的 List 缓存模块的接口了。本部分将通过简单示例,介绍 list 类型缓存模块部分接口的使用。关于其它接口的信息,参见 Proxy 接口指南(文末附链接)。

接口调用流程与 TARS 服务接口调用流程一致。如果你还不清楚 TARS 服务的调用方式和流程,可以阅读文章 TARS RPC 通信框架|提供多种远程调用方式了解 TARS 服务的调用方式。

后面的示例中,会使用到三个工具函数,定义如下

那么接下来,我们来看看怎么使用 DCache 的 List 缓存模块。

List模块读写操作

List 模块即列表缓存模块。这里介绍写接口 pushList 和读接口 getList,其它接口用法类似。

向列表插入数据

接口 pushList 用于向列表头部或者末尾插入数据,定义如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int pushList(const PushListReq &req)

其中结构 PushList 定义如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct PushListReq
{
    1 require string moduleName; // 模块名
    2 require string mainKey;    // 主key
    3 require vector<InsertKeyValue> data;  // 待插入数据
    4 require bool atHead = true;   // true 表示插入到 list 头部,false 表示插入尾部
};

使用示例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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())
        {
            // 构建 UpdateValue
            insertValue.mpValue[it->first] = genUpdateValue(DCache::SET, it->second);
            ++it;
        }
        req.data.push_back(insertValue);
    }
    prx->pushList(req);
}
获取列表数据

接口 getList 用于根据指定的主 key 和索引查询列表的数据,定义如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int getList(constGetListReq&req, GetListRsp&rsp)

其中请求消息结构 GetListReq 和返回消息结构 GetListRsp 及其嵌套结构 Entry 的定义如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct GetListReq
{
    1 require string moduleName;  // 模块名
    2 require string mainKey;  // 主key
    3 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;
};

使用示例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 函数中执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main(int argc, char*argv[])
{
        ...
            auto prx = comm->stringToProxy<DCache::ProxyPrx>(DCacheTestDemoObj);
            // 调用 DCache 缓存服务
            testList(prx);
        ...
}

除了获取列表数据接口 getList 和读取键值接口 pushList,DCache 中还提供了丰富的 List 操作接口,包括批量插入(insertMKVBatch), 删除(delMKV), 更新(updateMKV) 等,如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 获取列表上指定的某一数据
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);

接口的使用方式与前面介绍的 getListpushList 是类似的,关于接口的具体入参和出参结构可以参考 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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TARS星球 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
DCache 分布式存储系统|List 缓存模块的创建与使用[通俗易懂]
导语 | 在之前的系列文章中,我们介绍了 DCache 及其 KV 和 K-K-Row 缓存模块的使用,本文将继续介绍如何使用 DCache 中的列表类型缓存模块 —— List 缓存模块。
全栈程序员站长
2022/09/27
5560
DCache 分布式存储系统|List 缓存模块的创建与使用[通俗易懂]
DCache 分布式存储系统|Set, ZSet 缓存模块的创建与使用
在之前的系列文章中,我们介绍了 DCache 及其 KV, K-K-Row 和 List 缓存模块的使用,本文将继续介绍如何使用 DCache 中的集合类型缓存模块 —— Set 和 ZSet 缓存模块。
TARS基金会
2021/03/30
8300
DCache 分布式存储系统|Set, ZSet 缓存模块的创建与使用
DCache 分布式存储系统|Key-Value 缓存模块的创建与使用
DCache 是一个基于 TARS 框架开发的分布式 NoSQL 存储系统,支持多种数据结构,包括了 key-value(键值对),k-k-row(多键值),list(列表),set(集合),zset(有序集合)等,满足多种业务需求
TARS基金会
2021/03/15
1.1K0
DCache 分布式存储系统|K-K-Row 缓存模块的创建与使用
随着微服务与云的发展,分布式架构的需求变得越来越普遍,传统的 SQL 结构化存储方案已经跟不上脚步,于是 NoSQL 出现了。DCache 作为基于 TARS 的分布式 NoSQL 缓存系统,完美支持 TARS 服务。前一篇文章中,我们介绍了怎么创建并使用 KV 模块,本文将继续介绍如何创建和使用 DCache 中的 K-K-Row 缓存模块。
TARS基金会
2021/03/15
7480
腾讯开源框架TarsCpp-rpc设计分析-client(三)
从官方自带的例子TarsCpp/examples/QuickStartDemo/HelloServer/AsyncClient/main.cpp开始
路小饭
2019/06/13
1.4K0
腾讯开源框架TarsCpp-rpc设计分析-client(三)
【开源公告】日调用量数万亿 | 分布式缓存系统DCache正式开源
DCache是腾讯自研的分布式内存型NOSQL存储系统,主要用于高性能分布式缓存。该系统支持k-v,k-k-row,list,set,zset多种数据结构,具备快速水平扩展能力。目前,腾讯内部近百个业务在使用DCache,日调用总量超数万亿次。
腾讯开源
2019/05/16
6930
你不知道的开源分布式存储系统 Alluxio 源码完整解析(上篇)
PART ONE 前言 目前数据湖已成为大数据领域的最新热门话题之一,而什么是数据湖,每家数据平台和云厂商都有自己的解读。整体来看,数据湖主要的能力优势是:集中式存储原始的、海量的、多来源的、多类型的数据,支持数据的快速加工及计算。相比于传统的数据仓库,数据湖对数据有更大的包容性,支持结构化/半结构化/非结构化数据,能快速进行数据的落地和数据价值发掘。数据湖的技术体系可以分为三个子领域:数据湖存储、数据湖计算、数据湖统一元数据。 数据湖存储提供海量异构数据的存储能力,支持多类型的底层存储系统,如分
腾源会
2021/09/28
1.8K0
mybatis缓存源码分析
在java程序与数据库交互的过程中永远存在着性能瓶颈,所以需要一直进行优化.而我们大部分会直接将目标放到数据库优化,其实我们应该先从宏观上去解决问题进而再去解决微观上的问题.性能瓶颈体现在什么地方呢?第一网络通信开销,网络数据传输通信.一般jdbc的连接和创建一个个线程都需要网络开销.第二我们常用的比如mysql.Oracle这样的数据库数据都是存储在硬盘中的,硬盘中大量的数据不利于读写.第三关于java对象的复用.在jdbc中的Connection对象可以通过连接池进行复用,Statement对象的复用.
全干程序员demo
2024/01/20
1570
mybatis缓存源码分析
DCache 分布式存储系统|安装部署与应用创建
随着微服务与云的发展,分布式架构的需求变得越来越普遍,Web 上的数据类型不再单一,数据量呈爆发式增长。传统的 SQL 结构化存储方案已经跟不上脚步, NoSQL 便出现了。DCache 作为基于 TARS 的分布式 NoSQL 缓存系统,完美支持 TARS 服务,能够方便地在 TARS 服务中使用,本系列文章将着重介绍 DCache 的安装与使用。那么如何拥有这套系统呢?本文将对 DCache 的安装和应用创建方式进行介绍。
TARS基金会
2021/03/15
1K0
DCache v1.0 发布,基于 TARS 的分布式 NoSQL 存储系统
DCache是基于TARS框架的分布式NoSQL存储系统,数据基于内存存储,同时提供持久化功能,主要应用于分布式缓存。继2019年4月发布体验版后,今天v1.0正式版在github发布,项目地址https://github.com/Tencent/DCache
TARS基金会
2020/07/15
7960
DCache v1.0 发布,基于 TARS 的分布式 NoSQL 存储系统
腾讯开源分布式NoSQL存储系统DCache | 技术头条
作者 | 山宝银,腾讯后台高级工程师,专注于分布式 NoSQL 存储领域的技术研发工作,参与腾讯多个自研存储系统的开发,在分布式系统、高可用与高性能服务等领域有较丰富的经验。
AI科技大本营
2019/05/06
8360
腾讯开源分布式NoSQL存储系统DCache | 技术头条
基于Tarsnodejs快速实现云短信模块服务
Tars 是将腾讯内部使用的微服务架构TAF(Total Application Framework)多年的实践成果总结而成的开源项目。Nodejs其js的语法对json处理的优势,可以适用于快速实现轻量级接口。
divewang
2019/09/01
2.9K0
基于Tarsnodejs快速实现云短信模块服务
nodejs作为中间层的实践「详细介绍」
nodejs的出现为前端行业带来了无限的可能性,让很多原来只负责客户端开发的同学也慢慢开始接触和使用服务器端技术.
睡魔的谎言
2021/01/16
2.1K0
一种分布式布隆过滤器设计
作者:朱江,腾讯工程师。 | 导语 布隆过滤器是一种很实用的数据结构,能快速判断某个数据是否存在于特定集合中,比如可以用一个布隆过滤器记录读过某篇文章的所有用户,或者记录一个月内访问过某个URL所有用户。这样可以快速判断某个用户是否读过某篇文章、某个用户是否访问过某个URL,同时消耗内存极少。为了可以让各个业务都能方便使用,借鉴DCache设计,方便申请使用、管理,而背后的分配、主备、异常管理不需要业务关心。 01 写在前面 1.布隆过滤器特点 一种概率型的数据结构,可以高效地插入和查询,能告诉你"
腾讯大讲堂
2019/08/06
2.4K0
一种分布式布隆过滤器设计
[源码解析] TensorFlow 分布式环境(4) --- WorkerCache
我们接下来介绍缓存机制。为什么要缓存?因为集群内部有众多 worker。在 Master 与 Worker 之间,Worker 和 Worker 之间都需要交互,所以有必要把 Worker 和其 Grpc 通道都缓存起来。可以说,在 TensorFlow 分布式环境下处处可见缓存的使用。
罗西的思考
2022/05/09
5780
[源码解析] TensorFlow 分布式环境(4) --- WorkerCache
System|分布式|从Dubbo+Zookeeper开始实现分布式存储系统
zookeepeer的协议zab是Paxos变体,众所周知,Paxos是一个强一致性协议,需要经过多轮提议才能确定最终的共识。如果使用Zookeeper来进行存储,性能会惨不忍睹。
朝闻君
2021/11/22
3850
System|分布式|从Dubbo+Zookeeper开始实现分布式存储系统
Java大数据:分布式存储Redis初级入门
在Java大数据当中,Redis作为数据存储的一种的解决方案,主流运用很多。Redis可作为数据库、缓存或者消息代理,从内存加载数据,相比传统的数据库解决方案,具有更快的读写性能。今天我们就来讲讲,Java大数据分布式缓存的Redis入门基础。
成都加米谷大数据
2020/11/12
5900
Java大数据:分布式存储Redis初级入门
鹅厂开源框架tars之网络层实现
tars开源框架地址:https://github.com/Tencent/Tars
皮皮猪头
2019/03/01
5.8K0
分布式系列之限流组件
在高并发场景下,请求量瞬间到达,后端服务器即使有缓存、集群主备、分库分表、容错降级等措施,也有可能扛不住这请求量,因此可考虑引入限流组件。限流的目的:防止恶意请求流量或流量超出系统承载。
johnny666
2024/09/23
1740
TarsBenchmark | 服务性能压测利器
在服务正式上线前,我们需要确保服务上线后的可用性和稳定性,因此对系统的处理能力和稳定性进行全面的测试是非常必要的。压力测试是其中重要的一环,本文将介绍如何使用 TarsBenchmark 对 TARS 服务进行压测。
TARS基金会
2021/02/23
5740
TarsBenchmark | 服务性能压测利器
推荐阅读
相关推荐
DCache 分布式存储系统|List 缓存模块的创建与使用[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验