在代碼角度來(lái)講,無(wú)論是session,還是socket,在nodejs中,均表示為一個(gè)對(duì)象,所以我一直想的是,把session、socket對(duì)象序列化存儲(chǔ)在redis或其它數(shù)據(jù)庫(kù)中,用到對(duì)象時(shí),再將數(shù)據(jù)反序列化成對(duì)象(實(shí)際就是這些對(duì)象持久化后,就不在內(nèi)存里保存這些信息,就能減少內(nèi)存開(kāi)銷(xiāo)),是的,你們沒(méi)看錯(cuò),我真的是這樣想的。
所以在寫(xiě)代碼時(shí),就會(huì)出現(xiàn)問(wèn)題。比如:用socket.io的時(shí)候,嘗試用querystring.stringify(socket)去進(jìn)行序列化,得到的結(jié)果是:
nsp=&server=&adapter=&id=dDLa5kYZNUqIVCSmAAAr&client=&conn=&rooms=&acks=&connected=true&disconnected=false&handshake=&flags=&
很顯然,這個(gè)是可以存儲(chǔ)到redis中的,但是從redis里取出數(shù)據(jù)通過(guò)querystring.parse()反序列,但是顯然不能當(dāng)作socket用(我沒(méi)測(cè)試)。所以到這里,我覺(jué)得持久化不是指這樣的操作。
那么持久化應(yīng)該是什么?
session好說(shuō),nodejs,用的koa-session2庫(kù),session對(duì)對(duì)象就是存儲(chǔ)的一些用戶信息的object,所以直接序列化放redis,用的時(shí)候就反序列化好了。
socket我認(rèn)為序列化的應(yīng)該是socket id這類(lèi)的信息(還有一些用戶),如果需要實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)聊天,就不用在內(nèi)存里額外保存socket id,通過(guò)redis進(jìn)行查詢獲取。不然反序列化整個(gè)對(duì)象,進(jìn)行信息發(fā)送時(shí),從那個(gè)地方獲取tcp連接通道傳送信息呢?