redis中使用bloomfilter的白名單功能解決緩存穿透問題
一 緩存預(yù)熱
1.1 緩存預(yù)熱
將需要的數(shù)據(jù)提前緩存到緩存redis中,可以在服務(wù)啟動(dòng)時(shí)候,或者在使用前一天完成數(shù)據(jù)的同步等操作。保證后續(xù)能夠正常使用。
1.2 緩存穿透
在redis中,查詢r(jià)edis緩存數(shù)據(jù)沒有內(nèi)容,接著查詢mysql數(shù)據(jù)庫,也沒有需要的內(nèi)容,做了兩次無用的查詢。進(jìn)而造成mysql數(shù)據(jù)庫的負(fù)擔(dān),造成一系列的風(fēng)險(xiǎn)。
解決辦法:bloomfilter+白名單實(shí)現(xiàn)過濾。
1.3 白名單的作用
白名單里面有才讓允許通過,沒有的內(nèi)容則不允許通過。但是存在誤判的情況,比如bloomfilter中存在查詢的內(nèi)容且允許通過,但是并不是我們真正需要的那個(gè)內(nèi)容。

1.4 白名單入門案例
public class WhiteList {
public static void main(String[] args) {
testGuavaWithBloomFilter();
}
public static void testGuavaWithBloomFilter()
{
//1 創(chuàng)建guava版布隆過濾器
BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 100);
//2 判斷指定的元素是否存在
System.out.println(bloomFilter.mightContain(1));
System.out.println(bloomFilter.mightContain(2));
System.out.println();
//3 講元素新增進(jìn)入bloomfilter
bloomFilter.put(1);
bloomFilter.put(2);
System.out.println(bloomFilter.mightContain(1));
System.out.println(bloomFilter.mightContain(2));
}
}結(jié)果:

1.5 白名單+過濾器的實(shí)現(xiàn)案例
邏輯: guava布隆過濾器插入100萬樣本數(shù)據(jù)并額外10W測(cè)試是否存在,這10w的數(shù)據(jù)在100w的數(shù)據(jù)可能存在相同的情況,存儲(chǔ)到相同位置。比如規(guī)則為m%3,則 1,4,7放到同一個(gè)位置槽中。

1.5.1 代碼邏輯
1.controller
@RestController
@Slf4j
public class GuvaFilter {
@Resource
private GuavaBloomFilterService guavaBloomFilterService;
@ApiOperation("guava布隆過濾器插入100萬樣本數(shù)據(jù)并額外10W測(cè)試是否存在")
@RequestMapping(value = "/guavafilter",method = RequestMethod.GET)
public void guavaBloomFilter()
{
guavaBloomFilterService.guavaBloomFilter();
}
}2.service
@Service
@Slf4j
public class GuavaBloomFilterService
{
//1 定義一個(gè)常量
public static final int _1W = 10000;
//2 定義我們guava布隆過濾器,初始容量
public static final int SIZE = 100 * _1W;
//3 誤判率,它越小誤判的個(gè)數(shù)也就越少(思考,是否可以是無限????沒有誤判豈不是更好)
public static double fpp = 0.01;//0.01 0.000000000000001
//4 創(chuàng)建guava布隆過濾器
private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), SIZE,fpp);
public void guavaBloomFilter()
{
//1 先讓bloomFilter加入100W白名單數(shù)據(jù)
for (int i = 1; i <= SIZE ; i++) {
bloomFilter.put(i);
}
//2 故意取10W個(gè)不在合法范圍內(nèi)的數(shù)據(jù),來進(jìn)行誤判率的演示
ArrayList<Integer> list = new ArrayList<>(10 * _1W);
//3 驗(yàn)證
for (int i = SIZE+1; i <= SIZE+(10 * _1W) ; i++)
{
if(bloomFilter.mightContain(i))
{
log.info("被誤判了:{}",i);
list.add(i);
}
}
log.info("誤判總數(shù)量:{}",list.size());
}
}3.截圖

控制臺(tái)打印日志:

1.6 bloomfilter總結(jié)
bloomfilter作用:查詢的內(nèi)容A,一定不存在,在過濾器中查詢肯定沒有;如果存在,但是存在誤判的情況,但是誤判率很小,可以忽略。

1.7 黑名單的使用
黑名單:在黑名單的存在的內(nèi)容,就不再推薦;不存在則推薦。
應(yīng)用案例: 抖音等媒體的推薦內(nèi)容。

到此這篇關(guān)于redis中使用bloomfilter的白名單功能解決緩存穿透問題的文章就介紹到這了,更多相關(guān)redis bloomfilter解決緩存穿透內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis快速實(shí)現(xiàn)分布式session的方法詳解
Session是客戶端與服務(wù)器通訊會(huì)話跟蹤技術(shù),服務(wù)器與客戶端保持整個(gè)通訊的會(huì)話基本信息。本文主要介紹了Redis快速實(shí)現(xiàn)分布式session的方法,感興趣的可以學(xué)習(xí)一下2022-01-01
Redis實(shí)現(xiàn)限流器的三種方法(小結(jié))
本文主要介紹了Redis實(shí)現(xiàn)限流器的三種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Linux環(huán)境搭建Redis6.x集群環(huán)境詳解(主從復(fù)制)
本文詳細(xì)介紹了如何搭建和管理一個(gè)Redis集群,包括主從復(fù)制、集群配置、批量腳本、集群?jiǎn)?dòng)和關(guān)閉、節(jié)點(diǎn)的增刪、投票機(jī)制以及主節(jié)點(diǎn)宕機(jī)演示,通過這些步驟,可以實(shí)現(xiàn)Redis集群的高可用性和性能擴(kuò)展2026-03-03
Redisson如何解決redis分布式鎖過期時(shí)間到了業(yè)務(wù)沒執(zhí)行完問題
這篇文章主要介紹了Redisson如何解決redis分布式鎖過期時(shí)間到了業(yè)務(wù)沒執(zhí)行完問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
如何利用Redis?List實(shí)現(xiàn)Java數(shù)據(jù)庫分頁快速查詢
這篇文章主要給大家介紹了關(guān)于如何利用Redis?List實(shí)現(xiàn)Java數(shù)據(jù)庫分頁快速查詢的相關(guān)資料,Redis是一個(gè)高效的內(nèi)存數(shù)據(jù)庫,它支持包括String、List、Set、SortedSet和Hash等數(shù)據(jù)類型的存儲(chǔ),需要的朋友可以參考下2024-02-02

