分片字段userId-用手机号查询

选取好分片字段,数据库分片就完成了一大半

面对用户维度(2C)的业务我们最常用的分片字段就是user_id,但登录基本都拿手机号(没见过拿user_id的)这样的场景怎么实现呢?

下面我们提供三种实现方案:

一、维护映射关系

在数据库新建表,表只有两列,维护手机号-user_id的映射

 同时将映射表数据维护到缓存;操作顺序如下

  1. 用户注册时拿手机号查询缓存,如果不存在直接走注册流程
  2. 注册成功后同时维护缓存(不设置失效时间)和映射表
  3. 手机号查询时,先查询缓存得到user_id,然后拿user_id查询

缺点

  1. 每次多查询一次缓存
  2. 缓存不可用时需要查询一次数据库
  3. 映射表维护全量数据,如果数据量达到一定程度也要考虑分库分表的情况(复杂度高)

优点:

  1. 实现简单

二、设置多分片字段

例如:我们订单查询,按不同用户角色拿用户id(user_id)和商户id(merchant_id)分别查询

实现思路:

  1. 每个库新建两张字段一模一样的表,用来冗余所有字段,表中包含两个分片字段(如下图)
  2. 新增数据时以其中一个分片字段为准新增其中一个表
  3. 读取新增数据的binlog,再按照其它分片字段逐一新增其它库表

表1分片字段:user_id

表2分片字段:merchant_id

首先看数据流程:

  1. 新增数据时以user_id为分片键选择库,新增成功后记录binlog
  2. 利用阿里canal监听binlog再按照merchant_id分片键重新选择库,新增数据
  3. 执行完1-2步骤之后,至少有两个表内有了数据(可能在不同库,也可能在同一个库)

优点:

  1. 查询只需要按不同分片字段查询一次即可

缺点:

  1. 一条新增需要维护两个表,冗余一条数据,占用空间
  2. 代码复杂度高,需要引入binlog监听中间件(当然也可以新增成功后发mq)
  3. 分片规则、算法要求高,多分片键时通过分片算法,分的库个数要相同,不相同的话需要维护两套库更复杂

三、查询字段包含分片因子

这里主要参考Snowflak算法,将字段值赋予一定的业务意义,反编译后得到分片因子

比如:分库算法:每年一个库;用户id按Snowflake 算法生成;反编译user_id后得到时间从而选择库

再粗暴点:拿user_id能解析出merchant_id,拿merchant_id做分片键

题外话:具体用那种还要结合具体的分片规则,架构设计等综合考虑,这里只是给出大概思路,一般的系统1就能满足,3对于登录这样的场景不太好弄,2实现相对复杂,但使用起来效果最好

 

 

公众号主要记录各种源码、面试题、微服务技术栈,帮忙关注一波,非常感谢

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值