Redis学习笔记(五) 总结
- 為什么使用redis
? ? ? ? 改善性能。當大SQL執行耗時久,且結果不頻繁變動,就特別適合將運行結果放入緩存,后面的請求從緩存中讀取,使得請求能夠迅速響應
? ? ? ? 緩解并發壓力。大并發下,所有請求都是直接訪問數據庫的,會出現連接異常。redis做一個緩沖,讓請求先訪問redis,而不是數據庫。 - redis缺點
? ? ? ? ?1、緩存與數據庫雙寫一致性問題
? ? ? ? ?2、緩存雪崩問題(緩存同一時間大面積失效,這時又來了一波請求,結果請求都懟到數據庫上,從而連接異常)
? ? ? ? ?3、緩存擊穿問題(黑客故意去請求緩存中不存在的數據,導致所有的請求都懟到數據庫上,從而連接異常)
? ? ? ? ?4、緩存的并發競爭問題 - redis的過期策略與內存淘汰機制
? 思考:為什么redis只能存5G,而你寫了10G,redis怎么刪除的。為什么設置過期時間,時間到了,內存占用率還是那么高
? ? ? ? ?redis采用的是定期刪除+惰性刪除策略
? ? ? ? ?定期刪除不等于定時刪除,定期刪除是指redis默認100ms檢查是否有過期的key,有則刪除。但redis不是每個100ms將所有的key檢查一次,而是隨機抽取進行檢查,因此,只采用定期刪除策略,會導致很多key到時間沒有刪除。惰性刪除會在你獲取key時,redis檢查是否過期,如果過期,此時就會刪除。
? ? ? ? ? 但是如果一直沒有被刪除(定期刪除沒有刪,也沒有被訪問),則redis內存會越來越高,應該采用內存淘汰機制:? ? ? ? ? 在redis.conf中有一行配置:# maxmemory-policy volatile-lru
? ? ? ? ? 該配置就是配內存淘汰策略的(什么,你沒配過?好好反省一下自己)
? ? ? ? ? 1)noeviction:當內存不足以容納新寫入數據時,新寫入操作會報錯。應該沒人用吧。
? ? ? ? ? 2)allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的key。推薦使用,目前項目在用這種。
? ? ? ? ? 3)allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個key。應該也沒人用吧,你不刪最少使用Key,去隨機刪。
? ? ? ? ? 4)volatile-lru:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,移除最近最少使用的key。這種情況一般是把redis既當緩存,又做持久化存儲的時候才用。不推薦
? ? ? ? ? 5)volatile-random:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,隨機移除某個key。依然不推薦
? ? ? ? ? 6)volatile-ttl:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,有更早過期時間的key優先移除。不推薦
? ? ? ? ? - 解決緩存擊穿問題
? ? ? ?1、利用互斥鎖,緩存失效的時候,先獲得鎖,得到鎖了再請求數據庫,沒得到鎖,則休眠一段時間重試
? ? ? ?2、采用異步更新策略,無論key是否取到值,都直接返回。value值中維護一個緩存失效時間,緩存過期,則異步起一個線程去讀數據庫,更新緩存,需要做緩存預熱操作。
? ? ? ?3、提供一個迅速判斷請求是否有效的攔截機制 - 解決雪崩問題
? ? ? ? 1、給換成的失效時間加上隨機值,避免集體失效
? ? ? ? 2、使用互斥鎖,但是該方案吞吐量明顯下降了
? ? ? ? 3、雙緩存
? ? ? ? ??
轉載于:https://www.cnblogs.com/yaohuiqin/p/9412367.html
總結
以上是生活随笔為你收集整理的Redis学习笔记(五) 总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pyinstaller打包执行exe出现
- 下一篇: 最全SQL笔试题