随着业务复杂程度的提升、数据规模的增加,愈来愈多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不一样的数据库类型以知足其业务需求。本来在同一数据库实例里就能实现的SQL查询,如今须要跨多个数据库实例才能完成。业务的数据被“散落”在各个地方,如何方便地对这些数据进行汇总关联查询,已经成为困扰用户的一大难题。
针对这类问题,传统的解决方案须要用户提早将全部实例的数据提早聚集到汇总库进行查询分析。这种方案不只没法知足查询时效性,且用户还须要承担数据聚集的链路稳定性风险及数据冗余的经济成本。
为了解决跨数据库实例及时查询的难题,阿里云DMS(数据管理)推出了跨数据库实例查询服务。html
跨实例查询服务支持经过标准SQL进行跨同异构数据库的实时查询。除了关系型数据库MySQL、SQLServer、PostgreSQL,还支持Redis。同时,跨实例查询服务还支持跨地域、跨云及线下IDC自建数据库及跨云厂商数据库实例间的数据实时查询,被普遍应用于多地域部署业务的全局数据查询场景。
本文以MySQL及Redis为例,介绍如何经过一条SQL轻松完成跨数据库实例的查询。mysql
跨实例查询服务支持经过SQL查询Redis中的任意key,同时支持跨key之间的join查询。在进行SQL查询前,您须要先在跨实例查询服务中,建立Redis实例的DBLink。接下来简单介绍建立DBLink及进行SQL查询的流程。redis
在跨实例查询服务的控制台,建立DBLink,配置Redis实例的链接信息。
当完成DBLink建立后,须要使用这个DBLink编写查询SQL。sql
跨实例查询服务提供WEB SQL命令窗口,能够直接在命令窗口中,经过标准的SQL进行Key查询。具体支持的SQL命令能够参考使用文档。
对于每个redis的database, DMS会自动建立6张表,分别以下:
all: 存储全部的key
string: 存储数据类型为string的能够
hash:存储数据类型为hash的key
list: 存储数据类型为list的key
set:存储数据类型为set的key
zset:存储数据类型为score set的key
每张表的表结构以下:数据库
列名 | 类型 | 说明 |
---|---|---|
Key | Varchar | Redis中的key名 |
Index | Varchar | 当数据类型为list/zset时,为各个元素的index;当数据类型为hash时,改字段为hash中的key名称 |
Value | Varchar | Key的value值 |
Score | Double | 表示SortedSet的分值,其余数据类型为null |
Expire_time | Bigint | 跟redis的ttl命令一致,表示数据离过时的剩余秒数 |
Data_type | Varchar | 这个key的数据类型 |
此处,咱们经过经过以下的select语句查询all表中的前5个key。
select * from redis_test.db0.all limit 5;数据结构
日前接到某游戏客户跨MySQL及Redis查询的需求。该客户将用户积分排行榜存储在redis myzset中,而将用户元信息维护在MySQL user 表中。用户的某个简单诉求是:在游戏APP中能实时刷新用户的积分排行榜。阿里云
经过redis score set存储用户积分状况,存储用户ID及score, key的名称为user_scrore, value为用户ID, score为用户积分。样例数据以下表:spa
key | value | score |
---|---|---|
user_score | 100 | 10 |
user_score | 200 | 35 |
user_score | 300 | 45 |
经过MyQL User表存储用户的基本信息,包括user_id, user_name,province, city, gmt_create等,其中:
User_id 为用户ID, User_name 为用户名
Province 为用户所属省份, city 为用户所属市
Gmt_create 为用户第一次登录游戏APP的时间
样例数据以下表:htm
User_id | User_name | province | city | Gmt_create |
---|---|---|---|---|
100 | 张三 | 浙江 | 杭州 | 2018-11-11 11:11:11 |
200 | 李四 | 广东省 | 深圳 | 2018-10-11 12:11:01 |
经过以下SQL,可方便得查询用户的积分排行榜。
select user.user_name,zset.score from redis_test.db0.zset as zset join mysql.db0.user as user where
user.user_id=zset.value and zset.key='user_score' order by zset.score desc;
这个SQL将redis中的用户ID跟MySQL中的user_id进行关联,且只查询存储用户积分的key。blog
因为篇幅有限,本文只是简单介绍了DMS 跨数据库查询的功能及其在Redis上的使用案例。您能够当即体验跨数据库实例查询>>
跨数据库查询的详细功能及使用场景能够参考:使用文档
教你用一条SQL搞定跨数据库查询:如何玩转跨库Join
本文做者:lyrewu
本文为云栖社区原创内容,未经容许不得转载。