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

2023-06-11:redis中,如何在100個(gè)億URL中快速判斷某URL是否存在?

這篇具有很好參考價(jià)值的文章主要介紹了2023-06-11:redis中,如何在100個(gè)億URL中快速判斷某URL是否存在?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

2023-06-11:redis中,如何在100個(gè)億URL中快速判斷某URL是否存在?

答案2023-06-11:

傳統(tǒng)數(shù)據(jù)結(jié)構(gòu)的不足

當(dāng)然有人會(huì)想,我直接將網(wǎng)頁(yè)URL存入數(shù)據(jù)庫(kù)進(jìn)行查找不就好了,或者建立一個(gè)哈希表進(jìn)行查找不就OK了。

當(dāng)數(shù)據(jù)量小的時(shí)候,這么思考是對(duì)的,

確實(shí),將值映射到 HashMap 的 Key,可以在 O(1) 的時(shí)間復(fù)雜度內(nèi)返回結(jié)果,具有高效的優(yōu)點(diǎn)。但是 HashMap 的實(shí)現(xiàn)也存在一些不足,例如存儲(chǔ)容量占比較高??紤]到負(fù)載因子的存在,通常需要預(yù)留一定的空間,導(dǎo)致實(shí)際空間不能被完全利用。例如,如果有一個(gè)1000萬(wàn)大小的 HashMap,以String類(lèi)型為Key(長(zhǎng)度不超過(guò)16個(gè)字符,且非常少重復(fù)),以Integer類(lèi)型為Value,需要占據(jù)多少空間呢?實(shí)際上,它將占用1.2GB內(nèi)存。相比之下,存儲(chǔ)1000萬(wàn)個(gè)int類(lèi)型的數(shù)據(jù)只需要大約40MB空間,占比僅為3%;而存儲(chǔ)1000萬(wàn)個(gè)Integer類(lèi)型的數(shù)據(jù)則需要約161MB空間,占比高達(dá)13.3%。因此,一旦數(shù)據(jù)量增大到數(shù)億級(jí)別,HashMap 所占據(jù)的內(nèi)存大小將變得非常可觀(guān)。

如果整個(gè)網(wǎng)頁(yè)黑名單系統(tǒng)包含100億個(gè)網(wǎng)頁(yè)URL,則簡(jiǎn)單的數(shù)據(jù)庫(kù)查找操作將非常費(fèi)時(shí),并且如果每個(gè)URL空間為64B,則整個(gè)系統(tǒng)需要的內(nèi)存空間將達(dá)到640GB,這對(duì)于一般的服務(wù)器來(lái)說(shuō)是一個(gè)非常大的需求,難以實(shí)現(xiàn)。

布隆過(guò)濾器

布隆過(guò)濾器簡(jiǎn)介

1970 年布隆提出了一種布隆過(guò)濾器的算法,用來(lái)判斷一個(gè)元素是否在一個(gè)集合中。
這種算法由一個(gè)二進(jìn)制數(shù)組和一個(gè) Hash 算法組成。

本質(zhì)上布隆過(guò)濾器是一種數(shù)據(jù)結(jié)構(gòu),比較巧妙的概率型數(shù)據(jù)結(jié)構(gòu)(probabilistic data structure),特點(diǎn)是高效地插入和查詢(xún),可以用來(lái)告訴你 “某樣?xùn)|西一定不存在或者可能存在”。

相比于傳統(tǒng)的 List、Set、Map 等數(shù)據(jù)結(jié)構(gòu),它更高效、占用空間更少,但是缺點(diǎn)是其返回的結(jié)果是概率性的,而不是確切的。

實(shí)際上,布隆過(guò)濾器被廣泛應(yīng)用于網(wǎng)頁(yè)黑名單系統(tǒng)、垃圾郵件過(guò)濾系統(tǒng)、爬蟲(chóng)網(wǎng)址判重系統(tǒng)等領(lǐng)域。Google 著名的分布式數(shù)據(jù)庫(kù) Bigtable 就使用了布隆過(guò)濾器來(lái)查找不存在的行或列,以減少磁盤(pán)查找的IO次數(shù)。此外,Google Chrome瀏覽器也使用布隆過(guò)濾器來(lái)加速安全瀏覽服務(wù)。

2023-06-11:redis中,如何在100個(gè)億URL中快速判斷某URL是否存在?

布隆過(guò)濾器的誤判問(wèn)題

?通過(guò)哈希計(jì)算得到的在數(shù)組上的位置并不一定代表元素真正存在于集合中

?誤判問(wèn)題的本質(zhì)是哈希沖突,即不同的元素可能哈希到相同的數(shù)組位置

?如果一個(gè)元素的哈希值不在數(shù)組中,則一定不存在于集合中,但是如果哈希值在數(shù)組中,則存在誤判的概率(誤判)

2023-06-11:redis中,如何在100個(gè)億URL中快速判斷某URL是否存在?

優(yōu)化方案

增大哈希數(shù)組的長(zhǎng)度,使其能夠容納更多的元素。需要根據(jù)集合大小和誤判率等因素,預(yù)估合適的數(shù)組長(zhǎng)度;

增加哈希函數(shù)的數(shù)量,以減少哈希沖突的概率。多個(gè)哈希函數(shù)可以讓元素哈希到多個(gè)位置上,從而降低誤判率。

2023-06-11:redis中,如何在100個(gè)億URL中快速判斷某URL是否存在?

布隆過(guò)濾器重要的三個(gè)公式

1.假設(shè)數(shù)據(jù)量為n,預(yù)期的失誤率為p(布隆過(guò)濾器大小和每個(gè)樣本的大小無(wú)關(guān))。

2.根據(jù)n和p,算出BloomFilter一共需要多少個(gè)bit位,向上取整,記為m。

3.根據(jù)m和n,算出BloomFilter需要多少個(gè)哈希函數(shù),向上取整,記為k。

4.根據(jù)修正公式,算出真實(shí)的失誤率p_true。

2023-06-11:redis中,如何在100個(gè)億URL中快速判斷某URL是否存在?

golang代碼如下:

package main

import (
	"fmt"
	"math"
)

func main() {
	p := 0.0001          //預(yù)期失誤率,萬(wàn)分之一
	n := 100_0000_0000.0 //數(shù)據(jù)量100億
	m := -n * math.Log(p) / (math.Ln2 * math.Ln2)
	m = math.Ceil(m)
	k := math.Ln2 * m / n
	k = math.Ceil(k)
	ptrue := math.Pow(1-math.Pow(math.E, -n*k/m), k)
	fmt.Println("比特位m:", int(m))
	fmt.Println("哈希函數(shù)個(gè)數(shù)k:", k)
	fmt.Printf("真實(shí)失誤率ptrue:%f%%\n", ptrue*100)
	fmt.Printf("占用空間:%fG\n", m/8/1024/1024/1024)
}

2023-06-11:redis中,如何在100個(gè)億URL中快速判斷某URL是否存在?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-479224.html

到了這里,關(guān)于2023-06-11:redis中,如何在100個(gè)億URL中快速判斷某URL是否存在?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 2023-06-13:統(tǒng)計(jì)高并發(fā)網(wǎng)站每個(gè)網(wǎng)頁(yè)每天的 UV 數(shù)據(jù),結(jié)合Redis你會(huì)如何實(shí)現(xiàn)?

    2023-06-13:統(tǒng)計(jì)高并發(fā)網(wǎng)站每個(gè)網(wǎng)頁(yè)每天的 UV 數(shù)據(jù),結(jié)合Redis你會(huì)如何實(shí)現(xiàn)?

    2023-06-13:統(tǒng)計(jì)高并發(fā)網(wǎng)站每個(gè)網(wǎng)頁(yè)每天的 UV 數(shù)據(jù),結(jié)合Redis你會(huì)如何實(shí)現(xiàn)? 答案2023-06-13: 如果統(tǒng)計(jì) PV (頁(yè)面瀏覽量)那非常好辦,可以考慮為每個(gè)網(wǎng)頁(yè)創(chuàng)建一個(gè)獨(dú)立的 Redis 計(jì)數(shù)器,并將日期添加為鍵(key)的后綴。當(dāng)網(wǎng)頁(yè)收到請(qǐng)求時(shí),對(duì)應(yīng)的計(jì)數(shù)器將被遞增。對(duì)于每天的

    2024年02月08日
    瀏覽(36)
  • 【linux】linux服務(wù)器判斷域名、IP、端口、URL是否有效

    【linux】linux服務(wù)器判斷域名、IP、端口、URL是否有效

    活動(dòng)詳情地址:話(huà)題挑戰(zhàn)賽第2期 參賽話(huà)題地址:運(yùn)維技術(shù)分享 在平時(shí)運(yùn)維過(guò)程中,經(jīng)常會(huì)遇到需要判斷地址是否有效的情況,比如: 1、服務(wù)器是否通外網(wǎng) 2、第三方提供的IP、端口是否能夠訪(fǎng)問(wèn) 3、對(duì)方域名是否能夠訪(fǎng)問(wèn) … 下面列舉幾種linux服務(wù)器常用的檢測(cè)方式 ? 描述

    2024年02月01日
    瀏覽(32)
  • Android,判斷是否快速點(diǎn)擊

    在Android控件中,如果快速點(diǎn)擊容易造成一些不同的bug,尤其是那種在click事件中方有耗時(shí)操作的代碼,容易引起anr,并且有些性能低的機(jī)器,在用戶(hù)點(diǎn)擊多次控件的時(shí)候很容易出現(xiàn)問(wèn)題,在車(chē)機(jī)中也會(huì)導(dǎo)致回彈的一系列問(wèn)題(這里面包括get到的信號(hào)導(dǎo)致回彈),針對(duì)于這種情

    2024年04月28日
    瀏覽(96)
  • windows11--判斷文件夾是否存在

    windows11--判斷文件夾是否存在

    不想全盤(pán)檢索,只是想判斷當(dāng)前文件夾下,是否存在名為xxx的子文件夾 打開(kāi)你要進(jìn)行搜索的文件夾 點(diǎn)擊上面的地址欄,輸入cmd,按下回車(chē)鍵,進(jìn)入cmd 界面 輸入 dir /b | find \\\"xxx文件名\\\" (補(bǔ)充:輸入 dir /b\\\" 可列出所有子文件的名字) 如果xxx文件存在,則返回xxx 如果xxx文件不存

    2024年01月21日
    瀏覽(95)
  • C++(11):判斷tuple是否含有某個(gè)類(lèi)型

    有的時(shí)候需要判斷tuple中是否有個(gè)某個(gè)類(lèi)型,可以借助變長(zhǎng)模板的遞歸調(diào)用方式進(jìn)行檢查: C++(11):變長(zhǎng)模板_變長(zhǎng)模板參數(shù) c++11-CSDN博客 另外還使用了true_type和false_type:

    2024年02月04日
    瀏覽(23)
  • redis中使用bloomfilter判斷元素是否存在

    redis中使用bloomfilter判斷元素是否存在

    由一個(gè)初始值為0的bit數(shù)組組成,和多個(gè)hash函數(shù)構(gòu)成,用來(lái)判斷集合中是否存在某個(gè)元素。 一個(gè)很長(zhǎng)的二進(jìn)制數(shù)組(00000000)+一系列隨機(jī)hash算法映射函數(shù)。主要用于判斷一個(gè)元素是否存在集合中。 本質(zhì):判斷一個(gè)數(shù)據(jù)是否存在一個(gè)大的集合中。有,可能有,無(wú)則一定沒(méi)有 一

    2024年02月15日
    瀏覽(503)
  • H5外部瀏覽器直接調(diào)起微信——通過(guò)url協(xié)議 weixin:// 判斷是否安裝微信及啟動(dòng)微信

    H5外部瀏覽器直接調(diào)起微信——通過(guò)url協(xié)議 weixin:// 判斷是否安裝微信及啟動(dòng)微信

    h5分享到微信,h5使用微信支付這些功能,都需要先判斷是否安裝微信客戶(hù)端,如果已安裝就啟動(dòng)微信,如果沒(méi)有安裝微信,就提示用戶(hù)前去安裝。 我們可以通過(guò)訪(fǎng)問(wèn)微信提供的URL協(xié)議(weixin://)來(lái)實(shí)現(xiàn)這個(gè)功能,代碼如下: 示例代碼: 擴(kuò)展: 同樣,通過(guò)上邊的方法,也可

    2024年02月06日
    瀏覽(98)
  • C語(yǔ)言判斷一個(gè)數(shù)是否是質(zhì)數(shù)的幾種常用方法(求100-1000以?xún)?nèi)的所有質(zhì)數(shù))

    要用代碼判斷一個(gè)數(shù)是否是質(zhì)數(shù),首先我們需要知道什么什么數(shù)稱(chēng)之為質(zhì)數(shù)。質(zhì)數(shù)又稱(chēng)素?cái)?shù)。一個(gè)大于1的自然數(shù),除了1和它自身外,不能被其他自然數(shù)整除的數(shù)叫做質(zhì)數(shù);否則稱(chēng)為合數(shù)(規(guī)定1既不是質(zhì)數(shù)也不是合數(shù))。 以下有三種方法判定質(zhì)數(shù): 通過(guò)從2到n-1每個(gè)數(shù)均整除

    2024年02月08日
    瀏覽(99)
  • Java 快速判斷一個(gè) IP 是否在給定的網(wǎng)段內(nèi)

    Java 快速判斷一個(gè) IP 是否在給定的網(wǎng)段內(nèi)

    要在 Java 中判斷一個(gè) IP地址 是否在給定的網(wǎng)段內(nèi),可以使用 子網(wǎng)掩碼 將 IP地址 和 子網(wǎng)掩碼 進(jìn)行 與操作 來(lái)提取網(wǎng)絡(luò)地址,并將其與給定的子網(wǎng)地址進(jìn)行比較。 下面的例子 由強(qiáng)大的 ChatGPT 提供 。 代碼如下所示(子網(wǎng)掩碼的計(jì)算可以截取字符串后,借助底部的算法進(jìn)行獲得

    2024年02月02日
    瀏覽(91)
  • C語(yǔ)言--編寫(xiě)函數(shù)判斷一個(gè)數(shù)是否為素?cái)?shù),在主函數(shù)中調(diào)用該函數(shù)輸出100以?xún)?nèi)的全部素?cái)?shù)。

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包