Presto 是一款快速的、稳定的 SQL 查询引擎。
上面的图片来自于 Presto 官网,Presto 将组件划分为三层:
底层:存储结构化数据的数据源,数据源来自于关系型数据库、非关系型数据库、OLAP、分布式数据库、消息中间件、HDFS 以及各种云存储;
中间层:Presto,支持异构数据源的查询以及异构数据源之间的联合查询;
应用层:借助于 Presto 查询引擎,在复杂的异构数据源中操作数据构建上层应用。
统计接口调用次数:未使用 Presto
在之前的项目中为了计算每天用户调用接口的次数,使用 Redis 累加调用次数,用户基本信息存储在 MySQL 中,下面是实际的实现。
MySQL 中的 user 表:
Redis 中的 key 设计:
调用接口总次数:api_tag_count
每天调用接口次数:api_tag_count_20230812
用户调用接口总次数:user_1_api_tag_count
用户每天调用接口次数:user_1_api_tag_count_20230812
使用 Jedis 客户端累加接口调用次数:
实际应用:管理员可以按照时间、用户查询接口的调用次数
上面实现的代价:
创建 User、ApiStats 实体类;
使用 mybatis 框架构建 userDao;
使用 userDao 获取用户详情;
使用 jedis 客户端获取调用次数。
如果我们使用 Presto 实现会变的简单些吗 ?
使用 Presto 实现
1. 配置 MySQL Catalog
配置后可通过 访问 user 表。
2. 配置 Redis Catalog
你需要配置虚拟的表名,完整的表名为 redis.schema1.api,Presto 内置了映射的列, 对应 Redis 中实际的键, 对应键的值,更详细的可参考:https://prestodb.io/docs/current/connector/redis.html。
在 Worker 节点验证下配置的是否正确:
3. 编写实现代码
pom.xml 中加入 presto-jdbc:
编写实现服务:ApiStatsService,该服务可通过用户 id、接口名称和日期查询调用次数。
ApiStatsService 实现的主要逻辑通过 MySQL 和 Redis 中的表关联,关联条件基于用户 id 和 Redis 键的构建规则。
4. 实际使用
输出:
基于 Presto 的实现:面向 SQL 编程,代码实现简单,原本几个阶段的查询现在转变为一次查询,实际上是 Presto 帮你进行了异构数据源的融合,而对于开发者只需要关心 Catalog 配置的是否正确,查询的 SQL 拼装的是否正确。
Presto 为你做了什么
Presto 管理了数据源的元数据信息:数据源类型、连接地址、用户名和密码等信息;
Presto 定义了异构数据源的访问标准:Catalog、Scehma 和 Column;
Presto 定义了 SQL 语句查询的标准:DDL、DML、方法和运算符等;
Presto SQL 的查询变成了分布式查询,理论上加速了查询,同时限制 SQL 查询过程中内存的使用。
领取专属 10元无门槛券
私享最新 技术干货