前言
Redis 是非常流行的 NoSQL 數(shù)據(jù)庫之一,因其高效丢郊、穩(wěn)定盔沫、開源医咨、數(shù)據(jù)結(jié)構(gòu)豐富,深受業(yè)內(nèi)欽賴架诞。很幸運(yùn)拟淮,OpenResty 也內(nèi)置了對 Redis 的支持。
在使用OpenResty的過程中谴忧,Redis一直是主力存儲方式之一很泊。雖然OpenResty內(nèi)置了Redis驅(qū)動,但在實際項目中沾谓,對其進(jìn)行進(jìn)一步的封裝撑蚌,能更方便的使用和管理。
在這個過程中搏屑,遇到了很多需要注意的點争涌,也積累了一些技巧和經(jīng)驗,在此總結(jié)一下辣恋。
技巧
單例模式
單例模式是對數(shù)據(jù)連接或數(shù)據(jù)查詢工具類的常用處理模式亮垫。保持?jǐn)?shù)據(jù)連接的單例好處很多,最重要的一點是確保了同一連接的復(fù)用伟骨,不會被重復(fù)打開浪費(fèi)資源饮潦,也方便了連接的管理和狀態(tài)維護(hù)。
在OpenResty中携狭,可以通過把resty.redis:new()產(chǎn)生的對象保存到ngx.ctx中實現(xiàn)單例继蜡。同一請求可以通過ngx.ctx共享已打開的連接。
連接池
很多高級語言逛腿,例如Java稀并、C++,都支持連接池特性单默。在使用完數(shù)據(jù)連接后碘举,將連接歸還給連接池,而不是關(guān)閉連接搁廓。下次連接時引颈,會嘗試復(fù)用連接池中的連接。在高并發(fā)下境蜕,能大大減少建立和斷開連接的次數(shù)蝙场,從而大大的節(jié)省系統(tǒng)資源。
OpenResty的cosocket也支持連接池特性粱年,而基于cosocket的MySQL和Redis驅(qū)動也順理成章的支持了連接池特性售滤。
在OpenResty中,在需要關(guān)閉連接時逼泣,使用client:set_keepalive(TIMEOUT, POOL_SIZE)代替client:close()趴泌,即可激活連接池特性舟舒。
盡量使用 Unix 套接字
OpenResty內(nèi)置的Redis驅(qū)動連接Redis服務(wù)器有兩種方式,一種是使用 IP 和端口嗜憔,一種是使用 Unix 套接字秃励。
如果Redis服務(wù)器和OpenResty服務(wù)在同一物理服務(wù)器上,則應(yīng)優(yōu)先使用 Unix 套接字模式連接吉捶。經(jīng)過實際測試夺鲜,使用 Unix 套接字模式相較于使用 IP 端口模式,速度能夠提升10% ~ 15%呐舔。
數(shù)據(jù)隔離
Redis經(jīng)常被用于數(shù)據(jù)緩存币励,在一個項目中,需要緩存的數(shù)據(jù)種類很多珊拼。幾十種甚至上百種食呻,都是現(xiàn)實中會遇到的情況。
Redis在沒有調(diào)用select命令時澎现,會默認(rèn)將數(shù)據(jù)存儲到dbindex 0的數(shù)據(jù)庫仅胞。顯然這樣對緩存管理是很不利的。
想象一下這樣一個場景剑辫,用戶表因為一些原因需要進(jìn)行批量更新干旧,這時為了緩存的一致性,我們需要清理用戶數(shù)據(jù)緩存妹蔽。如果所有的緩存都混雜在一起椎眯,這顯然是個令人頭疼的任務(wù)。
所以胳岂,請將不同種類的數(shù)據(jù)编整,存儲在不同的dbindex中,這樣不管是查詢還是管理旦万,都會很方便闹击,我們可以毫不費(fèi)力的清除某一類數(shù)據(jù),而不影響其他數(shù)據(jù)成艘。
緩存數(shù)據(jù)和非緩存數(shù)據(jù)更是要隔離開來,這樣才不會在后續(xù)的維護(hù)工作中給自己帶來麻煩贺归。
當(dāng)然淆两,這里需要一個技巧,否則每次查詢之前都需要執(zhí)行一次select命令拂酣,這可不是什么好主意秋冰。我們可以利用Redis中的pipeline特性,將select和我們要執(zhí)行的命令打包在一起一次發(fā)送婶熬。
編碼存儲
默認(rèn)情況下剑勾,Redis只能存儲number埃撵、string、bool虽另,而不能存儲table暂刘,這顯然不符合我們的預(yù)期。
這也很容易解決捂刺,對table進(jìn)行編碼谣拣,變成string自然就可以存儲了。當(dāng)然族展,為了兼容性森缠,我們需要對所有存進(jìn)去和取出來的值進(jìn)行判斷,以確定是不是需要編碼解碼仪缸,這會帶來一些額外的性能消耗贵涵。
但可以直接保存table實在是一件很美妙的事,付出一些額外的代價也是很值得的恰画。
關(guān)于編碼方式独悴,擁有的選擇實在不多,考慮到cjson是內(nèi)置模塊锣尉,且json可讀性較高刻炒,雖然編碼效率并不盡人意,但是我還是選擇了使用json來編碼自沧。
原文地址:http://zivn.me/2016/03/21/redis-tips-in-openresty/