2019独角兽企业重金招聘Python工程师标准>>>

【缘起】

用户中心是几乎每一个公司必备的基础服务,用户注册、登录、信息查询与修改都离不开用户中心。

当数据量越来越大时,需要多用户中心进行水平切分。最常见的水平切分方式,按照uid取模分库:

通过uid取模,将数据分布到多个数据库实例上去,提高服务实例个数,降低单库数据量,以达到扩容的目的。

水平切分之后:

uid属性上的查询可以直接路由到库,如上图,假设访问uid=124的数据,取模后能够直接定位db-user1。

对于uname上的查询,就不能这么幸运了:

uname上的查询,如上图,假设访问uname=shenjian的数据,由于不知道数据落在哪个库上,往往需要遍历所有库【扫全库法】,当分库数量多起来,性能会显著降低。

用uid分库,如何高效实现上的查询,是本文将要讨论的问题。

【索引表法】

思路:uid能直接定位到库,uname不能直接定位到库,如果通过uname能查询到uid,问题解决

解决方案

1)建立一个索引表记录uname->uid的映射关系

2)用uname来访问时,先通过索引表查询到uid,再定位相应的库

3)索引表属性较少,可以容纳非常多数据,一般不需要分库

4)如果数据量过大,可以通过uname来分库

潜在不足:多一次数据库查询,性能下降一倍

【缓存映射法】

思路:访问索引表性能较低,把映射关系放在缓存里性能更佳

解决方案

1)uname查询先到cache中查询uid,再根据uid定位数据库

2)假设cache miss,采用扫全库法获取uname对应的uid,放入cache

3)uname到uid的映射关系不会变化,映射关系一旦放入缓存,不会更改,无需淘汰,缓存命中率超高

4)如果数据量过大,可以通过name进行cache水平切分

潜在不足:多一次cache查询

uname生成uid

思路:不进行远程查询,由uname直接得到uid

解决方案

1)在用户注册时,设计函数uname生成uid,uid=f(uname),按uid分库插入数据

2)用uname来访问时,先通过函数计算出uid,即uid=f(uname)再来一遍,由uid路由到对应库

潜在不足:该函数设计需要非常讲究技巧,有uid生成冲突风险

uname基因融入uid

思路:不能用uname生成uid,可以从uname抽取“基因”,融入uid中

假设分8库,采用uid%8路由,潜台词是,uid的最后3个bit决定这条数据落在哪个库上,这3个bit就是所谓的“基因”。

解决方案

1)在用户注册时,设计函数uname生成3bit基因,uname_gene=f(uname),如上图粉色部分

2)同时,生成61bit的全局唯一id,作为用户的标识,如上图绿色部分

3)接着把3bit的uname_gene也作为uid的一部分,如上图屎黄色部分

4)生成64bit的uid,由id和uname_gene拼装而成,并按照uid分库插入数据

5)用uname来访问时,先通过函数由uname再次复原3bit基因,uname_gene=f(uname),通过uname_gene%8直接定位到库

【总结】

业务场景:用户中心,数据量大,通过uid分库后,通过uname路由不到库

解决方案

1)扫全库法:遍历所有库

2)索引表法:数据库中记录uname->uid的映射关系

3)缓存映射法:缓存中记录uname->uid的映射关系

4)uname生成uid

5)uname基因融入uid

转载于:https://my.oschina.net/architectliuyuanyuan/blog/1590330

用uid分库,uname上的查询怎么办?相关推荐

  1. 多个圆通快递单号的物流信息如何在电脑上批量查询?

    如何在电脑上批量查询多个圆通快递的物流信息呢?今天小编个大家带来一款查询软件--快递批量查询高手,接下来就用它教大家操作叭. 教程之前,我们先来看一下用快递批量查询高手批量查询圆通快递物流的情况 一行 ...

  2. 社会保障计算机考试证书查询,在电脑上如何查询职业资格证书?

    原标题:在电脑上如何查询职业资格证书? 我现在急需自己的职业资格证书信息,之前我已经考过证书了,现在能查到吗?去哪里查询呢? 一.专业技术人员职业资格证书查询 2017年之后的各类专业技术人员职业资格 ...

  3. 0640-6.1.1-Hue上SQL查询结果显示不全异常分析-补充

    Fayson的github: https://github.com/fayson/cdhproject 推荐关注微信公众号:"Hadoop实操",ID:gh_c4c535955d0 ...

  4. dig命令使用大全(linux上域名查询)

    原文地址为: dig命令使用大全(linux上域名查询) Dig HOWTO 中文手册--dig命令使用大全 DNS 2011-03-25 本人翻译的dig howto手册. 译者序: 可以这样说,翻 ...

  5. 【Query Embedding on Hyper-relational Knowledge Graphs】 超关系知识图谱上的查询嵌入 论文结果复现

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.背景知识 二.写作动机 三.技术概述 1.查询嵌入: 2.超关系知识图谱: 3. 超关系查询: 四.模型概述: 五 ...

  6. python网页查询然后返回结果_使用pythondjang在html页面上显示查询到的API结果

    我目前正在使用django webframework创建一个python应用程序,它允许用户查询外部API来获取有关食物营养(例如卡路里.脂肪)的信息.目前,当用户在网页上的搜索栏中输入食物时,API ...

  7. mysql分库分表分页查询语句_MySQL分库分表分库后的查询(8th)

    前言 这边我们以使用python程序要展示一下再分库分表后,我们需要如何对数据库进行操作. python操作数据库 我们这边还是沿用之前的那5中:场景1:购买者下订单#!/usr/bin/env py ...

  8. linux上进程状态查询

    linux上进程有5种状态:  1. 运行(正在运行或在运行队列中等待)  2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)  3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待 ...

  9. storm 机器上日志查询_Storm原理与实践大数据技术栈14

    回顾:大数据平台技术栈 (ps:可点击查看),今天就来说说其中的Storm! 来自:有米加瓦 一.Storm简介 1. 引例 在介绍Storm之前,我们先看一个日志统计的例子:假如我们想要根据用户的访 ...

最新文章

  1. 用c语言打电子算料,用C语言实现CRC校验计算
  2. 死磕Java并发:J.U.C之并发工具类:Semaphore
  3. python做直方图-python OpenCV学习笔记实现二维直方图
  4. CUDA系列学习(三)GPU设计与结构QA coding练习
  5. 【SSM】Kisso实用教程之验证码简单使用(一)
  6. 跟优秀的人一起进步:四月组队学习
  7. 2020ICPC(小米邀请赛2) - Knapsack(贪心+dp)
  8. 去掉字符串后面所有的0 去掉字符串前面或后面的0;
  9. 平衡二叉查找树的构造与遍历(C++)
  10. oracle视图和索引,oracle视图和索引
  11. 移动通信技术的未来发展趋势分析
  12. 使用PaddlePaddle实现车牌识别
  13. html表格中文字换行设置
  14. 电信院 创新创业实践二 FPGA Verilog vivado 数码显示管 显示译码器
  15. WebDAV之葫芦儿·派盘+Ever play播放器
  16. 解决:word文档中插入照片有一部分不显示
  17. markdown插入图片的几个办法
  18. 【cs224n学习作业】Assignment 1 - Exploring Word Vectors
  19. 3分钟教会你用KaTeX在csdn博客中编辑数学公式
  20. 第三节:带你详解Java的操作符,控制流程以及数组

热门文章

  1. IntelliJ IDEA 连接数据库 详细过程
  2. [HNOI2008]玩具装箱toy(dp+斜率优化)
  3. C算法编程题(二)正螺旋
  4. 花点时间了解消息,句柄和窗口
  5. linux下练习 c++ 关联式容器multimap特性
  6. 段错误产生原因及简单的调试方法
  7. STM32系统定时器SysTick(只能向下递减)延时闪烁灯
  8. 全国计算机等级考试题库二级C操作题100套(第66套)
  9. mysql语录错误1300_mysql 语句常见错误 汇总(持续更新中)
  10. 潘多拉设置有线中继_避坑指南:购买无线中继器必看