精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于Redis緩存的原因及解決方案

454398 ? 來源:機器之心 ? 作者:小小 ? 2020-10-16 15:22 ? 次閱讀

下面開始今天的正文,看見小小怎么辛苦的份上,滑到底下,給個素質三連?

緩存雪崩

緩存雪崩是指在某一個時間段內,緩存集中過期失效,如果這個時間段內有大量請求,而查詢數據量巨大,所有的請求都會達到存儲層,存儲層的調用量會暴增,引起數據庫壓力過大甚至宕機。

原因

Redis突然宕機

大部分數據失效

舉個栗子

比如我們基本上都經歷過購物狂歡節,假設商家舉辦 23:00-24:00 商品打骨折促銷活動。程序小哥哥在設計的時候,在 23:00 把商家打骨折的商品放到緩存中,并通過redis的expire設置了過期時間為1小時。這個時間段許多用戶訪問這些商品信息、購買等等。但是剛好到了24:00點的時候,恰好還有許多用戶在訪問這些商品,這時候對這些商品的訪問都會落到數據庫上,導致數據庫要抗住巨大的壓力,稍有不慎會導致,數據庫直接宕機(over)。

當商品沒有失效的時候是這樣的:

當緩存GG(失效)的時候卻是這樣的:

對于緩存雪崩有以下解決方案:

(1)redis高可用

redis有可能掛掉,多增加幾臺redis實例,(一主多從或者多主多從),這樣一臺掛掉之后其他的還可以繼續工作,其實就是搭建的集群。

(2)限流降級

在緩存失效后,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量,對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。

(3)數據預熱

數據加熱的含義就是在正式部署之前,我先把可能的數據先預先訪問一遍,這樣部分可能大量訪問的數據就會加載到緩存中。在即將發生大并發訪問前手動觸發加載緩存不同的key。

(4)不同的過期時間

設置不同的過期時間,讓緩存失效的時間點盡量均勻。

緩存穿透

什么是緩存穿透,當用戶在查詢一條數據的時候,而此時數據庫和緩存沒有任何關于這條數據的任何記錄的時候,當這條數據再緩存中沒找到數據,就會向數據庫請求數據,這樣就會對數據庫造成比較大的壓力。如:用戶查詢一個 id = -1 的商品信息,一般數據庫 id 值都是從 1 開始自增,很明顯這條信息是不在數據庫中,當沒有信息返回時,會一直向數據庫查詢,給當前數據庫的造成很大的訪問壓力。解決方案有倆個,分別為緩存空對象,布隆過濾器。

緩存空對象

緩存空對象它就是指一個請求發送過來,如果此時緩存中和數據庫都不存在這個請求所要查詢的相關信息,那么數據庫就會返回一個空對象,并將這個空對象和請求關聯起來存到緩存中,當下次還是這個請求過來的時候,這時緩存就會命中,就直接從緩存中返回這個空對象,這樣可以減少訪問數據庫的壓力,提高當前數據庫的訪問性能。我們接下來可以看下面這個流程

并且為了大量的空對象過多,導致緩存空對象也過多,所以需要利用Redis的過期機制,解決這個問題。

setex key seconds valule:設置鍵值對的同時指定過期時間(s)

Java

redisCache.put(Integer.toString(id), null, 60) //過期時間為 60s

布隆過濾器

布隆過濾器用來過濾東西的。它是一種基于概率的數據結構,主要使用愛判斷當前某個元素是否在該集合中,運行速度快。我們也可以簡單理解為是一個不怎么精確的 set 結構(set 具有去重的效果)。但是有個小問題是:當你使用它的 contains 方法去判斷某個對象是否存在時,它可能會誤判。也就是說布隆過濾器不是特別不精確,但是只要參數設置的合理,它的精確度可以控制的相對足夠精確,只會有小小的誤判概率。當布隆過濾器說某個值存在時,這個值可能不存在;當它說不存在時,那就肯定不存在。

舉個栗子

打個比方,當它說不認識你時,肯定就不認識;當它說見過你時,可能根本就沒見過面,不過因為你的臉跟它認識的人中某臉比較相似 (某些熟臉的系數組合),所以誤判以前見過你。在上面的使用場景中,布隆過濾器能準確過濾掉那些已經看過的內容,那些沒有看過的新內容,它也會過濾掉極小一部分 (誤判),但是絕大多數新內容它都能準確識別。這樣就可以完全保證推薦給用戶的內容都是無重復的。

特點

一個非常大的二進制位數組(數組中只存在 0 和 1)

擁有若干個哈希函數(Hash Function)

在空間效率和查詢效率都非常高

布隆過濾器不會提供刪除方法,在代碼維護上比較困難。

每個布隆過濾器對應到 Redis 的數據結構里面就是一個大型的位數組和幾個不一樣的無偏 hash 函數。所謂無偏就是能夠把元素的 hash 值算得比較均勻。

向布隆過濾器中添加 key 時,會使用多個 hash 函數對 key 進行 hash 算得一個整數索引值然后對位數組長度進行取模運算得到一個位置,每個 hash 函數都會算得一個不同的位置。再把位數組的這幾個位置都置為 1 就完成了 add 操作。( 每一個 key 都通過若干的hash函數映射到一個巨大位數組上,映射成功后,會在把位數組上對應的位置改為1。)

為什么存在誤判率

當 key1 和 key2 映射到位數組上的位置為 1 時,假設這時候來了個 key3,要查詢是不是在里面,恰好 key3 對應位置也映射到了這之間,那么布隆過濾器會認為它是存在的,這時候就會產生誤判(因為明明 key3 是不在的)。

提高準確率

哈希函數的好壞

存儲空間大小

哈希函數個數 hash函數的設計也是一個十分重要的問題,對于好的hash函數能大大降低布隆過濾器的誤判率。同時,對于一個布隆過濾器來說,如果其位數組越大的話,那么每個key通過hash函數映射的位置會變得稀疏許多,不會那么緊湊,有利于提高布隆過濾器的準確率。同時,對于一個布隆過濾器來說,如果key通過許多hash函數映射,那么在位數組上就會有許多位置有標志,這樣當用戶查詢的時候,在通過布隆過濾器來找的時候,誤判率也會相應降低。

緩存擊穿

一個被經常訪問并且查詢到的key,經常有用戶訪問,但是這個時候,這個key正好到了失效時間,或者突然變成冷門key,此時仍然有大量的關于這個的key的請求,這樣會造成大量的并發訪問到數據庫,造成數據庫的壓力劇增。導致緩存擊穿的產生。

原因有兩條。

一個冷門的key,突然有大量的用戶請求訪問。

一個熱門的key恰好到了過期的時間。

緩存擊穿問題的解決:加鎖,對于key過期的時候,查詢數據庫的時候加鎖,可以讓只有一個連接訪問到數據庫,然后獲取到key緩存到redis中,減少了緩存的壓力。在單機幻覺使用單機的鎖,在分布式環境下使用分布式鎖。

編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2958

    瀏覽量

    104553
  • 過濾器
    +關注

    關注

    1

    文章

    427

    瀏覽量

    19559
  • Redis
    +關注

    關注

    0

    文章

    371

    瀏覽量

    10846
收藏 人收藏

    評論

    相關推薦

    Redis緩存和MySQL數據不一致原因解決方案

    高并發架構系列:Redis緩存和MySQL數據一致性方案詳解
    發表于 03-27 15:55

    使用Redis緩存model層

    〈譯〉使用REDIS處理RAILS MODEL緩存
    發表于 04-18 17:07

    redis緩存注解怎么使用

    spring boot —— redis 緩存注解使用教程
    發表于 09-11 14:43

    Redis在高速緩存系統中的序列化算法研究

    Redis是一個key?value存儲系統,通過對Redis高速緩存系統的序列化算法優化,可提高緩存讀取的效率和存儲容量。引入現代統計學中Bootstrap理論,提出基于隨機相位高斯偽
    發表于 11-23 16:07 ?0次下載

    Java 使用Redis緩存工具的詳細解說

    本文是關于Java 使用Redis緩存工具的詳細解說。詳細步驟請看下文
    的頭像 發表于 02-09 14:10 ?7865次閱讀
    Java 使用<b class='flag-5'>Redis</b><b class='flag-5'>緩存</b>工具的詳細解說

    Windows環境下使用Redis緩存工具的圖文詳細方法

    Windows環境下使用Redis緩存工具的圖文詳細方法。Redis 是一個高性能的key-value數據庫。redis的出現,很大程度補償了memcached這類key/value存
    的頭像 發表于 02-09 14:25 ?4748次閱讀
    Windows環境下使用<b class='flag-5'>Redis</b><b class='flag-5'>緩存</b>工具的圖文詳細方法

    redis緩存mysql數據

    Redis作Mysql數據庫緩存,必須解決2個問題。首先,應該確定用何種數據結構存儲來自Mysql的數據;在確定數據結構之后,還要考慮用什么標識作為該數據結構的鍵。
    的頭像 發表于 02-09 15:42 ?4038次閱讀

    Redis常見面試題及答案

    本文的面試題如下: Redis 持久化機制 緩存雪崩、緩存穿透、緩存預熱、緩存更新、緩存降級等問
    的頭像 發表于 12-16 11:44 ?2171次閱讀
    <b class='flag-5'>Redis</b>常見面試題及答案

    緩存雪崩/穿透/擊穿的解決方案

    緩存是我們項目應用肯定會使用,是我們數據庫的守護神,能夠保證數據庫的穩定,能夠提高整個系統的性能。一般我們采用市面上的redis、memcahce方案;redis已經非常強大了,每秒支
    發表于 01-26 09:44 ?1304次閱讀
    <b class='flag-5'>緩存</b>雪崩/穿透/擊穿的<b class='flag-5'>解決方案</b>

    Redis緩存的異常原因及其處理辦法分析

    Redis 是當前最流行的 NoSQL 數據庫。Redis 主要用來做緩存使用,在提高數據查詢效率、保護數據庫等方面起到了關鍵性的作用,很大程度上提高系統的性能。
    的頭像 發表于 02-06 15:02 ?720次閱讀

    如何在SpringBoot中解決Redis緩存穿透等問題

    今天給大家介紹一下如何在SpringBoot中解決Redis緩存穿透、緩存擊穿、緩存雪崩的問題。
    的頭像 發表于 04-28 11:35 ?709次閱讀

    緩存被穿透了如何解決

    解決方案 對空值進行緩存 設置白名單 使用布隆過濾器 網警 雪崩解決方案 進行預先的熱門詞匯的設置,進行key時長的調整 實時調整,監控哪些數據是熱門數據,實時的調整key的過期時長 使用鎖機制 擊穿
    的頭像 發表于 05-23 09:54 ?668次閱讀
    <b class='flag-5'>緩存</b>被穿透了如何解決

    Oracle與Redis Enterprise協同,作為企業緩存解決方案

    單獨使用Oracle作為企業緩存數據庫時,會出現哪些問題呢?使用Redis Enterprise與Oracle共同用作企業級緩存或副本數據庫,會出現哪些喜人的提升呢?Orcle配合使用Redi
    的頭像 發表于 11-22 10:00 ?449次閱讀
    Oracle與<b class='flag-5'>Redis</b> Enterprise協同,作為企業<b class='flag-5'>緩存</b><b class='flag-5'>解決方案</b>

    Redis Enterprise vs ElastiCache——如何選擇緩存解決方案?

    使用Redis或AmazonElastiCache來作為緩存加速已經是業界主流的解決方案,二者各有什么優勢?又有哪些區別呢?文況速覽:Redis是什么?RedisEnterprise
    的頭像 發表于 11-26 08:06 ?465次閱讀
    <b class='flag-5'>Redis</b> Enterprise vs ElastiCache——如何選擇<b class='flag-5'>緩存</b><b class='flag-5'>解決方案</b>?

    Spring Cache緩存常規配置

    作者最近在開發公司項目時使用到 Redis 緩存,并在翻看前人代碼時,看到了一種關于 @Cacheable 注解的自定義緩存有效期的解決方案
    的頭像 發表于 11-28 10:44 ?574次閱讀
    Spring Cache<b class='flag-5'>緩存</b>常規配置