首页 > 其他分享 >基因法分库分表

基因法分库分表

时间:2024-03-23 14:56:09浏览次数:19  
标签:分库 16 基因 order 订单 user 分表 id

问题

假设我们有一张超大的订单表(N亿),里面有order_id、user_id等字段。

  1. 能通过order_id快速查找对应订单
  2. 能通过user_id快速查找该用户具有的订单列表

像上面这样的要求改怎样做呢?通过哈希订单ID取模?那如何满足通过用户ID快速查找订单列表呢?

什么是基因算法

理论

He meant that taking number mod 2^n is equivalent to stripping off all but the n lowest-order (right-most) bits of number

即: 一个数取余2的n次方,那么余数就是这个数的二进制的最后n位数。所有我们可以位操作符把高位清零就可以得到余数.

image

用户user_id=666 (666的二进制表示为:0000 0010 1001 1010)的用户生成一个订单步骤

  1. 使用user_id%16分库,决定这行数据要插入到哪个库中

  2. 分库基因是user_id的最后4个bit,即1010

  3. 在生成order_id时,先使用一种分布式ID生成算法生成前60bit(上图中浅灰色部分)

  4. 将分库基因加入到order_id的最后4个bit(上图中绿色部分)

  5. 拼装成最终的64bit订单order_id(上图中蓝色部分)

  6. 这般,保证了同一个用户发布的所有订单的order_id,都落在同一个库上,order_id的最后4个bit都相同,于是:

    • 通过order_id%16能够定位到库

    • 通过user_id%16也能定位到库

Python代码实现

import random

# 假设我们有16个库,每个库有16个表
num_databases = 16
num_tables = 16

# 假设我们有一些用户
user_ids = [random.randint(1, 10000) for _ in range(10)]


def generate_order_id(user_id):
    # 使用分布式ID生成算法生成前60bit(这里我们简化为一个随机数)
    distributed_id = random.randint(1, 2**60)
    # 从 user_id 中提取基因
    gene = user_id % 16
    # 将基因加入到 order_id 的最后几个bit
    order_id = (distributed_id << 4) | gene
    return order_id


def get_database_and_table_from_user_id(user_id):
    # 使用 user_id 的最后4位作为基因
    gene = user_id % 16
    # 使用基因决定数据库和表
    database = gene % num_databases
    table = gene % num_tables
    return database, table


def get_database_and_table_from_order_id(order_id):
    # 从 order_id 中提取基因
    gene = order_id % 16
    # 使用基因决定数据库和表
    database = gene % num_databases
    table = gene % num_tables
    return database, table


if __name__ == '__main__':

    for user_id in user_ids:
        u_database, u_table = get_database_and_table_from_user_id(user_id)
        # 生成订单ID
        order_id = generate_order_id(user_id)
        o_database, o_table = get_database_and_table_from_order_id(order_id)
        print(f"user_id: {user_id}, order_id: {order_id} "
              f"user database: {u_database}, user table: {u_table}  "
              f"order database: {o_database} order table: {o_table}")


标签:分库,16,基因,order,订单,user,分表,id
From: https://www.cnblogs.com/taozhengquan/p/18091121

相关文章

  • 易基因: WGBS+RNA-seq揭示松材线虫JIII阶段形成过程中的DNA甲基化差异
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。松木线虫(PWN,Bursaphelenchusxylophilus)是一种破坏性病原体,可引起松树枯萎病,感染PWN的松树最终会死亡。这种微观线虫具有复杂的生命周期,具有植食性(以植物为食)和菌丝体(以真菌为食)的发育阶段,以及不同的生命周期,包括繁殖......
  • 开源一个教学型分库分表示例项目 shardingsphere-jdbc-demo
    在笔者心中,消息队列,缓存,分库分表是高并发解决方案三剑客。分库分表之所以被广泛使用,因为工程相对简单,但分库分表并不仅仅是分片,还是需要考虑如何扩缩容(全量同步、增量同步、数据校验等)。因此笔者做了一个教学型分库分表示例项目,计划将分库分表的技术体系都实际演示一遍。ht......
  • 易基因:MeRIP-seq揭示m6A修饰在肺动脉高压(PAH)发病机制中的潜在作用和新治疗靶点|项目
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。肺动脉高压(pulmonaryarterialhypertension,PAH)是一种不可逆的心血管疾病,其特征是肺血管阻力进行性增加,最终导致肺动脉高压和右心衰竭。PAH主要成因包括血管收缩、肺血管重塑和细胞外基质(ECM)沉积。肺血管重塑主......
  • 23-有参转录组实战9-差异基因GO富集分析
    #这里需要对非模式物种制作ORG.DB包,如果是模式物种,“https://bioconductor.org/packages/release/BiocViews.html#___OrgDb”该网站有自带的成熟的包,自行下载使用就行。#对上一个教程中得到的out.emapper.annotations文件,对表头修整下:#windows上的R运行library(dplyr)libra......
  • 易基因:人类大脑的单细胞DNA甲基化和3D基因组结构|Science
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。高通通量表观基因组分析技术可用于阐明大脑中细胞复杂性的基因调控程序。5'-甲基胞嘧啶(5mCs)是哺乳动物基因组中最常见的修饰碱基,大多数5mCs发生在胞嘧啶-鸟嘌呤二核苷酸(CpGs)上。CG差异甲基化区域(DMRs)通常是顺式......
  • 画单细胞基因表达量的一个问题。(二)
    -Tycoon20240316(转载请留言说明)那么具体什么情况会出现: 细胞类型CT1的平均表达量Avg(CT1_ln(A+1)) 低于 细胞类型CT2的平均表达量Avg(CT1_ln(A+1))呢? 推导公式: 这公式有点复杂,我这半吊子水平解不出来。换个角度看吧。讨论第一种情况(即昨天猜测......
  • 今天画单细胞基因表达量的一个问题。(一)
    -Tycoon20240315(转载请留言说明)今天下午画基因表达量在细胞类型表达量变化的时候,发现了一个问题。Q: 假设-细胞类型CT1在特定基因A上的平均表达量Avg(CT1_A)[注:表达量为0的细胞也要算进去] 高于细胞类型CT2在特定基因A上的平均表达量Avg(CT2_A)。那么问题是,......
  • 什么是分库分表?用Java手写一个分库分表组件
    分库分表分库分表路由组件的主要功能是负责处理数据在多个数据库和表之间的分配和路由。在分库分表的场景中,数据会根据一定的策略(如业务逻辑、哈希算法等)被分散到不同的数据库或表中,以提高系统的并发处理能力和扩展性。具体来说,分库分表路由组件需要完成以下任务:数据源的......
  • MFEA-GSMT--通过基因相似性和镜像转换来解决多任务优化问题
    MFEA-GSMT–通过基因相似性和镜像转换来解决多任务优化问题title:ImprovingEvolutionaryMultitaskingOptimizationbyLeveragingInter-TaskGeneSimilarityandMirrorTransformationauthor:XiaoliangMa,YongjinZheng,andZexuanZhu,XiaodongLi,LeiWang,Yu......
  • 读写分离 & 分库分表 & 深度分页
    什么是读写分离?见名思意,根据读写分离的名字,我们就可以知道:读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。 这样的话,就能够小幅提升写性能,大幅提升读性能。一般情况下,我们都会选择一主多从,也就是一台主数据库负责写,其他的从数据库负责读。主库和从库之间会......