基於redis實現分布式Session


學習到好的知識還是需要記錄下來的。
開發環境 asp.net mvc4,iis。asp.net 自帶的session機制存在諸多不好的地方。先只要列出幾點。
  1. asp.net mvc 默認的session模式mode為InProc。很多向我這樣的菜鳥是沒有意識去修改它的。這模式下的話是session的保存的東西是存儲在服務器內存的。而服務器的資源是有限的,當用戶訪問量大的時候,對服務器的內存壓力會比極大,很可能會導致內存溢出。
  2. Session 支持其它模式。mode="SQLServer",mode="StateServer".這兩種模式下,會比默認的方式減低了服務壓力,但在每次請求時,不管你用不用session,都會為你准備好,這其實是很浪費時間的。
  3. 如果你沒有關閉session,SessionStateModule就一直在工作,會對每個請求執行一系列的調用,浪費資源。
  4. 當iis或服務器重啟,session會丟失。為防止內存溢出,服務器會長時間把沒有活躍的session從內存刪除。這在用戶體驗的角度來說,是非常不好的。而且session產出之后,需要服務器一直來維護(比如過期,從內存中刪掉),這也是需要消耗服務器資源的。本身windows服務器的成本就不低了。這么耗着,是挺浪費的。
  5. 不能保證過期時間。session默認設置過期時間為20分鍾。但我在實際的應用中經常會出現不到20分鍾就不能使用的狀況。session里面存的容量太大導致的。
  6. 不能跨服務器訪問。session是存在服務器內存的。不能為其他服務器所訪問。對部署分布式系統是非常不利的。
為了解決以上的問題,我現在的解決方案是:redis+cookie。首先說明一下為什么選擇這么做的原因。
 
      redis是一個key-value存儲系統。
  • 操作非常的方便,容易上手。跟它同類型的有memcached。但服務器斷電后數據並不會丟失,這是redis好的一個點。
  • 其次,redis支持分布式拓展,且方便。關於兩者比較,這里不做細說。
cookie的話,主流的瀏覽器都支持的了。可能有人會說會有人會禁用cookie,這個只能提示用戶開啟來解決了。大部分的人還是不會關閉的喔。
 
業務如下:保存用戶的登錄狀態,設置過期時間為7天。
user的數據結構
public class user{
    public string userid{get;set;}
    public string username{get;set;}
    public string gender{get;set;}
    public string avatar{get;set;}
    public int age{get;set;}
}
該將什么數據保存在cookie中呢。這個時候是需要認真看看cookie的本意了。cookie,小餅干。cookie是瀏覽器專用,用來記錄保存數據的工具。保存在cookie的文件不能過大。好像是每個網站最多3M吧,要省着點花。哈哈。。。。
 
我選擇把userid的數據保存在cookie中,為什么呢。首先userid的來源是數據庫主鍵,是唯一。二,userid也無實際的意義。竊取了並不會獲得很多的信息。
 
初期准備
  1. userid需要進行可逆加密。原因:雖說userid被選擇來暴露的,但還是得保護一下咯。為什么是可逆加密呢。這個數據是需要使用的,當然是需要可逆的。我在哪里使用到呢。這個userid與redis的key有相關。
  2. 既然說不需要使用內置session了。那就關閉它。要不然就這樣讓它在那里耗着服務器資源是太好了。怎么關閉呢。全局關閉session的方法:在web.config的<system.web></system.web>中加入 <sessionState mode="Off"></sessionState>。這就成功關閉咯。哈哈哈。。。
  3. 准備好RedisHelper。這主要是對redis相關操作的封裝。還是很容易理解和包裝的。要注意程序池的分配。
總算准備好了。
步驟
  1. 在用戶登錄的時候,把加密后的userid寫入cookie.設置有效期為7天。
  2. 寫入cookie后,把用戶數據寫入redis。redis的可以值為“u”+userid,value為user實體。同時也要設置key-value的有效期為7天。這就完成了基本的存儲。
  3. 用戶擁有cookie之后,每次訪問,用戶都會把cookie發送到服務器。這個時候需要對cookie進行實時刷新有效期。這里該怎么做是最好的呢。還要想。特性吧。為什么要這步呢?用戶cookie的有效期是7天,但是用戶在7天內登錄的話,是要刷新cookie的有效期的喔。
  4. 實時刷新redis中"u"+userid鍵值對的有效期。在刷新cookie時,隨后就去刷新redis吧。
  5. 判斷cookie是否過期或有效。先判斷cookie的有效期,其次獲取redis對應的鍵值對。如果redis中查找不到對應的鍵值對,也就是過期的節奏了。
這就寫完了。寫的有點亂。。。。。有空整理好代碼貼上去。
 
最后貼上一些很不錯的與本文相關的文章。感謝他們的分享。愛分享的人與你們同在。
http://www.2cto.com/kf/201205/133998.html 配置Session變量的生命周期

 


免責聲明!

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



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