10個Redis使用技巧

前言:

Redis 在當前的技術(shù)社區(qū)里是非常熱門的。從來自 Antirez 一個小小的個人項目到成為內(nèi)存數(shù)據(jù)存儲行業(yè)的標準璧榄,Redis已經(jīng)走過了很長的一段路。

隨之而來的一系列最佳實踐,使得大多數(shù)人可以正確地使用 Redis。

Linux后臺開發(fā)Redis值得我們研究技術(shù)點

Redis源碼

緩存Redis

Redis集群

文尾推薦Redis的視頻教程尔苦,需要的關(guān)注 。私信:1? 領(lǐng)取

下面我們將探索正確使用 Redis 的10個技巧散庶。

1蕉堰、停止使用 KEYS *

Okay,以挑戰(zhàn)這個命令開始這篇文章悲龟,或許并不是一個好的方式,但其確實可能是最重要的一點冰寻。

很多時候當我們關(guān)注一個redis實例的統(tǒng)計數(shù)據(jù)须教,我們會快速地輸入”KEYS *”命令,這樣key的信息會很明顯地展示出來斩芭。平心而論轻腺,從程序化的角度出發(fā)往往傾向于寫出下面這樣的偽代碼:

for key in 'keys *':?

doAllTheThings()

但是當你有1300萬個key時,執(zhí)行速度將會變慢划乖。因為KEYS命令的時間復雜度是O(n)贬养,其中n是要返回的keys的個數(shù),這樣這個命令的復雜度就取決于數(shù)據(jù)庫的大小了琴庵。并且在這個操作執(zhí)行期間误算,其它任何命令在你的實例中都無法執(zhí)行。

作為一個替代命令迷殿,看一下 SCAN 吧儿礼,其允許你以一種更友好的方式來執(zhí)行… SCAN 通過增量迭代的方式來掃描數(shù)據(jù)庫。這一操作基于游標的迭代器來完成的庆寺,因此只要你覺得合適蚊夫,你可以隨時停止或繼續(xù)懦尝。

2壤圃、找出拖慢 Redis 的罪魁禍首

由于 Redis 沒有非常詳細的日志埃唯,要想知道在 Redis 實例內(nèi)部都做了些什么是非常困難的墨叛。幸運的是 Redis 提供了一個下面這樣的命令統(tǒng)計工具:

127.0.0.1:6379> INFO commandstats?

# Commandstats?

cmdstat_get:calls=78,usec=608,usec_per_call=7.79?

cmdstat_setex:calls=5,usec=71,usec_per_call=14.20?

cmdstat_keys:calls=2,usec=42,usec_per_call=21.00?

cmdstat_info:calls=10,usec=1931,usec_per_call=193.10

通過這個工具可以查看所有命令統(tǒng)計的快照漠趁,比如命令執(zhí)行了多少次闯传,執(zhí)行命令所耗費的毫秒數(shù)(每個命令的總時間和平均時間)

只需要簡單地執(zhí)行 CONFIG RESETSTAT 命令就可以重置卤妒,這樣你就可以得到一個全新的統(tǒng)計結(jié)果则披。

3士复、 將 Redis-Benchmark 結(jié)果作為參考,而不要一概而論

Redis 之父 Salvatore 就說過:“通過執(zhí)行GET/SET命令來測試Redis就像在雨天檢測法拉利的雨刷清潔鏡子的效果”便贵。很多時候人們跑到我這里冗荸,他們想知道為什么自己的Redis-Benchmark統(tǒng)計的結(jié)果低于最優(yōu)結(jié)果 。但我們必須要把各種不同的真實情況考慮進來盔粹,例如:

可能受到哪些客戶端運行環(huán)境的限制魂毁?

是同一個版本號嗎席楚?

測試環(huán)境中的表現(xiàn)與應用將要運行的環(huán)境是否一致?

Redis-Benchmark的測試結(jié)果提供了一個保證你的 Redis-Server 不會運行在非正常狀態(tài)下的基準點垮斯,但是你永遠不要把它作為一個真實的“壓力測試”兜蠕。壓力測試需要反應出應用的運行方式熊杨,并且需要一個盡可能的和生產(chǎn)相似的環(huán)境晶府。

4川陆、Hashes 是你的最佳選擇

以一種優(yōu)雅的方式引入 hashes 吧较沪。hashes 將會帶給你一種前所未有的體驗。之前我曾看到過許多類似于下面這樣的key結(jié)構(gòu):

foo:first_name?

foo:last_name?

foo:address

上面的例子中们何,foo 可能是一個用戶的用戶名骡苞,其中的每一項都是一個單獨的 key垂蜗。這就增加了 犯錯的空間,和一些不必要的 key。使用 hash 代替吧烘苹,你會驚奇地發(fā)現(xiàn)竟然只需要一個 key :

127.0.0.1:6379> HSET foo first_name "Joe"?

(integer) 1?

127.0.0.1:6379> HSET foo last_name "Engel"?

(integer) 1?

127.0.0.1:6379> HSET foo address "1 Fanatical Pl"?

(integer) 1?

127.0.0.1:6379> HGETALL foo?

1) "first_name"?

2) "Joe"?

3) "last_name"?

4) "Engel"?

5) "address"?

6) "1 Fanatical Pl"?

127.0.0.1:6379> HGET foo first_name?

"Joe"

5、設(shè)置 key 值的存活時間

無論什么時候镣衡,只要有可能就利用key超時的優(yōu)勢霜定。一個很好的例子就是儲存一些諸如臨時認證key之類的東西廊鸥。

當你去查找一個授權(quán)key時——以O(shè)AUTH為例——通常會得到一個超時時間望浩。這樣在設(shè)置key的時候,設(shè)成同樣的超時時間惰说,Redis就會自動為你清除!而不再需要使用KEYS *來遍歷所有的key了,怎么樣很方便吧典挑?

6您觉、 選擇合適的回收策略

既然談到了清除key這個話題肆糕,那我們就來聊聊回收策略在孝。當 Redis 的實例空間被填滿了之后,將會嘗試回收一部分key。根據(jù)你的使用方式顾彰,我強烈建議使用 volatile-lru 策略——前提是你對key已經(jīng)設(shè)置了超時极阅。

但如果你運行的是一些類似于 cache 的東西,并且沒有對 key 設(shè)置超時機制涨享,可以考慮使用 allkeys-lru 回收機制筋搏。我的建議是先在這里查看一下可行的方案。

7厕隧、如果你的數(shù)據(jù)很重要奔脐,請使用 Try/Except

如果必須確保關(guān)鍵性的數(shù)據(jù)可以被放入到 Redis 的實例中,我強烈建議將其放入 try/except 塊中吁讨。幾乎所有的Redis客戶端采用的都是“發(fā)送即忘”策略髓迎,因此經(jīng)常需要考慮一個 key 是否真正被放到 Redis 數(shù)據(jù)庫中了。至于將 try/expect 放到 Redis 命令中的復雜性并不是本文要講的建丧,你只需要知道這樣做可以確保重要的數(shù)據(jù)放到該放的地方就可以了排龄。

8、不要耗盡一個實例

無論什么時候翎朱,只要有可能就分散多redis實例的工作量橄维。從3.0.0版本開始,Redis就支持集群了拴曲。Redis集群允許你基于key范圍分離出部分包含主/從模式的key争舞。完整的集群背后的“魔法”可以在這里找到。

但如果你是在找教程澈灼,那這里是一個再適合不過的地方了竞川。如果不能選擇集群,考慮一下命名空間吧,然后將你的key分散到多個實例之中流译。關(guān)于怎樣分配數(shù)據(jù)逞怨,在http://redis.io網(wǎng)站上有這篇精彩的評論。

9福澡、內(nèi)核越多越好嗎叠赦?!

當然是錯的革砸。Redis 是一個單線程進程除秀,即使啟用了持久化最多也只會消耗兩個內(nèi)核。除非你計劃在一臺主機上運行多個實例——希望只會是在開發(fā)測試的環(huán)境下算利!——否則的話對于一個 Redis 實例是不需要2個以上內(nèi)核的册踩。

10、高可用

到目前為止 Redis Sentinel 已經(jīng)經(jīng)過了很全面的測試效拭,很多用戶已經(jīng)將其應用到了生產(chǎn)環(huán)境中(包括 ObjectRocket )暂吉。如果你的應用重度依賴于 Redis ,那就需要想出一個高可用方案來保證其不會掉線缎患。

Redis視頻教程知識點推薦

Redis 6.0multithreading的解決方案

Redis使用場景實戰(zhàn)

服務端網(wǎng)絡(luò)處理慕的,Redis到Memcached,再到Nginx

個人簡介 中領(lǐng)取教程挤渔,希望對你學習有幫助

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肮街,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子判导,更是在濱河造成了極大的恐慌嫉父,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眼刃,死亡現(xiàn)場離奇詭異绕辖,居然都是意外死亡,警方通過查閱死者的電腦和手機擂红,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門引镊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人篮条,你說我怎么就攤上這事》宰ィ” “怎么了涉茧?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疹娶。 經(jīng)常有香客問我伴栓,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任钳垮,我火速辦了婚禮惑淳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饺窿。我一直安慰自己歧焦,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布肚医。 她就那樣靜靜地躺著绢馍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肠套。 梳的紋絲不亂的頭發(fā)上舰涌,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音你稚,去河邊找鬼瓷耙。 笑死,一個胖子當著我的面吹牛刁赖,可吹牛的內(nèi)容都是我干的搁痛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乾闰,長吁一口氣:“原來是場噩夢啊……” “哼落追!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涯肩,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤轿钠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后病苗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疗垛,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年硫朦,在試婚紗的時候發(fā)現(xiàn)自己被綠了贷腕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡咬展,死狀恐怖泽裳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情破婆,我是刑警寧澤涮总,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站祷舀,受9級特大地震影響瀑梗,放射性物質(zhì)發(fā)生泄漏烹笔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一抛丽、第九天 我趴在偏房一處隱蔽的房頂上張望谤职。 院中可真熱鬧,春花似錦亿鲜、人聲如沸允蜈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陷寝。三九已至,卻和暖如春其馏,著一層夾襖步出監(jiān)牢的瞬間凤跑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工叛复, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仔引,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓褐奥,卻偏偏與公主長得像咖耘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撬码,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

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