欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于Redis緩存的原因及解決方案

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

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

緩存雪崩

緩存雪崩是指在某一個(gè)時(shí)間段內(nèi),緩存集中過期失效,如果這個(gè)時(shí)間段內(nèi)有大量請(qǐng)求,而查詢數(shù)據(jù)量巨大,所有的請(qǐng)求都會(huì)達(dá)到存儲(chǔ)層,存儲(chǔ)層的調(diào)用量會(huì)暴增,引起數(shù)據(jù)庫壓力過大甚至宕機(jī)。

原因

Redis突然宕機(jī)

大部分?jǐn)?shù)據(jù)失效

舉個(gè)栗子

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

當(dāng)商品沒有失效的時(shí)候是這樣的:

當(dāng)緩存GG(失效)的時(shí)候卻是這樣的:

對(duì)于緩存雪崩有以下解決方案:

(1)redis高可用

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

(2)限流降級(jí)

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

(3)數(shù)據(jù)預(yù)熱

數(shù)據(jù)加熱的含義就是在正式部署之前,我先把可能的數(shù)據(jù)先預(yù)先訪問一遍,這樣部分可能大量訪問的數(shù)據(jù)就會(huì)加載到緩存中。在即將發(fā)生大并發(fā)訪問前手動(dòng)觸發(fā)加載緩存不同的key。

(4)不同的過期時(shí)間

設(shè)置不同的過期時(shí)間,讓緩存失效的時(shí)間點(diǎn)盡量均勻。

緩存穿透

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

緩存空對(duì)象

緩存空對(duì)象它就是指一個(gè)請(qǐng)求發(fā)送過來,如果此時(shí)緩存中和數(shù)據(jù)庫都不存在這個(gè)請(qǐng)求所要查詢的相關(guān)信息,那么數(shù)據(jù)庫就會(huì)返回一個(gè)空對(duì)象,并將這個(gè)空對(duì)象和請(qǐng)求關(guān)聯(lián)起來存到緩存中,當(dāng)下次還是這個(gè)請(qǐng)求過來的時(shí)候,這時(shí)緩存就會(huì)命中,就直接從緩存中返回這個(gè)空對(duì)象,這樣可以減少訪問數(shù)據(jù)庫的壓力,提高當(dāng)前數(shù)據(jù)庫的訪問性能。我們接下來可以看下面這個(gè)流程

并且為了大量的空對(duì)象過多,導(dǎo)致緩存空對(duì)象也過多,所以需要利用Redis的過期機(jī)制,解決這個(gè)問題。

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

Java

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

布隆過濾器

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

舉個(gè)栗子

打個(gè)比方,當(dāng)它說不認(rèn)識(shí)你時(shí),肯定就不認(rèn)識(shí);當(dāng)它說見過你時(shí),可能根本就沒見過面,不過因?yàn)槟愕哪樃J(rèn)識(shí)的人中某臉比較相似 (某些熟臉的系數(shù)組合),所以誤判以前見過你。在上面的使用場(chǎng)景中,布隆過濾器能準(zhǔn)確過濾掉那些已經(jīng)看過的內(nèi)容,那些沒有看過的新內(nèi)容,它也會(huì)過濾掉極小一部分 (誤判),但是絕大多數(shù)新內(nèi)容它都能準(zhǔn)確識(shí)別。這樣就可以完全保證推薦給用戶的內(nèi)容都是無重復(fù)的。

特點(diǎn)

一個(gè)非常大的二進(jìn)制位數(shù)組(數(shù)組中只存在 0 和 1)

擁有若干個(gè)哈希函數(shù)(Hash Function)

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

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

每個(gè)布隆過濾器對(duì)應(yīng)到 Redis 的數(shù)據(jù)結(jié)構(gòu)里面就是一個(gè)大型的位數(shù)組和幾個(gè)不一樣的無偏 hash 函數(shù)。所謂無偏就是能夠把元素的 hash 值算得比較均勻。

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

為什么存在誤判率

當(dāng) key1 和 key2 映射到位數(shù)組上的位置為 1 時(shí),假設(shè)這時(shí)候來了個(gè) key3,要查詢是不是在里面,恰好 key3 對(duì)應(yīng)位置也映射到了這之間,那么布隆過濾器會(huì)認(rèn)為它是存在的,這時(shí)候就會(huì)產(chǎn)生誤判(因?yàn)槊髅?key3 是不在的)。

提高準(zhǔn)確率

哈希函數(shù)的好壞

存儲(chǔ)空間大小

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

緩存擊穿

一個(gè)被經(jīng)常訪問并且查詢到的key,經(jīng)常有用戶訪問,但是這個(gè)時(shí)候,這個(gè)key正好到了失效時(shí)間,或者突然變成冷門key,此時(shí)仍然有大量的關(guān)于這個(gè)的key的請(qǐng)求,這樣會(huì)造成大量的并發(fā)訪問到數(shù)據(jù)庫,造成數(shù)據(jù)庫的壓力劇增。導(dǎo)致緩存擊穿的產(chǎn)生。

原因有兩條。

一個(gè)冷門的key,突然有大量的用戶請(qǐng)求訪問。

一個(gè)熱門的key恰好到了過期的時(shí)間。

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

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2977

    瀏覽量

    105224
  • 過濾器
    +關(guān)注

    關(guān)注

    1

    文章

    433

    瀏覽量

    19760
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    379

    瀏覽量

    10968
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Redis緩存和MySQL數(shù)據(jù)不一致原因解決方案

    高并發(fā)架構(gòu)系列:Redis緩存和MySQL數(shù)據(jù)一致性方案詳解
    發(fā)表于 03-27 15:55

    使用Redis緩存model層

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

    redis緩存注解怎么使用

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

    Redis在高速緩存系統(tǒng)中的序列化算法研究

    Redis是一個(gè)key?value存儲(chǔ)系統(tǒng),通過對(duì)Redis高速緩存系統(tǒng)的序列化算法優(yōu)化,可提高緩存讀取的效率和存儲(chǔ)容量。引入現(xiàn)代統(tǒng)計(jì)學(xué)中Bootstrap理論,提出基于隨機(jī)相位高斯偽
    發(fā)表于 11-23 16:07 ?0次下載

    Java 使用Redis緩存工具的詳細(xì)解說

    本文是關(guān)于Java 使用Redis緩存工具的詳細(xì)解說。詳細(xì)步驟請(qǐng)看下文
    的頭像 發(fā)表于 02-09 14:10 ?7936次閱讀
    Java 使用<b class='flag-5'>Redis</b><b class='flag-5'>緩存</b>工具的詳細(xì)解說

    Windows環(huán)境下使用Redis緩存工具的圖文詳細(xì)方法

    Windows環(huán)境下使用Redis緩存工具的圖文詳細(xì)方法。Redis 是一個(gè)高性能的key-value數(shù)據(jù)庫。redis的出現(xiàn),很大程度補(bǔ)償了memcached這類key/value存
    的頭像 發(fā)表于 02-09 14:25 ?4840次閱讀
    Windows環(huán)境下使用<b class='flag-5'>Redis</b><b class='flag-5'>緩存</b>工具的圖文詳細(xì)方法

    redis緩存mysql數(shù)據(jù)

    Redis作Mysql數(shù)據(jù)庫緩存,必須解決2個(gè)問題。首先,應(yīng)該確定用何種數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)來自Mysql的數(shù)據(jù);在確定數(shù)據(jù)結(jié)構(gòu)之后,還要考慮用什么標(biāo)識(shí)作為該數(shù)據(jù)結(jié)構(gòu)的鍵。
    的頭像 發(fā)表于 02-09 15:42 ?4099次閱讀

    Redis常見面試題及答案

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

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

    緩存是我們項(xiàng)目應(yīng)用肯定會(huì)使用,是我們數(shù)據(jù)庫的守護(hù)神,能夠保證數(shù)據(jù)庫的穩(wěn)定,能夠提高整個(gè)系統(tǒng)的性能。一般我們采用市面上的redis、memcahce方案;redis已經(jīng)非常強(qiáng)大了,每秒支
    發(fā)表于 01-26 09:44 ?1341次閱讀
    <b class='flag-5'>緩存</b>雪崩/穿透/擊穿的<b class='flag-5'>解決方案</b>

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

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

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

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

    緩存被穿透了如何解決

    解決方案 對(duì)空值進(jìn)行緩存 設(shè)置白名單 使用布隆過濾器 網(wǎng)警 雪崩解決方案 進(jìn)行預(yù)先的熱門詞匯的設(shè)置,進(jìn)行key時(shí)長的調(diào)整 實(shí)時(shí)調(diào)整,監(jiān)控哪些數(shù)據(jù)是熱門數(shù)據(jù),實(shí)時(shí)的調(diào)整key的過期時(shí)長 使用鎖機(jī)制 擊穿
    的頭像 發(fā)表于 05-23 09:54 ?745次閱讀
    <b class='flag-5'>緩存</b>被穿透了如何解決

    Oracle與Redis Enterprise協(xié)同,作為企業(yè)緩存解決方案

    單獨(dú)使用Oracle作為企業(yè)緩存數(shù)據(jù)庫時(shí),會(huì)出現(xiàn)哪些問題呢?使用Redis Enterprise與Oracle共同用作企業(yè)級(jí)緩存或副本數(shù)據(jù)庫,會(huì)出現(xiàn)哪些喜人的提升呢?Orcle配合使用Redi
    的頭像 發(fā)表于 11-22 10:00 ?516次閱讀
    Oracle與<b class='flag-5'>Redis</b> Enterprise協(xié)同,作為企業(yè)<b class='flag-5'>緩存</b><b class='flag-5'>解決方案</b>

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

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

    Spring Cache緩存常規(guī)配置

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