使用Redis共享用戶登錄成功的信息


一、問題

比如CSDN,開源中國等等網站,用戶登錄后不一定什么時候就會把你T了,意思就是不一定哪天在打開網站的時候就讓你重新登錄。這是怎么回事呢?
再比如:如果存到將用戶信息存到Redis了,不清除的話,會一直堆積到Redis,像BATJ等大公司,那種億萬用戶的產品,該怎么辦呢?肯定要清除,什么時候清除呢?

二、解決思路

1、登錄成功后放到Redis,用Redis的String類型,key是token,value是用戶信息的JSON串。在設置個過期時間,然后用戶每次請求一次就更新過期時間。貌似很完美。問題是:如果真的億級用戶了,那么都將在redis里存儲,尚未過期,這樣redis承受的住嗎?性能會嚴重下降,而且redis可能也會導致崩潰等奇怪現象。

2、登錄成功后放到Redis,用Redis的Hash類型和ZSET類型混合使用。Hash類型存儲用戶信息:login:token:entity;ZSET存儲token和以時間作為分數:recent:token:timestamp;這時候也可以增加用戶最近瀏覽的商品,List存儲:view+token:商品entity(作為大數據分析用)。每次用戶活躍都刷新ZSET的分數。在單獨起一個線程一直輪訓ZSET的個數,若大於我們心中的個數(比如10萬),則進行刪除不活躍的用戶,刪除哪些呢?刪除ZSET里的【0,min(個數-10萬,100)】,因為ZSET是按照分數升序排序的,所以從0-N去刪除(刪除ZSET和Hash),貌似復雜了,但是能很好的解決問題。但是存在另一個新的問題?就是你線程在進行清除工作的同時,用戶操作了,這時候豈不是需要讓他重新登錄一次?這個問題后面在解決。



作者:編程界的小學生
鏈接:https://www.jianshu.com/p/168b94cf353b
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM