每日一面 限制使用者裝置

2021-10-14 23:41:43 字數 908 閱讀 4685

使用者登入,儲存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個,然後倒序處理。二者不同之處在於資料量的量級不同,這個牽扯到伺服器記憶體和你所採取的策略。簡單暴力的快速排序 第一種方法是將資料全部排序,然後在排序後的集合中進行查詢,最快的排序演算法的時間複雜...