memcache同步session的方法
From :
前面講了如何,那麼在架構中配置好Server群集後,我們肯定會考慮session共享和同步的問題。試想下,同一個IP訪問負載平衡系統中的同一個網頁會被分配到不同的伺服器上,而如果session不同步,那麼對於同一個登入使用者,就會出現一會是登入狀態一會又不是登入狀態的問題。
下面就這個問題給出了三種解決思路,供大家參考:
一、利用資料庫同步session
在做多伺服器session同步時我沒有用這種方法,如果非要用這種方法的話,我想過二種方法:
1、用一個低端電腦建個資料庫專門存放web伺服器的session,或者,把這個專門的資料庫建在檔案伺服器上,使用者訪問web伺服器時,會去這個專門的資料庫check一下session的情況,以達到session同步的目的。
2、這種方法是把存放session的表和其他資料庫表放在一起,如果也做了叢集了話,每個mysql節點都要有這張表,並且這張session表的資料表要實時同步。
說明:用資料庫來同步session,會加大資料庫的負擔,資料庫本來就是容易產生瓶頸的地方,如果把session還放到資料庫裡面,無疑是雪上加霜。上面的二種方法,第一點方法較好,把放session的表獨立開來,減輕了真正資料庫的負擔
二、利用cookie同步session
session是檔案的形勢存放在伺服器端的,cookie是檔案的形勢存在客戶端的,怎麼實現同步呢?方法很簡單,就是把使用者訪問頁面產生的 session放到cookie裡面,就是以cookie為中轉站。你訪問web伺服器A,產生了session把它放到cookie裡面了,你訪問被分配到web伺服器B,這個時候,web伺服器B先判斷伺服器有沒有這個session,如果沒有,在去看看客戶端的cookie裡面有沒有這個 session,如果也沒有,說明session真的不存,如果cookie裡面有,就把cookie裡面的sessoin同步到web伺服器B,這樣就可以實現session的同步了。
說明:這種方法實現起來簡單,方便,也不會加大資料庫的負擔,但是如果客戶端把cookie禁掉了的話,那麼session就無從同步了,這樣會給網站帶來損失;cookie的安全性不高,雖然它已經加了密,但是還是可以偽造的。
三、利用memcache同步session
memcache可以做分散式,如果沒有這功能,他也不能用來做session同步。他可以把web伺服器中的記憶體組合起來,成為一個”記憶體池”,不管是哪個伺服器產生的sessoin都可以放到這個”記憶體池”中,其他的都可以使用。
優點:以這種方式來同步session,不會加大資料庫的負擔,並且安全性比用cookie大大的提高,把session放到記憶體裡面,比從檔案中讀取要快很多。
缺點:memcache把記憶體分成很多種規格的儲存塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用記憶體,會產生記憶體碎片,如果儲存塊不足,還會產生記憶體溢位。
四、總結
上面三種方法都是可行的
第一種方法,最影響系統速度的那種,不推薦使用;
第二種方法,效果不錯,不過安全隱患一樣的存在;
第三種方法,個人覺得第三種方法是最好的,推薦大家使用。
五、web叢集時利用memcache來同步session
覺得用memcache來同步session是最好的,下面是我的設定過程
1、模擬web叢集
我啟動了二個memcached程式,分別模擬二臺伺服器
/usr/local/bin/memcached-d-m1024-c3000-uuenucom-p12000-P./memcached.pid
/usr/local/bin/memcached-d-m1024-c3000-uuenucom-p13000-P./mem.pid
2、修改的配置
vi/usr/local/php/lib/php.ini
session.save_handler=“memcache”
memcache.hash_strategy=“consistent”
session.save_path=“tcp://127.0.0.1:13000?weight=10,tcp://127.0.0.1:12000″
說明:第一行,session的儲存方式是memcache;第二行,memcache的hash演算法是consistent;第三行,session儲存的位置;
3、重啟
檢視phpinfo
session
SessionSupportenabled
Registeredsavehandlersfilesusersqlitememcache
Registeredserializerhandlersphpphp_binary
緊接著下面是
session.save_pathtcp://127.0.0.1:13000,tcp://127.0.0.1:12000
4、做個簡單測試
a)準備檔案session.php
PHP程式碼
- ?php>
- session_start();
- $_SESSION['username']=“abcabc”;echosession_id();
- ?>
b)顯示session內容檔案
PHP程式碼
- ?php>
- $mem=newMemcache;
- $mem->addServer(“127.0.0.1″,12000)ordie(“Couldnotaddserver12000″);
- $mem->addServer(“127.0.0.1″,13000)ordie(“Couldnotaddserver13000″);
- $val=$mem->get(‘qp0mrob2ovcqle3u4lbr4obsa5′);
- //echosession_id();
- echo$val;
- ?>
c)結果是username|s:6:”abcabc”;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29514088/viewspace-1468158/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- memcache連線php以及實現session共享PHPSession
- thinkphp 3.2 redis memcache 呼叫方法PHPRedis
- memcache清除items和expired方法
- simple Terracotta session 同步Session
- PHP實現多伺服器session共享之memcache共享PHP伺服器Session
- httpWebRequest保持session的方法HTTPWebSession
- Windows下的Memcache安裝 linux下的Memcache安裝WindowsLinux
- flask中的session物件方法FlaskSession物件
- Memcache教程 Memcache零基礎教程
- windows環境下memcache配置方法 詳細篇Windows
- Memcache for WindowsWindows
- Windows10系統開機出現啟動項同步主機session的禁止方法WindowsSession
- memcache的最佳實踐
- 安裝PHP的memcachePHP
- ruby訪問memcache[使用memcache-client1.7.0]client
- 同步方法及同步塊
- memcache的執行緒模型執行緒模型
- Memcache基礎
- memcache安裝
- Rails session物件的 as_json方法AISession物件JSON
- 修改Oracle process 和 session 的方法--摘OracleSession
- Java同步方法Java
- 同步等待方法
- 一個Session Bean如何去呼叫另外一個Session Bean裡的方法?SessionBean
- redis和memcache的對比——配置Redis
- memcache telnet支援的命令示例
- MongoDB、Redis 以及 Memcache 的區別MongoDBRedis
- php當中的memcache應用PHP
- 爬蟲 | 處理cookie的基本方法——session爬蟲CookieSession
- Memcache基礎教程
- memcache安裝配置
- 【ITOO】--memcache小結
- 【memcache快取專題(3)】PHP-memcache擴充套件的安裝以及使用快取PHP套件
- 【memcache快取專題(2)】memcache安裝與命令列使用快取命令列
- 掌握C#中非同步魔法:同步方法如何優雅呼叫非同步方法C#非同步
- 使goroutine同步的方法總結Go
- .NET非同步方法呼叫的例子非同步
- node的Connect使用session、cookie的使用方法SessionCookie