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>