使用者登入,儲存30天的免登,只允許兩個裝置登入,如果有第三個裝置登入,踢掉第乙個。改密碼的時候,所有裝置需要下線。這個邏輯怎麼實現呢?
使用 redis 儲存使用者 ,登入的裝置實現,利用 zset。
儲存結構如下:
每個使用者乙個 zset(假設就是以使用者 id 作為 zset 的 key),裡面的 key 為裝置 id,value 為登入時間戳。
當使用者登入時,使用 lua 指令碼(防止併發導致登入裝置多於 2 個)檢查裝置:
zscore 判斷裝置是否存在以及登入時間
如果存在:
zadd就更新score為當前時間戳
如果不存在:
zcard 使用者id 獲取當前使用者有多少裝置
如果裝置數量 >= 2 則移除除了最後乙個的其他裝置(可以通過zrange獲取最後乙個key,zscore獲取其分數之後zremrangebyscore刪除小於這個分數的所有key)
zadd設定裝置id為key,當前時間戳為score
設定zset過期時間為30天,減少30天內沒有裝置登入時檢查登入態的判斷消耗
當使用者請求需要登入態後的 api,檢查登入態時:
zscore 判斷裝置是否存在以及登入時間
如果裝置存在存在並且登入時間與當前時間間隔小於30天,則有效。
否則,登入態失效,需要重新登入
修改密碼,所有裝置下線:
刪除這個zset
每日一刷,輕鬆提公升技術,斬獲各種offer: 每日一面 關於通訊協議
關於http協議參考博文 http協議詳解 那麼get和post與資料如何傳遞到底有沒有關係?get和post是由http協議定義的。在http協議中,method和data url,body,header 是正交的兩個概念,也就是說,使用哪個method與應用層的資料如何傳輸是沒有相互關係的。ht...
每日一面 關於推理題
乙個5公升的桶和乙個3公升的桶,如何得到一桶4公升的水?數字移位 題目是這樣的 乙個n位數,個位數是6,將6移動到最前面 首位 然後形成乙個新的n位數,新的n位數為舊的n位數的4倍,問最小的n位數是多少?先給一種逆推法 個位數是6,新的n位數為舊的4倍,那麼舊的n位數肯定是 46 x未知,x有幾位待...
每日一面 關於海量資料處理
海量資料處理 有1億個浮點數,找出其中最大的10000個。類似的還有有1萬個浮點數,找出其中最大的100個,然後倒序處理。二者不同之處在於資料量的量級不同,這個牽扯到伺服器記憶體和你所採取的策略。簡單暴力的快速排序 第一種方法是將資料全部排序,然後在排序後的集合中進行查詢,最快的排序演算法的時間複雜...