背景:前端
最近在作B端系統的帳戶系統,數據量大概在2億左右,表設計以下,其中分了8張表,其中分了帳戶信息主表,帳戶綁定手機表,帳戶綁定郵箱表,帳戶綁定c端帳號表,帳號綁定用戶名錶,以及帳戶的擴展信息表,其中以上都是分了8片,其中分片字段以下:mysql
表 | 分片字段 |
帳戶信息主表 | uid |
帳戶綁定手機表 | 手機號 |
帳戶綁定郵箱表 | 郵箱 |
帳號綁定c端帳號表 | c端帳號uid |
帳號綁定用戶名錶 | 用戶名 |
帳戶我的擴展信息表 | uid |
設計:redis
1.其中手機號時國家碼和手機號是分開的算法
帳戶信息主表包括帳戶的企業系統等標識,帳戶名,密碼,帳戶狀態,密碼標識(用於首次註冊是否須要強制改密碼的標識),用戶綁定信息的jsonsql
帳戶綁定手機號表,帳戶綁定郵箱表,帳戶綁定用戶名錶 ,這三張表是爲了登陸,可經過手機,郵箱,用戶名登陸,獲取uidjson
帳戶我的擴展信息表,包含用戶的手機號,郵箱,性別,暱稱,頭像,微信號,身份證號,身份證有效期等信息安全
手機分紅三種,綁定手機,安全手機,擴展手機。(安全手機用於註冊,重置密碼,一個用戶可對應多個安全手機,相似於iphone的官網)微信
2.其中uid的生成:cookie
使用mysql的主鍵生成策略加上前綴來標識,單獨的建張表用於uid生成,由於數據量很大,就不必都新增,都是先刪除後新增,添加事務session
3.服務分紅三塊,註冊一個服務,登陸一個服務,用戶session是一個服務,帳戶管理功能在註冊服務中。包含如下業務場景
註冊及帳戶管理相關接口:
預註冊: 發送註冊連接到手機或者郵箱(生成短連接,連接有過時時間,存在redis中)
註冊:手機、郵箱,帳戶名註冊方式
改綁手機:綁定手機,改綁手機,解綁手機
改綁郵箱:綁定郵箱,改綁郵箱,解綁郵箱
改綁安全手機:新增、刪除(帳戶安全手機表是uid來分區的,並且是多對多的關係,因此不存在改綁邏輯)
改綁C端帳號:綁定,改綁和解綁(前端控制是否須要綁定C端帳號,靈活配置)
修改密碼:登陸狀態下修改(從登錄的cookie中獲取用戶id進行修改)
重置密碼:首次註冊可配置成是否須要重置密碼
發送手機驗證碼:向手機發送驗證碼
驗證手機驗證碼: 根據返回的手機驗證碼獲取到token(該token可換取手機號)
註銷帳戶:刪除帳戶綁定信息,擴展信息,而且存入到註銷備份表中,便於之後查看數據
修改我的擴展信息:包含用戶頭像暱稱等等我的信息
帶安全手機的註冊:安全手機的方式註冊
根據uid獲取帳戶信息:帳戶信息
手機號查詢用戶信息:
郵箱查詢用戶信息:
uid查詢用戶擴展信息:
登陸相關接口:
帳戶登陸:手機驗證碼登陸,郵箱驗證碼登陸,密碼登陸,返回token
登陸:根據返回的token進行登陸
校驗帳戶密碼:密碼校驗
帳戶session相關:
建立session:session和uid直接關係
獲取session:獲取session
獲取session列表:
登出session:登出的清除session
4.在對接不一樣系統的時候,作到不一樣系統之間的數據隔離,所以在每一個分表中添加對應的系統id標識,作到好比帳戶名是區分系統的,手機號也是區分系統的,郵箱也是區分系統的,這樣保證了不一樣系統對接進來的時候,就不會出現帳戶名重複的狀況,也符合實際狀況(不一樣系統存在帳戶名重複的帳戶狀況)。
5.帳戶名大小寫問題:默認mysql是不區分大小寫的,用的是mysql 5.6版本的
6.涉及到遷移其餘帳戶到該帳戶系統時,如遇到密碼算法不一樣的,可添加新的密碼存儲表,將密碼算法轉換成本身的密碼算法,作法是登陸到本系統時,校驗老密碼算法,若是知足,則去用新的加密算法加密密碼存儲到新的帳戶系統密碼中便可
7.帳戶系統導入時,可能會遇到各類問題,好比數據不一樣步(密碼不一樣步,更新了密碼沒有及時兩邊帳戶系統都更新),清理帳戶數據的job也頗有必要,根據時間段和具體的系統id來清理帳戶數據。