Redis实战(四):redis的消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU
啤酒理論
Buffer機(jī)制,減少沒必要的來回調(diào)用
前置知識
只要和redis建立了連接,發(fā)送字符串,就能交互
管道
發(fā)布 / 訂閱
help @pubsub
發(fā)送者
訂閱者
PSUBSCRIBE pattern [pattern ...]summary: Listen for messages published to channels matching the given patternssince: 2.0.0PUBLISH channel messagesummary: Post a message to a channelsince: 2.0.0PUBSUB subcommand [argument [argument ...]]summary: Inspect the state of the Pub/Sub subsystemsince: 2.8.0PUNSUBSCRIBE [pattern [pattern ...]]summary: Stop listening for messages posted to channels matching the given patternssince: 2.0.0SUBSCRIBE channel [channel ...]summary: Listen for messages published to the given channelssince: 2.0.0UNSUBSCRIBE [channel [channel ...]]summary: Stop listening for messages posted to the given channelssince: 2.0.0聊天室架構(gòu)模型
- 每個人能夠收到實時消息
- 上滑加載最近3天消息
- 再上滑加載歷史消息,所有消息都應(yīng)該被存在數(shù)據(jù)庫中
可以啟動不同的redis去接收訂閱的消息,有的用來推送給用戶,有的用來發(fā)給kafka,繼而存儲到數(shù)據(jù)庫中
Redis事務(wù)
假設(shè)是client1綠色先開啟的事務(wù)multi,client2黃色后開啟的事務(wù),
并且假設(shè)client2黃色的exec先到達(dá),client1綠色的exec后到達(dá):
是先發(fā)送exec的客戶端先執(zhí)行命令
在事務(wù)中 watch 監(jiān)控某個 key,如果發(fā)生改變,就不執(zhí)行事務(wù)
為什么 Redis 不支持回滾(roll back)
如果你有使用關(guān)系式數(shù)據(jù)庫的經(jīng)驗, 那么 “Redis 在事務(wù)失敗時不進(jìn)行回滾,而是繼續(xù)執(zhí)行余下的命令”這種做法可能會讓你覺得有點奇怪。
以下是這種做法的優(yōu)點:
- Redis 命令只會因為錯誤的語法而失敗(并且這些問題不能在入隊時發(fā)現(xiàn)),或是命令用在了錯誤類型的鍵上面:這也就是說,從實用性的角度來說,失敗的命令是由編程錯誤造成的,而這些錯誤應(yīng)該在開發(fā)的過程中被發(fā)現(xiàn),而不應(yīng)該出現(xiàn)在生產(chǎn)環(huán)境中。
- 因為不需要對回滾進(jìn)行支持,所以 Redis 的內(nèi)部可以保持簡單且快速。
有種觀點認(rèn)為 Redis 處理事務(wù)的做法會產(chǎn)生 bug , 然而需要注意的是, 在通常情況下, 回滾并不能解決編程錯誤帶來的問題。 舉個例子, 如果你本來想通過 INCR 命令將鍵的值加上 1 , 卻不小心加上了 2 , 又或者對錯誤類型的鍵執(zhí)行了 INCR , 回滾是沒有辦法處理這些情況的。
RedisBloom模塊 - 布隆過濾器
解決緩存穿透問題
布隆過濾器:用小空間解決大量數(shù)據(jù)匹配的問題
三種架構(gòu)情況:
更新完數(shù)據(jù)庫,需要同步刷緩存 -> 雙寫問題
緩存淘汰策略
下節(jié)課預(yù)習(xí)
緩存常見問題:
- 擊穿
- 雪崩
- 穿透
- 一致性
總結(jié)
以上是生活随笔為你收集整理的Redis实战(四):redis的消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程与高并发(五):强软弱虚四种引用以
- 下一篇: MySQL调优(四):MySQL索引优化