OpenResty 中的 Redis 使用技巧

前言

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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坟奥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拇厢,更是在濱河造成了極大的恐慌爱谁,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孝偎,死亡現(xiàn)場離奇詭異访敌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)衣盾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門寺旺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人势决,你說我怎么就攤上這事阻塑。” “怎么了果复?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵陈莽,是天一觀的道長。 經(jīng)常有香客問我,道長走搁,這世上最難降的妖魔是什么独柑? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮私植,結(jié)果婚禮上忌栅,老公的妹妹穿的比我還像新娘。我一直安慰自己兵琳,他們只是感情好狂秘,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著躯肌,像睡著了一般者春。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上清女,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天钱烟,我揣著相機(jī)與錄音,去河邊找鬼嫡丙。 笑死拴袭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的曙博。 我是一名探鬼主播拥刻,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼父泳!你這毒婦竟也來了般哼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤惠窄,失蹤者是張志新(化名)和其女友劉穎蒸眠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杆融,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡楞卡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脾歇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒋腮。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖介劫,靈堂內(nèi)的尸體忽然破棺而出徽惋,到底是詐尸還是另有隱情,我是刑警寧澤座韵,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響誉碴,放射性物質(zhì)發(fā)生泄漏宦棺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一黔帕、第九天 我趴在偏房一處隱蔽的房頂上張望代咸。 院中可真熱鬧,春花似錦成黄、人聲如沸呐芥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽思瘟。三九已至,卻和暖如春闻伶,著一層夾襖步出監(jiān)牢的瞬間滨攻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工蓝翰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留光绕,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓畜份,卻偏偏與公主長得像诞帐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子爆雹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容