做網(wǎng)站業(yè)務員提成幾個點網(wǎng)絡營銷的渠道有哪些
布隆過濾器(Bloom Filter)是一種數(shù)據(jù)結構,用于快速判斷一個元素是否可能存在于一個集合中。它通過使用多個哈希函數(shù)和一個位數(shù)組來表示一個集合,當一個元素被加入到集合時,通過哈希函數(shù)計算出多個哈希值,并將對應的位數(shù)組位置置為1。當需要檢查一個元素是否存在于集合時,同樣通過哈希函數(shù)計算出多個哈希值,如果所有對應的位數(shù)組位置都為1,則認為元素可能存在于集合中,如果有任何一個位置為0,則可以確定元素肯定不存在于集合中。
1. 定義布隆過濾器
布隆過濾器具有高效的插入和查詢性能,且占用內(nèi)存較小,但是存在一定的誤判率,即可能會將不存在于集合中的元素誤判為存在于集合中。
所以我們需要配置布隆過濾器的存儲元素數(shù)量和誤判率
2.構造器注入布隆過濾器
在業(yè)務層里面注入布隆過濾器對象
3.判斷用戶名是否存在
當我們注冊用戶名時,可能之前被別人注冊過了,這時我們需要先判斷一下,在布隆過濾器中,是否已存在相同的用戶名
調(diào)用布隆過濾器中的 contains() 方法判斷
4.注冊用戶
在業(yè)務層中,定義一個注冊方法,把前端請求的注冊請求體傳進去
第一步,就是獲取到請求體中的 username 字段,然后調(diào)用判斷用戶名是否存在的方法,如果存在,就拋出異常
第二步,如果用戶名不存在,也就是之前沒有被注冊過,那用戶就可以繼續(xù)注冊了
然后就可以把請求體插入到數(shù)據(jù)庫中
如果數(shù)據(jù)庫中插入失敗,就拋出異常
如果插入成功,就需要把注冊的用戶名給添加到布隆過濾器中,這樣我們之后再判斷數(shù)據(jù)庫中是否存在已注冊的用戶名時,就不用訪問數(shù)據(jù)庫了,而是先在布隆過濾器中查找,這樣減輕了對數(shù)據(jù)庫的壓力
5.分布式鎖
如果用戶名沒注冊,那么在布隆過濾器中就不存在該用戶名,也就意味著可以觸發(fā)注冊流程插入數(shù)據(jù)庫。但是如果產(chǎn)生惡意請求,在短時間內(nèi)海量用戶請求注冊同一個用戶名,這些請求都會落到數(shù)據(jù)庫,造成數(shù)據(jù)庫訪問壓力。這里通過分布式鎖,鎖定用戶名進行串行執(zhí)行,防止惡意請求利用未注冊用戶名將請求打到數(shù)據(jù)庫。
5.1注入redissonClient
RedissonClient是一個Java的Redis客戶端,它提供了許多方便的功能和工具來與Redis數(shù)據(jù)庫進行交互。通過RedissonClient,開發(fā)人員可以方便地操作Redis數(shù)據(jù)庫,進行數(shù)據(jù)的存儲、查詢、更新和刪除等操作。RedissonClient支持多種數(shù)據(jù)結構和功能,如分布式鎖、分布式集合、分布式隊列等
5.2獲取鎖
定義一個常量名作為鎖名
然后將常量名和注冊的用戶名綁定,從而獲取到分布式鎖
所以當海量用戶注冊同一個用戶名時,只有一個用戶可以獲取到分布式鎖,則把該用戶注冊的信息插入到數(shù)據(jù)庫中,插入成功后,再把用戶名添加到布隆過濾器里面。而其他沒有獲取到鎖的用戶,則拋出異常