矽谷之路28:如何設計用戶系統(二)
查看完整視頻: http://www.bittiger.io/classes
接著上一次來說,我們已經有了用戶表,那麼如何對這個表進行修改來支持超時自動退出、多設備同時登陸等附加功能呢?
實現這些功能我們首先要了解session的概念,我們可以用在KFC點餐來理解。對於服務員來說,他們不會刻意地去記住誰點了什麼,而是會發給顧客一個號碼牌,顧客憑藉這個號碼牌來取餐,這就是session number。當一個顧客很久沒有來取餐,這個號碼牌就會作廢,所以我們可以給session加上time out來實現超時自動退出。如果一個顧客點了兩次餐,往往會得到兩個session number,同樣,如果用戶用不同的設備登陸,可以給不同的設備分配不同的session number。
所以我們定義了Session類,有sessionID,userID,deviceCode(設備碼,便於數據分析)和timeOut(存儲超時時間)。並在User類里加入了sessionList來存儲一個user對應的session。有了數據類型我們就可以用相應的表進行存儲。
我們已經設計好了用戶表,假設也已經存入了資料庫中,你會不會有點點好奇,如果我們要查找userID=21的用戶,資料庫是怎麼進行查找的呢?
最基本的方法是逐個遍歷,直到找到userID=21的用戶。這種方法的時間複雜度毫無疑問是O(n),如果數據量很大可能無法忍受。所以我們可以通過建索引來降低時間複雜度。
一種方法是建立哈希索引。對userID進行哈希,哈希值的位置存儲指向userID的指針。這樣當我們查找userID=21時,我們對userID進行哈希,發現哈希值為0,就可以在哈希表位置0順著指針找到對應的user,時間複雜度是O(1)。
哈希索引的缺點是它不支持範圍查找,所以還有一種建索引的方法是建立樹狀索引,比如平衡二叉樹,這種方法的時間複雜度是O(logn),範圍查找的時間複雜度是O(logn+k)。一般資料庫里是用b+樹實現的,b+樹的實現原理比較複雜,大家可以觀看bittiger視頻講解。
本文整理作者:Mengying Tian, 查看完整視頻: http://www.bittiger.io/classes
更多精彩內容, 請掃描下面二維碼,關注微信公眾賬號「論碼農的自我修養」
推薦閱讀: