Kv for Redis

Redis 是一個高性能的key-value數(shù)據(jù)庫。主要用Redis實現(xiàn)緩存數(shù)據(jù)的存儲专缠,可以設置過期時間鹅龄。對于一些高頻讀寫、臨時存儲的數(shù)據(jù)特別適合漆诽,并非 MySQL 的一種可靠性存儲侮攀。

少量數(shù)據(jù)存儲,高速讀寫訪問厢拭。此類產(chǎn)品通過數(shù)據(jù)全部in-momery 的方式來保證高速訪問兰英,同時提供數(shù)據(jù)落地的功能,實際這正是Redis最主要的適用場景供鸠。

使用場景:

取最新N個數(shù)據(jù)的操作

比如典型的取你網(wǎng)站的最新文章,我們可以將最新的5000條評論的ID放在Redis的List集合中,并將超出集合部分從數(shù)據(jù)庫獲取畦贸。

排行榜應用,取TOP N操作

這個需求與上面需求的不同之處在于,前面操作以時間為權重,這個是以某個條件為權重,比如按頂?shù)拇螖?shù)排序, 這時候就需要我們的sorted set出馬了,將你要排序的值設置成sorted set的score, 將具體的數(shù)據(jù)設置成相應的value,每次只需要執(zhí)行一條ZADD命令即可。

需要精準設定過期時間的應用

比如你可以把上面說到的sorted set的score值設置成過期時間的時間戳,那么就可以簡單地通過過期時間排序, 定時清除過期數(shù)據(jù)了,不僅是清除Redis中的過期數(shù)據(jù),你完全可以把Redis里這個過期時間當成是對數(shù)據(jù)庫中數(shù)據(jù)的索引, 用Redis來找出哪些數(shù)據(jù)需要過期刪除,然后再精準地從數(shù)據(jù)庫中刪除相應的記錄楞捂。

計數(shù)器應用

Redis的命令都是原子性的,你可以輕松地利用INCR,DECR命令來構建計數(shù)器系統(tǒng)薄坏。

實現(xiàn)點贊、簽到寨闹、like等功能

uniq操作,獲取某段時間所有數(shù)據(jù)排重值

這個使用Redis的set數(shù)據(jù)結構最合適了,只需要不斷地將數(shù)據(jù)往set中扔就行了,set意為集合,所以會自動排重胶坠。

構建隊列系統(tǒng) 「解耦」

使用list可以構建隊列系統(tǒng),使用sorted set甚至可以構建有優(yōu)先級的隊列系統(tǒng)。

數(shù)據(jù)一致性緩存場景

Redis的Transactions提供的并不是嚴格的ACID的事務(比如一串用EXEC提交執(zhí)行的命令繁堡,在執(zhí)行中服務器宕機沈善,那么會有一部分命令執(zhí)行了,剩下的沒執(zhí)行)帖蔓,但是這個Transactions還是提供了基本的命令打包執(zhí)行的功能(在服務器不出問題的情況下矮瘟,可以保證一連串的命令是順序在一起執(zhí)行的,中間有會有其它客戶端命令插進來執(zhí)行)塑娇。Redis還提供了一個Watch功能澈侠,你可以對一個key進行 Watch,然后再執(zhí)行Transactions埋酬,在這過程中哨啃,如果這個Watched的值進行了修改,那么這個Transactions會發(fā)現(xiàn)并拒絕執(zhí)行写妥。

緩存

最常用,性能優(yōu)于Memcached(被libevent拖慢),數(shù)據(jù)結構更多樣化拳球。

緩存雪崩和緩存穿透

緩存雪崩是什么?

假設有如下一個系統(tǒng)珍特,高峰期請求為5000次/秒祝峻,4000次走了緩存,只有1000次落到了數(shù)據(jù)庫上,數(shù)據(jù)庫每秒1000的并發(fā)是一個正常的指標莱找,完全可以正常工作酬姆,但如果緩存宕機了,每秒5000次的請求會全部落到數(shù)據(jù)庫上奥溺,數(shù)據(jù)庫立馬就死掉了辞色,因為數(shù)據(jù)庫一秒最多抗2000個請求,如果DBA重啟數(shù)據(jù)庫浮定,立馬又會被新的請求打死了相满,這就是緩存雪崩¤胱洌「程序設計需要考慮后端 MySQL & Redis 配合下能峰值抵抗多少的問題」

緩存穿透是什么立美?

假如客戶端每秒發(fā)送5000個請求,其中4000個為黑客的惡意攻擊闸盔,即在數(shù)據(jù)庫中也查不到悯辙。總而言之迎吵,緩存雪崩就是緩存失效躲撰,請求全部全部打到數(shù)據(jù)庫,數(shù)據(jù)庫瞬間被打死击费。緩存穿透就是查詢了一個一定不存在的數(shù)據(jù)拢蛋,并且從存儲層查不到的數(shù)據(jù)沒有寫入緩存,這將導致這個不存在的數(shù)據(jù)每次請求都要到存儲層去查詢蔫巩,失去了緩存的意義谆棱。「程序設計時需要考慮冷熱數(shù)據(jù)的問題」

合理使用

合理使用集合類

使用 sortedset圆仔、set垃瞧、list、hash 等集合類的 O(N) 操作時要評估當前元素個數(shù)的規(guī)模以及將來的增長規(guī)模坪郭,對于短期就可能變?yōu)榇蠹系?key个从,要預估 O(N) 操作的元素數(shù)量,避免全量操作歪沃,可以使用 HSCAN嗦锐、SSCAN、ZSCAN 進行漸進操作沪曙。集合元素數(shù)量過大在使用過程中會影響 redis 的實際性能奕污,元素個數(shù)建議盡量不要超過 5000,元素數(shù)量過大可考慮拆分成多個 key 進行處理液走。

合理設置過期時間

如果 key 沒有設置超時時間碳默,會導致一直占用內(nèi)存贾陷。對于可以預估使用生命周期的 key 應當設置合理的過期時間或在最后一次操作時進行清理,避免垃圾數(shù)據(jù)殘留 redis嘱根。

合理利用批操作命令

在 redis 使用過程中昵宇,要正視網(wǎng)絡往返時間,合理利用批量操作命令儿子,減少通訊時延和 redis 訪問頻次。redis 為了減少大量小數(shù)據(jù) CMD 操作的網(wǎng)絡通訊時間開銷 RTT (Round Trip Time)砸喻,支持多種批操作技術:MSET/HMSET 等都支持一次輸入多個 key柔逼,LPUSH/RPUSH/SADD 等命令都支持一次輸入多個 value, 也要注意每次操作數(shù)量不要過多, 建議控制在 500 個以內(nèi);PipeLining 模式 可以一次輸入多個指令割岛。redis 提供一個 pipeline 的管道操作模式愉适,將多個指令匯總到隊列中批量執(zhí)行,可以減少 tcp 交互產(chǎn)生的時間癣漆,一般情況下能夠有 10%~30% 不等的性能提升维咸;更快的是 Lua Script 模式,還可以包含邏輯惠爽。redis 內(nèi)嵌了 lua 解析器癌蓖,可以執(zhí)行 lua 腳本,腳本可以通過 eval 等命令直接執(zhí)行婚肆,也可以使用 script load 等方式上傳到服務器端的 script cache 中重復使用租副。「當然最好是別用 Lua较性,類似 MySQL 老用存儲過程也不合適」

減少不必要的請求

redis 的所有請求對于不存在的 key 都會有輸出返回用僧,合理利用返回值處理,避免不必要的請求赞咙,提升業(yè)務吞吐量责循。

避免 value 設置過大

String 類型盡量控制在 5KB 以內(nèi)。雖然 redis 對單個 key 可以緩存的對象長度能夠支持的很大攀操,但是實際使用場合一定要合理拆分過大的緩存項院仿,1k 基本是 redis 性能的一個拐點。當緩存項超過 10k崔赌、100k意蛀、1m 性能下降會特別明顯。關于吞吐量與數(shù)據(jù)大小的關系可見下面官方網(wǎng)站提供的示意圖健芭。在局域網(wǎng)環(huán)境下只要傳輸?shù)陌怀^一個 MTU(以太網(wǎng)下大約 1500 bytes)县钥,那么對于 10、100慈迈、1000 bytes 不同包大小的處理吞吐能力實際結果差不多若贮。



借鑒了大量文檔之后濃縮的一些日常體會省有,希望能給到大家?guī)椭?/p>

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谴麦,隨后出現(xiàn)的幾起案子蠢沿,更是在濱河造成了極大的恐慌,老刑警劉巖匾效,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舷蟀,死亡現(xiàn)場離奇詭異,居然都是意外死亡面哼,警方通過查閱死者的電腦和手機野宜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魔策,“玉大人匈子,你說我怎么就攤上這事〈程唬” “怎么了虎敦?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長政敢。 經(jīng)常有香客問我其徙,道長,這世上最難降的妖魔是什么堕仔? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任擂橘,我火速辦了婚禮,結果婚禮上摩骨,老公的妹妹穿的比我還像新娘通贞。我一直安慰自己,他們只是感情好恼五,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布昌罩。 她就那樣靜靜地躺著,像睡著了一般灾馒。 火紅的嫁衣襯著肌膚如雪茎用。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天睬罗,我揣著相機與錄音轨功,去河邊找鬼。 笑死容达,一個胖子當著我的面吹牛古涧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播花盐,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼羡滑,長吁一口氣:“原來是場噩夢啊……” “哼菇爪!你這毒婦竟也來了?” 一聲冷哼從身側響起柒昏,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凳宙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后职祷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氏涩,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年有梆,在試婚紗的時候發(fā)現(xiàn)自己被綠了削葱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡淳梦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出昔字,到底是詐尸還是另有隱情爆袍,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布作郭,位于F島的核電站陨囊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏夹攒。R本人自食惡果不足惜蜘醋,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咏尝。 院中可真熱鬧压语,春花似錦、人聲如沸编检。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽允懂。三九已至厕怜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蕾总,已是汗流浹背粥航。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留生百,地道東北人递雀。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像置侍,于是被迫代替她去往敵國和親映之。 傳聞我的和親對象是個殘疾皇子拦焚,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355