用uid分库,uname上的查询怎么办?
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上的查询怎么办?相关推荐
- 多个圆通快递单号的物流信息如何在电脑上批量查询?
如何在电脑上批量查询多个圆通快递的物流信息呢?今天小编个大家带来一款查询软件--快递批量查询高手,接下来就用它教大家操作叭. 教程之前,我们先来看一下用快递批量查询高手批量查询圆通快递物流的情况 一行 ...
- 社会保障计算机考试证书查询,在电脑上如何查询职业资格证书?
原标题:在电脑上如何查询职业资格证书? 我现在急需自己的职业资格证书信息,之前我已经考过证书了,现在能查到吗?去哪里查询呢? 一.专业技术人员职业资格证书查询 2017年之后的各类专业技术人员职业资格 ...
- 0640-6.1.1-Hue上SQL查询结果显示不全异常分析-补充
Fayson的github: https://github.com/fayson/cdhproject 推荐关注微信公众号:"Hadoop实操",ID:gh_c4c535955d0 ...
- dig命令使用大全(linux上域名查询)
原文地址为: dig命令使用大全(linux上域名查询) Dig HOWTO 中文手册--dig命令使用大全 DNS 2011-03-25 本人翻译的dig howto手册. 译者序: 可以这样说,翻 ...
- 【Query Embedding on Hyper-relational Knowledge Graphs】 超关系知识图谱上的查询嵌入 论文结果复现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.背景知识 二.写作动机 三.技术概述 1.查询嵌入: 2.超关系知识图谱: 3. 超关系查询: 四.模型概述: 五 ...
- python网页查询然后返回结果_使用pythondjang在html页面上显示查询到的API结果
我目前正在使用django webframework创建一个python应用程序,它允许用户查询外部API来获取有关食物营养(例如卡路里.脂肪)的信息.目前,当用户在网页上的搜索栏中输入食物时,API ...
- mysql分库分表分页查询语句_MySQL分库分表分库后的查询(8th)
前言 这边我们以使用python程序要展示一下再分库分表后,我们需要如何对数据库进行操作. python操作数据库 我们这边还是沿用之前的那5中:场景1:购买者下订单#!/usr/bin/env py ...
- linux上进程状态查询
linux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待 ...
- storm 机器上日志查询_Storm原理与实践大数据技术栈14
回顾:大数据平台技术栈 (ps:可点击查看),今天就来说说其中的Storm! 来自:有米加瓦 一.Storm简介 1. 引例 在介绍Storm之前,我们先看一个日志统计的例子:假如我们想要根据用户的访 ...
最新文章
- 用c语言打电子算料,用C语言实现CRC校验计算
- 死磕Java并发:J.U.C之并发工具类:Semaphore
- python做直方图-python OpenCV学习笔记实现二维直方图
- CUDA系列学习(三)GPU设计与结构QA coding练习
- 【SSM】Kisso实用教程之验证码简单使用(一)
- 跟优秀的人一起进步:四月组队学习
- 2020ICPC(小米邀请赛2) - Knapsack(贪心+dp)
- 去掉字符串后面所有的0 去掉字符串前面或后面的0;
- 平衡二叉查找树的构造与遍历(C++)
- oracle视图和索引,oracle视图和索引
- 移动通信技术的未来发展趋势分析
- 使用PaddlePaddle实现车牌识别
- html表格中文字换行设置
- 电信院 创新创业实践二 FPGA Verilog vivado 数码显示管 显示译码器
- WebDAV之葫芦儿·派盘+Ever play播放器
- 解决:word文档中插入照片有一部分不显示
- markdown插入图片的几个办法
- 【cs224n学习作业】Assignment 1 - Exploring Word Vectors
- 3分钟教会你用KaTeX在csdn博客中编辑数学公式
- 第三节:带你详解Java的操作符,控制流程以及数组