自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

uid 分庫,uname 究竟怎么查詢(五種方法)?

開發(fā)
uid能直接路由到庫,uname不能直接路由到庫,如果通過uname能查詢到uid,則問題解決。

用戶中心是每一個公司必備的基礎(chǔ)服務(wù),用戶注冊、登錄、信息查詢與修改都離不開用戶中心。

當(dāng)用戶中心單庫數(shù)據(jù)量越來越大時,怎么辦?

單庫存不下,水平切分,用多庫。

用什么業(yè)務(wù)屬性水平切分?

主鍵uid。

如何進行數(shù)據(jù)路由?

uid取模直接路由,例如:

如上圖所示,假設(shè)訪問uid=124的數(shù)據(jù),取模后能夠直接路由db1。

那對于登錄名uname上的查詢怎么辦?

方案一:掃全庫法。

如上圖所示,假設(shè)訪問uname=shenjian的數(shù)據(jù),由于不知道數(shù)據(jù)落在哪個庫上,往往需要遍歷所有庫。

其潛在不足是:當(dāng)分庫數(shù)量多起來,性能會顯著降低。

還有沒有其他更加高效的方法呢?

常見的方案有以下幾種。

方案二:索引表法。

其設(shè)計思路是:uid能直接路由到庫,uname不能直接路由到庫,如果通過uname能查詢到uid,則問題解決。

其具體步驟是:

  • 建立一個索引表,記錄uname到uid的映射關(guān)系;
  • 用uname來訪問時,先通過索引表查詢到uid,再路由相應(yīng)的庫;
  • 索引表屬性較少,可以容納非常多數(shù)據(jù),一般不需要分庫;
  • 如果數(shù)據(jù)量過大,索引表可以通過uname來分庫;

其潛在不足是:增加了一次數(shù)據(jù)庫查詢。

方案三:緩存映射法。

其設(shè)計思路是:訪問索引表性能較低,把映射關(guān)系放在緩存里性能更佳。

其具體步驟是:

  • uname先到cache中查詢uid,再根據(jù)uid路由數(shù)據(jù)庫;
  • 假設(shè)cache miss,降級為掃全庫法獲取uname對應(yīng)的uid,放入cache;
  • uname到uid的映射關(guān)系不會變化,映射關(guān)系一旦放入緩存,不會更改,無需淘汰,緩存命中率超高;
  • 如果數(shù)據(jù)量過大,cache可以通過uname水平切分;

其潛在不足是:增加了一次cache查詢。

方案四:uname生成uid。

其設(shè)計思路是:無需遠程查詢,本地計算由uname直接得到uid。

其具體步驟是:

  • 在用戶注冊時,設(shè)計單向函數(shù)uname生成uid,uid=f(uname),按uid分庫插入數(shù)據(jù);
  • 用uname來訪問時,先通過單向函數(shù)計算出uid,即uid=f(uname),再由uid路由到對應(yīng)庫;

如何設(shè)計單向函數(shù),通過uname來生成uid?

最簡單的單向函數(shù)是MD5:

  • 如果uid是128bit的,uid=MD5(uname);
  • 如果uid是64bit的,uid=MD5(uname)/2;

畫外音,128bit折半的方法有很多,例如:取前一半,或者取后一半,或者前一半與后一半異或。

其潛在不足是:當(dāng)用戶量非常巨大的時候,有uid沖突的風(fēng)險,需要一個補丁機制,來解決沖突問題。

方案五:基因法。

其設(shè)計思路是:不用uname生成uid,從uname抽取“基因”,融入uid中。

什么是uname基因,如何將基因融入uid?

假設(shè)分8庫,采用uid%8路由,其潛臺詞是,uid的最后3個bit決定這條數(shù)據(jù)落在哪個庫上,這3個bit就是所謂的“基因”。

其具體步驟是:

  • 在用戶注冊時,設(shè)計單向函數(shù)uname生成3bit基因,uname_gene=f(uname),如上圖粉色部分;
  • 同時,使用ID生成器生成全局唯一uid的前61bit,如上圖綠色部分;
  • 把前61bit與后3bit基因組合,生成64bit的最終uid,并用最終uid水平切分數(shù)據(jù);
  • 用uname來訪問時,先通過單向函數(shù)由uname再次復(fù)原3bit基因,uname_gene=f(uname),通過uname_gene%8直接路由到庫;

如何設(shè)計單向函數(shù),通過uname來生成基因?

uname_gene=MD5(uname)再取最后3bit。

會不會導(dǎo)致數(shù)據(jù)分布不均勻?

不會,MD5具備完全隨機性。

其潛在不足是:

  • uid一旦生成就無法更改,需要提前規(guī)劃基因位數(shù),例如:10年內(nèi)最多分256庫,提前預(yù)留8bit基因位;
  • 登錄名不允許修改(該前提一般都滿足);
  • uid確定以后,登錄名以外的郵箱登陸,手機號登陸不能復(fù)用;

畫外音:郵箱登陸,手機號登陸可使用通用方案2與方案3。

稍作總結(jié)

使用uid分庫,uname查詢有五種方法:

  • 掃全庫法:遍歷所有庫;
  • 索引表法:數(shù)據(jù)庫中記錄uname到uid的映射關(guān)系;
  • 緩存映射法:緩存中記錄uname到uid的映射關(guān)系;
  • uname單向函數(shù)生成uid:小概率沖突;
  • 基因法:uname單向函數(shù)生成基因融入uid,需要提前規(guī)劃基因位數(shù);

知其然,知其所以然。

思路比結(jié)論更重要。

責(zé)任編輯:趙寧寧 來源: 架構(gòu)師之路
相關(guān)推薦

2021-06-04 10:56:32

分庫數(shù)據(jù)庫查詢

2017-04-17 07:00:54

uiduname數(shù)據(jù)庫

2022-01-10 06:52:59

查詢MySQL字段

2020-08-06 13:19:10

IBM多云管理

2020-12-03 14:40:10

云管理

2022-12-07 11:24:51

首席信息官IT

2011-03-15 14:16:27

2009-07-03 17:48:24

JSP頁面跳轉(zhuǎn)

2025-04-25 08:55:00

Pod運維

2022-12-29 08:46:15

IT采購投資

2025-04-14 08:30:00

架構(gòu)分庫查詢

2022-11-23 13:46:02

云支出云計算

2020-04-02 10:45:48

多云云計算云平臺

2015-09-10 09:30:54

Java多線程同步

2011-04-21 10:08:34

2023-08-11 11:29:48

物聯(lián)網(wǎng)制造業(yè)

2021-11-02 07:54:40

List分片Java

2010-11-09 11:11:12

SQL Server查

2019-12-12 20:03:08

PythonC語言編程語言

2022-02-28 14:12:07

人工智能AI
點贊
收藏

51CTO技術(shù)棧公眾號