對(duì)于java實(shí)現(xiàn)序列化的重要性,在單機(jī)程序內(nèi)是不太容易被重視的,在本地調(diào)試中,tomacat自動(dòng)為為序列化的程序?qū)崿F(xiàn)了序列化,而且bean(用來(lái)實(shí)現(xiàn)緩存的java程序)太小,不會(huì)出現(xiàn)什么問(wèn)題。
但是一旦部署到云端,麻煩就出現(xiàn)了,就會(huì)發(fā)現(xiàn)session為什么存不進(jìn)值呢?不久前我在新浪云云端部署session就出現(xiàn)了未能取不到值的問(wèn)題。
針對(duì)新浪云服務(wù)器,session的信息使用的是分布式Memcache存儲(chǔ)。
而Memcache存儲(chǔ)呢?
不少想構(gòu)建大負(fù)載的網(wǎng)站都采取Memcache來(lái)分擔(dān)數(shù)據(jù)庫(kù)的壓力。
Memcache首先在服務(wù)器端的內(nèi)存中開(kāi)辟一個(gè)空間,然后建立一個(gè)hash表。
memcache 以守護(hù)程序的形式運(yùn)行在服務(wù)器端(一個(gè)或者多個(gè)服務(wù)器),隨時(shí)接受來(lái)自客戶端的連接操作,然后進(jìn)行存取數(shù)據(jù),Memcache是一款nosql內(nèi)存數(shù)據(jù)庫(kù)。采用的是鍵值存儲(chǔ),每個(gè)客戶端存入的對(duì)象都有一個(gè)唯一的key。但是對(duì)象是沒(méi)辦法持久化的,跟memcache很相似的redis是可以實(shí)現(xiàn)持久化到硬盤的。然后把客戶端需要緩存的數(shù)據(jù)以key-value的形式保存在服務(wù)器的內(nèi)存中的,value值存入key值hash轉(zhuǎn)化后的對(duì)應(yīng)的某個(gè)服務(wù)器上。取值的時(shí)候通過(guò)同樣的轉(zhuǎn)化后對(duì)響應(yīng)的服務(wù)器上付出請(qǐng)求即可。
而在序列化在在其中起到什么作用呢?
在memcache緩存到內(nèi)存的時(shí)候,是需要使用到序列化存儲(chǔ)的,因此如果你的bean包中的代碼都沒(méi)實(shí)現(xiàn)序列化接口,在緩存的時(shí)候是不會(huì)被緩存到服務(wù)器內(nèi)存中的,這樣就造成了session并沒(méi)有存值的問(wèn)題發(fā)生。
所以在部署到新浪云的程序存儲(chǔ)到session中的對(duì)象必須實(shí)現(xiàn)序列化接口才可以進(jìn)行session存儲(chǔ)的。