回覆列表
-
1 # 艾卡西亞
-
2 # 網路圈
對於一般中小型應用而言,Session入庫是能滿足專案需要的,一旦應用訪問量上升,那頻繁讀寫資料庫中的Session也容易給系統帶來瓶頸。
Session不是最優方案傳統的Session是儲存在應用伺服器中的,一般是以檔案形式儲存在伺服器硬碟中,這會導致過多Session帶來的磁碟I/O壓力,另一方面也不利於叢集部署。在這種背景下,有人就提出將Session存入資料庫來解決上述問題,事實上的確也解決了問題,但另一個問題也隨之而來,那就是:一旦網站併發過大,也很容易導致資料庫瓶頸,畢竟資料庫查詢也存在耗時的。
建議將Session存入Redis在實際生產環境中,我們基本上都是基於Redis來實現Session會話保持,這樣做的好處有:
易於分散式/叢集部署時實現Session互通;
Redis讀寫效能極高,Session頻繁讀寫也不會帶來效能壓力;
利用Redis Key的過期功能可輕鬆控制Session的過期;
可以將每個使用者的session id記錄下來,這樣就可以查到某個註冊使用者所有session id, 輕鬆實現踢出登陸功能。
你預計的訪問量是多大?脫離這個就開始談壓力,就是耍流氓。
新增一個記憶體資料庫儲存session,可以加快速度,但伺服器宕機session就沒了。
也可以自己寫個中介軟體處理,Django的文件裡寫有怎麼寫中介軟體,學習程式設計文件都不會看的話,那我真沒轍。
做資料庫的ha也是可以的。
使用memcached來儲存session 這種方式跟資料庫類似,不過因為是記憶體存取的,效能自然要比資料庫好多了。但存入memcached中的資料都需要序列化,效率較低; memcached伺服器一死,所有session全丟。
也可以terracotta來儲存session 跟memcached類似,但是資料不需要序列化,並且是Find-Grained Changes,效能更好。配置對原來的應用完全透明,原有程式幾乎不用做任何修改。而且terracotta本身支援HA