提交 a4ca99de authored 作者: qhz's avatar qhz

【开发】增加分表文档

上级 417a6601
# 目标
为了解决数据量增加,导致的数据查询缓慢的问题。所以,初步按品牌商作为分表的规则
# 缓存获取
## 缓存获取示意图
![avatar](./images/sharding/sharding_1.png)
## 数据库中分表数据
在 ydd_brand_business 数据库中 ydd_brand 增加 sharding 分表数据. 作为基本的数据
```
`sharding` text COLLATE utf8mb4_unicode_ci COMMENT '分表表数据'
```
数据格式如下:
```
{"fch_virtual_relation": {'t': 'ydd_fch_virtual_relation_10010001'}}
```
- fch_virtual_relation: 需要分表的表名
- t: 表名key。对应的就是最终要分表名称
- 同时这个json,可以对单个表扩展,二次分表的规则和数据表的数量(待实现)
## 缓存中分表数据
![avatar](./images/sharding/sharding_2.png)
数据类型为 map类型。以 brandId 做key
## 注意点
现在的 ydd_brand sharding 数据的获取,一般是接口登录(命令行输入brandId), 会获取品牌商信息(无缓存的情况)。
这种时候,才会获取到 sharding数据,并写入缓存
通过在 数据库Model 层按 brandId 获取对应 sharding 缓存。不会因为数据不存在,再查询一下数据库
因为 90%以上的情况是不分表的业务情况,会浪费事件。所以做了一个权衡
这样,就导致了一个问题。分表数据更新时候,不能实时获取分表数据。需要重新登录,获取直接修改 sharding 缓存
# 缓存获取代码实现
## 获取品牌商信息和设置品牌商上下文
![avatar](./images/sharding/sharding_3.png)
```
// 获取品牌商信息 并设置缓存
$brandSharding = \CommonCacheSdk\BrandShardingCache::getInstance(get_cache_container(CacheDatabaseConstants::SHARDING));
$brandSharding->setBrandShardingCache($brand_id, $brand['sharding'] ? $brand['sharding'] : '');
```
接着就是设置品牌商上下文
```
Context::set(BrandAuth::class, new BrandAuth(['brand_id' => $brandId]));
```
品牌商上下文是为了在 Model 层时,用于获取 sharding 缓存
## Model 层 设置分表
app\Model\Model.php
```
public function __construct()
{
$brandAuth = get_auth_brand();
if ($brandAuth) {
$brandId = $brandAuth->brandId();
$brandShardingIns = \CommonCacheSdk\BrandShardingCache::getInstance(get_cache_container( CacheDatabaseConstants::SHARDING));
$tableName = $brandShardingIns->getTableName($brandId, $this->table);
if (!empty($tableName)) {
$this->setTable($tableName);
}
}
parent::__construct();
}
```
`通过对 构造函数的重写,获取按品牌商id和表名获取分表数据,并设置新的分表名称`
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论