国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用)

這篇具有很好參考價值的文章主要介紹了【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用),SpringBoot,spring boot,緩存,spring,布隆過濾器

??什么是緩存穿透

緩存穿透是指在使用緩存機制時,大量的請求無法從緩存中獲取到結(jié)果,導(dǎo)致請求都要直接訪問后端存儲系統(tǒng),從而增加了系統(tǒng)的負載和響應(yīng)時間。

通常的緩存機制是將請求的結(jié)果緩存在內(nèi)存或其他高速存儲介質(zhì)中,當相同的請求再次到達時,可以直接從緩存中獲取結(jié)果,避免了從后端存儲系統(tǒng)中讀取數(shù)據(jù)的開銷。

然而,在緩存穿透的情況下,由于大量請求所對應(yīng)的數(shù)據(jù)在緩存中不存在,每個請求都需要直接訪問后端存儲系統(tǒng)。這可能是因為惡意請求、頻繁的隨機查詢或者查詢不存在的數(shù)據(jù)等原因。

緩存穿透可能導(dǎo)致以下問題:

  • 性能下降:由于大量的請求都要直接訪問后端存儲系統(tǒng),系統(tǒng)的響應(yīng)時間會顯著增加,導(dǎo)致性能下降。
  • 增加負載:后端存儲系統(tǒng)承受了大量無效請求的壓力,增加了系統(tǒng)的負載,可能導(dǎo)致后端存儲系統(tǒng)的性能問題。
  • 安全風險:緩存穿透可能為惡意請求提供了一種繞過緩存機制直接訪問后端存儲系統(tǒng)的途徑,可能導(dǎo)致安全漏洞或數(shù)據(jù)泄露。

??解決辦法

  1. 緩存空值處理:對于不存在的數(shù)據(jù),也將其緩存起來,但緩存的值為空,這樣下次再有相同的請求到達時,可以直接返回空結(jié)果,避免對后端存儲系統(tǒng)的重復(fù)查詢。
  2. 布隆過濾器(Bloom Filter):使用布隆過濾器可以快速判斷請求所對應(yīng)的數(shù)據(jù)是否存在于緩存中,從而減少對后端存儲系統(tǒng)的無效查詢。

【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用),SpringBoot,spring boot,緩存,spring,布隆過濾器

?緩存空值處理

【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用),SpringBoot,spring boot,緩存,spring,布隆過濾器

??優(yōu)點

實現(xiàn)簡單,維護方便

??缺點

  • 額外的內(nèi)存消耗
  • 可能造成短期數(shù)據(jù)的不一致

??代碼實現(xiàn)

【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用),SpringBoot,spring boot,緩存,spring,布隆過濾器

@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {


    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private CacheClient cacheClient;

    @Override
    public Result queryById(Long id) {
        String key=CACHE_SHOP_KEY+":"+id;

        //從redis中查詢商鋪緩存
        String shopJson=stringRedisTemplate.opsForValue().get(key);
        //判斷是否存在
        if(StrUtil.isNotBlank(shopJson)){    //isNotBlank只有傳入的是 字符串 的情況下,才返回true,否則返回false
            //存在,直接返回
            Shop shop= JSONUtil.toBean(shopJson, Shop.class);
            return Result.ok(shop);
        }
        //判斷命中的是否是空值
                //因為上面isNotBlank判斷了有值的情況了,下面需要判斷的就2種情況 null 和 空字符串
        if(shopJson!=null){
            //不為null,那么為空字符串
            return Result.fail("店鋪不存在!");
        }

        //不存在,根據(jù)id查詢數(shù)據(jù)庫
        Shop shop = this.getById(id);
        //不存在,返回錯誤信息
        if (shop == null) {
            //將空值寫入到redis
            stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);

            return Result.fail("店鋪不存在!");
        }

        //存在,寫入到redis里面
        stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);

        //返回
        return Result.ok(shop);
}

?布隆過濾器

【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用),SpringBoot,spring boot,緩存,spring,布隆過濾器
布隆過濾器是一種空間效率高、適合大規(guī)模數(shù)據(jù)的概率型數(shù)據(jù)結(jié)構(gòu),用于判斷一個元素是否可能存在于一個集合中。布隆過濾器由一個位數(shù)組和多個哈希函數(shù)組成。其核心思想是通過多個哈希函數(shù)對輸入元素進行映射,將元素映射到位數(shù)組的多個位置上,從而實現(xiàn)元素的快速查找。

假設(shè)布隆過濾器使用一個長度為 m 的位數(shù)組和 k 個獨立的哈希函數(shù),初始時所有位都置為 0。當要插入一個元素時,將該元素經(jīng)過 k 個哈希函數(shù)得到的 k 個哈希值作為索引,在位數(shù)組中將這 k 個位置的值置為 1。當要查詢一個元素時,同樣將該元素經(jīng)過 k 個哈希函數(shù)得到的 k 個哈希值作為索引,并檢查對應(yīng)的位數(shù)組位置是否都為 1,若有任何一個位置為 0,則可以確定該元素不存在于集合中;若都為 1,則該元素可能存在于集合中。

布隆過濾器的優(yōu)勢在于具有較高的空間效率和查詢效率,適合大規(guī)模數(shù)據(jù)的情況。由于使用了多個哈希函數(shù),可以有效減少沖突的概率,降低誤判率。然而,布隆過濾器也存在一定的缺陷,即可能出現(xiàn)誤判(即判斷某個元素存在于集合中,但實際上并不存在),這是由于不同元素經(jīng)過哈希函數(shù)映射后的索引可能存在沖突。因此,在使用布隆過濾器時需要權(quán)衡誤判率和空間利用率。

總的來說,布隆過濾器通過位數(shù)組和多個哈希函數(shù)實現(xiàn)了高效的元素判斷,是一種適合大規(guī)模數(shù)據(jù)場景下的概率型數(shù)據(jù)結(jié)構(gòu)

??代碼實現(xiàn)

實現(xiàn)引入依賴

<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>29.0-jre</version>
        </dependency>

配置啟動類
【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用),SpringBoot,spring boot,緩存,spring,布隆過濾器

編寫核心代碼

【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用),SpringBoot,spring boot,緩存,spring,布隆過濾器

@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private BloomFilter<Long> bloomFilter;

    @Override
    public Result queryById(Long id) {
        String key = CACHE_SHOP_KEY + ":" + id;

        // 使用布隆過濾器判斷緩存鍵是否存在
        if (!bloomFilter.mightContain(id)) {
            // 緩存鍵不存在,直接返回錯誤信息
            return Result.fail("店鋪不存在!");
        }

        // 從redis中查詢商鋪緩存
        String shopJson = stringRedisTemplate.opsForValue().get(key);
        // 判斷是否存在
        if (StrUtil.isNotBlank(shopJson)) {
            // 存在,直接返回
            Shop shop = JSONUtil.toBean(shopJson, Shop.class);
            return Result.ok(shop);
        }

        // 不存在,根據(jù)id查詢數(shù)據(jù)庫
        Shop shop = this.getById(id);
        // 不存在,返回錯誤信息
        if (shop == null) {
            // 將空值寫入到redis
            stringRedisTemplate.opsForValue().set(key, "", CACHE_SHOP_TTL, TimeUnit.MINUTES);
            // 將緩存鍵加入布隆過濾器
            bloomFilter.put(id);
            return Result.fail("店鋪不存在!");
        }

        // 存在,寫入到redis里面
        stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop), CACHE_SHOP_TTL, TimeUnit.MINUTES);
        // 將緩存鍵加入布隆過濾器
        bloomFilter.put(id);

        // 返回
        return Result.ok(shop);
    }

【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用),SpringBoot,spring boot,緩存,spring,布隆過濾器

更加詳細的布隆過濾器講解,請參考我的Redis專欄Redis專欄里面講解布隆過濾器的文章

在技術(shù)的道路上,我們不斷探索、不斷前行,不斷面對挑戰(zhàn)、不斷突破自我。科技的發(fā)展改變著世界,而我們作為技術(shù)人員,也在這個過程中書寫著自己的篇章。讓我們攜手并進,共同努力,開創(chuàng)美好的未來!愿我們在科技的征途上不斷奮進,創(chuàng)造出更加美好、更加智能的明天!

【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用),SpringBoot,spring boot,緩存,spring,布隆過濾器文章來源地址http://www.zghlxwxcb.cn/news/detail-762698.html

到了這里,關(guān)于【SpringBoot篇】基于布隆過濾器,緩存空值,解決緩存穿透問題 (商鋪查詢時可用)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 基于Guava布隆過濾器的海量字符串高效去重實踐

    基于Guava布隆過濾器的海量字符串高效去重實踐

    在Java環(huán)境中處理海量字符串去重的問題時,布隆過濾器(BloomFilter)是一種非常高效的數(shù)據(jù)結(jié)構(gòu),盡管它有一定的誤報率。布隆過濾器適用于那些可以接受一定誤報率,并且希望節(jié)省空間和時間成本的場景。 使用Google Guava庫來實現(xiàn)基于布隆過濾器的海量字符串去重是一個很好

    2024年01月24日
    瀏覽(16)
  • 算法~布隆過濾器

    布隆過濾器(Bloom Filter)是一種高效的概率數(shù)據(jù)結(jié)構(gòu),用于判斷一個元素是否存在于集合中。它基于位數(shù)組和多個哈希函數(shù),并具有以下特點: Bloom Filter 是一個基于概率的數(shù)據(jù)結(jié)構(gòu):它只能告訴我們一個 元素絕對不在集合內(nèi) 或 可能在集合內(nèi) 快速查詢:布隆過濾器具有快速

    2024年02月05日
    瀏覽(19)
  • 布隆過濾器及其應(yīng)用

    布隆過濾器是一種數(shù)據(jù)結(jié)構(gòu),具有快速插入和查找的特性,能確定某個字符串一定存在或者可能存在。布隆過濾器有著高效的空間利用率,它不存儲具體數(shù)據(jù),只存儲數(shù)據(jù)的關(guān)鍵標識,所以占用的空間較小。它的查詢結(jié)果可能會存在一定誤差,但是誤差總體可控,同時不支持

    2024年02月03日
    瀏覽(17)
  • 位圖以及布隆過濾器

    位圖以及布隆過濾器

    本文主要講解哈希思想的實際應(yīng)用,位圖和布隆過濾器。 講解位圖之前我們先來解答這樣一道騰訊的面試題 給40億個不重復(fù)的無符號整數(shù),沒排過序。給一個無符號整數(shù),如何快速判斷一個數(shù)是否在這40億個數(shù)中?!掘v訊】 很多人立馬就想到了用哈希表或者紅黑樹,因為足夠

    2024年02月08日
    瀏覽(17)
  • Redis----布隆過濾器

    目錄 背景 解決方案 什么是布隆過濾器 布隆過濾器的原理 一些其他運用 比如我們在觀看新聞或者刷微博的時候,會不停地給我們推薦新的內(nèi)容,我們發(fā)現(xiàn)幾乎沒有重復(fù)的,說明后臺已經(jīng)進行了去重處理,基于如何去重,Redis給出了高效的方案---布隆過濾器 1.記錄已經(jīng)瀏覽過

    2024年02月09日
    瀏覽(24)
  • 布隆過濾器的原理

    布隆過濾器是一種用于檢索一個元素是否在一個集合中的數(shù)據(jù)結(jié)構(gòu),具有高效的查詢性能和較小的內(nèi)存占用。 布隆過濾器的底層實現(xiàn)主要涉及以下幾個步驟: 初始化數(shù)組: 首先,初始化一個比較大的數(shù)組,數(shù)組中的元素用二進制表示,初始值都為0。 Hash計算: 當一個新的元

    2024年01月18日
    瀏覽(18)
  • 布隆過濾器詳解

    布隆過濾器詳解

    本文全部代碼地址 布隆過濾器是一種高效的數(shù)據(jù)結(jié)構(gòu),用于判斷一個元素是否存在于一個集合中.它的主要優(yōu)點是速度快,空間占用少,因此在需要快速判斷某個元素是否在集合中的場合得到廣泛引用. 布隆過濾器就是 一個大型的位數(shù)組和幾個不一樣的無偏hash函數(shù). 所謂無偏就是

    2023年04月22日
    瀏覽(32)
  • Redis布隆過濾器原理

    Redis布隆過濾器原理

    其實布隆過濾器本質(zhì)上要解決的問題,就是 防止很多沒有意義的、惡意的請求穿透Redis(因為Redis中沒有數(shù)據(jù))直接打入到DB 。它是Redis中的一個 modules ,其實可以理解為一個插件,用來拓展實現(xiàn)額外的功能。 可以簡單理解布隆過濾器的功能 :它就是記錄了一份DB數(shù)據(jù),然后

    2024年02月09日
    瀏覽(30)
  • 解釋一下布隆過濾器原理

    鎖屏面試題百日百刷,每個工作日堅持更新面試題。請看到最后就能獲取你想要的,接下來的是今日的面試題: 1.解釋一下布隆過濾器原理 在日常生活中,包括在設(shè)計計算機軟件時,我們經(jīng)常要判斷一個元素是否在一個集合中。比如在字處理軟件中,需要檢查一個英語單詞是

    2023年04月10日
    瀏覽(25)
  • Java實現(xiàn)布隆過濾器

    Java實現(xiàn)布隆過濾器

    背景: 為預(yù)防大量黑客故意發(fā)起非法的時間查詢請求,造成緩存擊穿,建議采用布隆過濾器的方法解決。布隆過濾器通過一個很長的二進制向量和一系列隨機映射函數(shù)(哈希函數(shù))來記錄與識別某個數(shù)據(jù)是否在一個集合中。如果數(shù)據(jù)不在集合中,能被識別出來,不需要到數(shù)據(jù)

    2024年02月01日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包