<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在測試工作中,涉及到與 redis 互動的場景變的越來越多了。關於redis本身就不作贅述了,網上隨便搜,本人也做過一些整理。
今天只來覆盤一下,在測試過程中與 redis 的二三事兒。其中提到的案例是經過抽象化的,用作輔助說明作用,僅供參考。
注意點:先刪除原 key 再存,還是直接覆蓋原 key?
比如:之前 A 服務每8小時去查詢一次資料庫,更新到快取裡去。後來需求調整,變成當資料庫裡有變動的時候就會傳送MQ訊息給服務 A,然後A就去全量拉取庫裡資料,再更新到快取。
開發小哥實現的是先刪除key再更新,那麼可能會導致這個時間如果有大量的請求進來,就不能命中快取。於是乎建議,當從資料庫拉來資料之後,可以先和redis中原來的key值進行對比,刪除多餘的快取,其他的覆蓋更新。
注意點:考慮key被刪除,或者key丟失後對上游的影響。
比如:服務A 會同步一類資料到 redis,然後發訊息告訴 服務B。B 收到訊息後,拿到 redis 資料去找自己那邊 MongoDB裡的對應 key,做更新操作,若查不到key,就會刪除資料。
此時如果 redis 裡產生了資料丟失,key就不存在了,那麼同步過後,會導致 MongoDB 裡的資料被勿刪。
於是乎這裡建議方案是:redis 那邊涉及要刪除key的話,就更新key的值為空[],這時候 MongoDB 查詢到值為空的key,就去刪除對應資料。
另外,如果redis那邊key 丟失了,MongoDB這邊也別就刪資料了,去呼叫一個實時介面去查詢資料然後更新。
首先回顧一下 redis 中 ttl key指令:
通常,大多數業務用到redis 都會設定過期時間。接下來,瞭解一下 key 過期是如何清理的。
定期清理
Redis會定期主動淘汰一批已過期的key(隨機抽取一批key檢查)。
缺點:可能存在很多KEY已過期,仍未清理。
惰性清理
在獲取某個 key 的時候,redis 會檢查一下這個 key 如果設定了過期時間並且已經過期,就會刪除這個 key,不會返回任何東西。
缺點:如果存在很多未去查詢的過期key,就沒法走到惰性刪除,於是可能會有大量過期的key堆積在記憶體裡,導致記憶體耗盡。
一般來說,業務會惰性和定期清理配合使用。
記憶體淘汰機制
但是,如果定期清理漏掉了很多過期的key,然後你也沒及時去查,也就沒走惰性刪除。此時依舊有可能大量過期的key堆積在記憶體裡,導致記憶體耗盡。
這時候需要記憶體淘汰機制,有如下幾個:
以上可以作個瞭解。
很多時候,redis 只是做一個快取機制,如果redis異常或者未取到資料,是否有實時獲取資料的兜底方案(查介面 or 查庫?),需要考慮。
穿透
使用者想要查詢一個資料,發現redis記憶體資料庫中沒有,也就是說沒有命中快取,也是會向持久層資料庫查詢,發現也沒有,那麼本次查詢失敗。
如果此時,使用者很多,高並行場景下都去查這個資料,由於快取都沒有命中,於是壓力直接打到持久層資料庫那裡,這就是快取穿透。
解決方案可以用布隆過濾器、返回空物件(設定過期時間)。
擊穿
快取擊穿,是指一個key非常熱點,在不停的扛著高並行,如果這個key失效了,在失效的瞬間,持續的並行量就會穿破快取,直接打到持久層資料庫,就像一個防禦牆被鑿開一個洞。
解決方案可以設定熱點資料永不過期、加互斥鎖等。
雪崩
是指在某一個時間段,快取集中過期失效,或者redis宕機了。
解決方案:
關於這3個,之前有過一篇整理:https://www.jb51.net/article/230997.htm
Redis鎖,小心使用不當造成鎖不能釋放,陷入死鎖。
目前常用的2種鎖:
僅在單範例的場景下是安全的。如果不使用setnx+expire+del中間環節斷了仍可能造成死鎖;
如果不用SET Key UnixTimestamp Seconds NX,高並行下可能存在相同時間戳。
此種方式比原先的單節點的方法更安全。
當Redis資料需要長久有效時,需要考慮是否做RDB和AOF持久化,一般RDB和AOF配合使用,但做持久化,會影響效能。
目前接觸到的業務做持久化的很少見。比如有個推薦系統Redis資料是長久有效的,但卻為了響應快不影響效能,未做持久化,而採用了其他的降級方案Hbase,以及業務的兜底等。
一般來說,就是如果你的系統不是嚴格要求快取+資料庫必須一致性的話,允許快取跟資料庫偶爾不一致的情況,那麼最後好不要做這個一致性方案。
如果實現這個方案,讀請求和寫請求序列化,串到一個記憶體佇列裡去,這樣就可以保證一定不會出現不一致的情況。
但是序列化之後,就會導致系統的吞吐量會大幅度的降低,用比正常情況下多幾倍的機器去支撐線上的一個請求。
還有一種適中的方式就是,就是先更新資料庫,然後再刪除快取。可能會暫時產生不一致的情況,但是發生的機率特別小。這時候通常並行寫資料庫和快取,可以加個事務,都寫成功才成功,有一個環節失敗了就回滾事務,全失敗。
關於雙寫一致性的問題,其實可以另起一個篇幅來說了,有興趣的可以網上搜尋一下,後續可能會再進行整理。
以上就是Redis異常測試盤點分析的詳細內容,更多關於Redis異常測試的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45