redis介紹及保持session會話

█Redis介紹web

●redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現master-slave(主從)同步。redis

●redis是一個高性能的key-value數據庫。redis的出現,很大程度補償了memcached這類key-value存儲的不足,在部分場合能夠對關係數據庫起到很好的補充做用。它提供了Java,C/C++,C#,PHP。JavaScript,Perl,Object-C,Python,Ruby等客戶端,使用很方便。數據庫

●簡單比較Redis與Memcached的區別:緩存

一、Redis不只僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。服務器

二、Redis支持數據的備份,即master-slave模式的數據備份。網絡

三、Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用。session

●在redis中,並非全部的數據都一直存儲在內存中,這是和Memcached相比一個最大的區別。Redis只會緩存全部的key信息,若是Redis發現內存的使用量超過了某一個閥值,將觸發swap的操做,Redis根據「swappability = age*log(size_in_memory)」計算出哪些key對應的value須要的swap到磁盤,而後將這些key對應的value持久化的磁盤中,同時在內存中清除。這種特性使得Redis能夠保持超過其餘機器自己內存大小的數據。固然,機器自己的內存要可以保持全部的key,由於這些數據是不會進行swap操做的數據結構

●當從Redis中讀取數據的時候,若是讀取的key對應的value不在內存中,那麼Redis就須要從swap文件中加載相應數據,而後再返回給請求方併發

█如何保持session會話app

●目前,爲了方便web能適應大規模的訪問,須要實現應用的集羣部署。集羣最有效的方案就是負載均衡,而實現負載均衡用戶每個請求都有可能被分配到不固定的服務器上,這樣咱們首先要解決session的統一來保證不管用戶的請求被轉發到那個服務器上都能保證用戶的正常使用,即須要實現session的共享機制。

●在集羣系統下實現session統一有如下幾種方案:

一、請求精肯定位:sessionsticky,例如基於訪問ip的hash策略,即當前用戶的請求都集中定位到一臺服務器中,這樣單臺服務器保存了用戶的session登陸信息,若是宕機,則等同於單點故障,會丟失,會話不復制。

二、session複製共享:sessionreplication,如Tomcat自帶session共享,主要是指集羣環境下,多臺應用服務器之間同步session,使session保持一致,對外透明。若是其中一臺服務器發生故障,根據負載均衡的原理,調度器會遍歷尋找可用節點,分發請求,因爲session已同步,故能保證用戶的session信息不會丟失,會話複製。

★上述方案的不足之處:

①必須在同一種中間件完成(如:Tomcat-Tomcat之間)

②session複製帶來的性能損失會快速增長,特別是當session中保存了較大的對象,並且對象變化較快時,性能降低更加顯著,會消耗系統性能。這種特性使得web應用的水平擴展受到了限制。

③session內容經過廣播同步給成員,會形成網絡流量瓶頸,即使是內網瓶頸。在大併發下表現並很差

三、基於cache DB緩存的session共享

即便用cache DB存取session信息,應用服務器接受請求將session信息保存在cache DB中,當應用服務器發生故障時,調度器會遍歷尋找可用節點,分發請求,當應用服務器發現session不在本機內存時,則去cache DB中查找,若是找到則複製到本機,這樣實現session共享和高可用

相關文章
相關標籤/搜索