最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis實(shí)現(xiàn)布隆過濾器的代碼詳解

 更新時(shí)間:2023年07月11日 09:38:03   作者:怪?咖@  
布隆過濾器(Bloom?Filter)是Redis?4.0版本提供的新功能,它被作為插件加載到Redis服務(wù)器中,給Redis提供強(qiáng)大的去重功能,本文將給大家詳細(xì)介紹一下Redis布隆過濾器,文中有相關(guān)的代碼示例,需要的朋友可以參考下

一、前言

布隆過濾器(Bloom Filter)是 Redis 4.0 版本提供的新功能,它被作為插件加載到 Redis 服務(wù)器中,給 Redis 提供強(qiáng)大的去重功能。

相比于 Set 集合的去重功能而言,布隆過濾器在空間上能節(jié)省 90% 以上,但是它的不足之處是去重率大約在 99% 左右,也就是說有 1% 左右的誤判率,這種誤差是由布隆過濾器的自身結(jié)構(gòu)決定的。俗話說“魚與熊掌不可兼得”,如果想要節(jié)省空間,就需要犧牲 1% 的誤判率,而且這種誤判率,在處理海量數(shù)據(jù)時(shí),幾乎可以忽略。

二、RedisBloom 安裝與使用

(1)第一步:安裝Redis

關(guān)于Linux當(dāng)中redis的安裝:Linux上安裝Redis詳細(xì)教程_Redis_腳本之家 (jb51.net)

(2)第二步:安裝RedisBloom

在 Redis 4.0 版本之后,布隆過濾器才作為插件被正式使用。布隆過濾器需要單獨(dú)安裝,可以去GitHub,找到對(duì)應(yīng)的版本下載,鏈接:Releases · RedisBloom/RedisBloom (github.com),下載后再通過xftp上傳到Linux系統(tǒng)里,當(dāng)然也可以直接通過wget來下載。

這里注意我下載的2.2.18版本,最新版本2.6我沒有用,原因是make編譯的時(shí)候會(huì)報(bào)異常。

# 下載
wget https://codeload.github.com/RedisBloom/RedisBloom/tar.gz/refs/tags/v2.2.18
# 解壓
tar -zxvf v2.2.18

# 進(jìn)入到解壓目錄
cd RedisBloom-2.2.18/
# 編譯
make

編譯成功,可以看到redisbloom.so文件

(3)第三步:Redis集成RedisBloom插件

在redis.conf配置文件中加入如RedisBloom的redisbloom.so文件的地址

# vim查看redis.conf
vim /opt/redis-stable/redis.conf
# 在文件后面加上如下配置
loadmodule /opt/RedisBloom-2.2.18/redisbloom.so

(4)第四步: 重啟Redis進(jìn)行測(cè)試

# 關(guān)閉redis
ps -ef | grep redis | awk -F" " '{print $2;}' | xargs kill -9
# 啟動(dòng)redis
/opt/redis-stable/src/redis-server redis.conf
# 連接客戶端
/opt/redis-stable/src/redis-cli -c -h 127.0.0.1 -p 6379 -a 123456

三、RedisBloom 常用命令匯總

127.0.0.1:6379> bf.add spider:url www.baidu.net
(integer) 1
127.0.0.1:6379> bf.exists spider:url www.baidu.net
(integer) 1
127.0.0.1:6379> bf.madd spider:url www.taobao.com www.123qq.com
1) (integer) 1
2) (integer) 1
127.0.0.1:6379> bf.mexists spider:url www.jd.com www.taobao.com
1) (integer) 0
2) (integer) 1

注意使用AnotherRedisDesktopManager客戶端是沒辦法查看該數(shù)據(jù)類型的值的。

四、通過 Jedis 使用 RedisBloom

Java 客戶端 Jedis沒有提供指令擴(kuò)展機(jī)制,所以你無法直接使用 Jedis 來訪問Redis Module 提供的 bf.xxx 指令。RedisLabs 提供了一個(gè)單獨(dú)的包 JReBloom,但是它是基于 Jedis的。

我們使用的話只需要引入JReBloom就可以,JReBloom內(nèi)部引用了Jedis 。假如系統(tǒng)引用了jedis,又要引用jrebloom,這時(shí)候需要注意版本沖突的問題。

<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>3.9.0</version>
</dependency>
<dependency>
	<groupId>com.redislabs</groupId>
	<artifactId>jrebloom</artifactId>
	<version>2.2.2</version>
</dependency>

代碼示例:

import io.rebloom.client.Client;
import redis.clients.jedis.Jedis;
public class JrebloomDemo {
    public static void main(String[] args) {
        //連接本地的 Redis 服務(wù)
        Jedis jedis = new Jedis("192.168.115.239", 6379);
        //jedis.auth("123456");
        //創(chuàng)建client也支持連接池的:public Client(Pool<Jedis> pool)
        Client client = new Client(jedis);
        // 測(cè)試數(shù)據(jù)
        int capacity = 10000;
        // 容錯(cuò)率,只能設(shè)置0 < error rate range < 1  不然直接會(huì)異常!
        double errorRate = 0.01;
        // 測(cè)試的key值
        String key = "ceshi";
        // 創(chuàng)建過濾器:可以創(chuàng)建指定位數(shù)和容錯(cuò)率的布隆過濾器,如果過濾器已經(jīng)存在創(chuàng)建的話就會(huì)異常
        if (!jedis.exists(key)) {
            client.createFilter(key, capacity, errorRate);
        }
        for (int i = 0; i < capacity; i++) {
            client.bfInsert(key, String.valueOf(i));
        }
        System.out.println("存入元素為=={" + capacity + "}");
        // 統(tǒng)計(jì)誤判次數(shù)
        int count = 0;
        // 我在數(shù)據(jù)范圍之外的數(shù)據(jù),測(cè)試相同量的數(shù)據(jù),判斷錯(cuò)誤率是不是符合我們當(dāng)時(shí)設(shè)定的錯(cuò)誤率
        for (int i = capacity; i < capacity * 2; i++) {
            if (client.exists(key, String.valueOf(i))) {
                count++;
            }
        }
        System.out.println("誤判元素為=={" + count + "}");
        // 刪除過濾器
        client.delete(key);
    }
}

運(yùn)行示例:

現(xiàn)在存在個(gè)問題,假如我們r(jià)edis并沒有安裝RedisBloom,那他可以運(yùn)行嗎?

答案是不可以的,他根本無法識(shí)別bf.xxx 指令

錯(cuò)誤率越低,所需要的空間也會(huì)越大,因此就需要我們盡可能精確的估算元素?cái)?shù)量,避免空間的浪費(fèi)。我們也要根據(jù)具體的業(yè)務(wù)來確定錯(cuò)誤率的許可范圍,對(duì)于不需要太精確的業(yè)務(wù)場(chǎng)景,錯(cuò)誤率稍微設(shè)置大一點(diǎn)也可以。

查看剛剛創(chuàng)建的過濾器:這個(gè)數(shù)據(jù)結(jié)構(gòu)不支持get查詢。

五、Redisson 封裝的布隆過濾器

Redisson布隆過濾器官網(wǎng)介紹:6. 分布式對(duì)象 · redisson/redisson Wiki · GitHub

引入依賴:

<dependency>
	<groupId>org.redisson</groupId>
	<artifactId>redisson</artifactId>
	<version>3.22.1</version>
</dependency>

代碼示例:

import org.redisson.Redisson;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
public class RedissonBloomFilter {
    public static void main(String[] args) {
        Config config = new Config();
        config.useSingleServer()
                .setAddress("redis://127.0.0.1:6379")
                //.setPassword("123456")
                .setDatabase(0);
        //獲取客戶端
        RedissonClient redissonClient = Redisson.create(config);
        // 測(cè)試數(shù)據(jù)
        int capacity = 10000;
        // 容錯(cuò)率,只能設(shè)置0 < error rate range < 1  不然直接會(huì)異常!
        double errorRate = 0.01;
        // 測(cè)試的key值
        String key = "ceshi";
        RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter(key);
        // 初始化布隆過濾器,預(yù)計(jì)統(tǒng)計(jì)元素?cái)?shù)量為10000,期望誤差率為0.01
        bloomFilter.tryInit(capacity, errorRate);
        for (long i = 0; i < capacity; i++) {
            bloomFilter.add(String.valueOf(i));
        }
        System.out.println("存入元素為=={" + capacity + "}");
        // 統(tǒng)計(jì)誤判次數(shù)
        int count = 0;
        // 我在數(shù)據(jù)范圍之外的數(shù)據(jù),測(cè)試相同量的數(shù)據(jù),判斷錯(cuò)誤率是不是符合我們當(dāng)時(shí)設(shè)定的錯(cuò)誤率
        for (int i = capacity; i < capacity * 2; i++) {
            if (bloomFilter.contains(String.valueOf(i))) {
                count++;
            }
        }
        System.out.println("誤判元素為=={" + count + "}");
        // 刪除過濾器
        // bloomFilter.delete();
    }
}

運(yùn)行結(jié)果:

通過運(yùn)行結(jié)果不難發(fā)現(xiàn),同樣是10000數(shù)據(jù),和0.01容錯(cuò),Redisson 實(shí)現(xiàn)的布隆過濾器明顯沒有基于RedisBloom的過濾器容錯(cuò)率好。

查看剛剛創(chuàng)建的過濾器:

六、使用哪種方式的過濾器比較好?

RedisBloom和Redisson實(shí)現(xiàn)的過濾器區(qū)別:

  • 數(shù)據(jù)結(jié)構(gòu): RedisBloom相當(dāng)于為了實(shí)現(xiàn)過濾器而新增了一個(gè)數(shù)據(jù)結(jié)構(gòu),而Redisson是基于redis原有的bitmap位圖數(shù)據(jù)結(jié)構(gòu)來通過硬編碼實(shí)現(xiàn)的過濾器。
  • 存儲(chǔ): 存儲(chǔ)兩者其實(shí)并沒有差距,都沒有存儲(chǔ)原數(shù)據(jù),我使用Redisson存儲(chǔ)了10000條數(shù)據(jù)然后設(shè)置的0.01容錯(cuò)占用了11.7kb也符合布隆過濾器的占用。

  • 容錯(cuò): 同樣是10000條數(shù)據(jù)0.01容錯(cuò),RedisBloom誤判元素是58,Redisson實(shí)現(xiàn)的是227。
  • 耦合度: 使用RedisBloom就需要安裝RedisBloom,如果不安裝RedisBloom程序直接就不能使用了,而使用Redisson他只依賴于redis。
  • 分片: RedisBloom只是redis一種數(shù)據(jù)結(jié)構(gòu),本身redis集群就是支持分片的,所以RedisBloom肯定也沒問題,Redisson的布隆過濾器也支持分片,但是需要付費(fèi)。
  • 性能: 使用 redis 的位圖來實(shí)現(xiàn)的布隆過濾器性能上要差不少。比如一次 exists 查詢會(huì)涉及到多次 getbit 操作,網(wǎng)絡(luò)開銷相比而言會(huì)高出不少。

綜上比較,個(gè)人建議使用RedisBloom比較好一點(diǎn)!

到此這篇關(guān)于Redis布隆過濾器用法詳解的文章就介紹到這了,更多相關(guān)Redis布隆過濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis的過期策略以及內(nèi)存淘汰機(jī)制詳解

    Redis的過期策略以及內(nèi)存淘汰機(jī)制詳解

    文章詳解Redis的過期策略(定時(shí)刪除、惰性刪除、定時(shí)掃描)和緩存淘汰算法(如LFU、LRU等),強(qiáng)調(diào)定時(shí)掃描通過隨機(jī)抽樣處理過期鍵,惰性刪除在訪問時(shí)清除過期鍵,同時(shí)指出需避免大量鍵同時(shí)過期,且主從同步延遲可能導(dǎo)致數(shù)據(jù)不一致,建議業(yè)務(wù)中合理設(shè)置過期時(shí)間與淘汰策略
    2025-08-08
  • redis.clients.jedis.exceptions.JedisDataException:?NOAUTH?Authentication?required數(shù)據(jù)操作異常的解決方法

    redis.clients.jedis.exceptions.JedisDataException:?NOAUTH?

    本文主要介紹了redis.clients.jedis.exceptions.JedisDataException:?NOAUTH?Authentication?required數(shù)據(jù)操作異常的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 如何使用redis的setnx實(shí)現(xiàn)分布式鎖

    如何使用redis的setnx實(shí)現(xiàn)分布式鎖

    Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在時(shí),為 key 設(shè)置指定的值,這篇文章主要介紹了使用redis的setnx實(shí)現(xiàn)分布式鎖,需要的朋友可以參考下
    2024-06-06
  • Redis Key過期刪除策略使用小結(jié)

    Redis Key過期刪除策略使用小結(jié)

    Redis通過惰性刪除和定期刪除策略管理過期數(shù)據(jù),結(jié)合內(nèi)存淘汰策略有效處理大量帶有過期時(shí)間的Key,確保高效性和穩(wěn)定性,下面就來介紹一下如何使用,感興趣的可以了解一下
    2026-02-02
  • Redis連接池配置方式

    Redis連接池配置方式

    文章介紹了Redis連接池的配置方法,包括與數(shù)據(jù)庫連接時(shí)引入連接池的必要性、Java中使用Redis連接池的示例、jar包準(zhǔn)備、編寫配置代碼以及連接池參數(shù)的設(shè)置
    2024-12-12
  • Redis?緩存淘汰策略和事務(wù)實(shí)現(xiàn)樂觀鎖詳情

    Redis?緩存淘汰策略和事務(wù)實(shí)現(xiàn)樂觀鎖詳情

    這篇文章主要介紹了Redis緩存淘汰策略和事務(wù)實(shí)現(xiàn)樂觀鎖詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Redis優(yōu)雅地實(shí)現(xiàn)延遲隊(duì)列的方法分享

    Redis優(yōu)雅地實(shí)現(xiàn)延遲隊(duì)列的方法分享

    Redisson是Redis服務(wù)器上的分布式可伸縮Java數(shù)據(jù)結(jié)構(gòu),這篇文中主要為大家介紹了Redisson實(shí)現(xiàn)的優(yōu)雅的延遲隊(duì)列的方法,需要的可以參考一下
    2023-02-02
  • 一文詳解如何使用Redis實(shí)現(xiàn)分布式鎖

    一文詳解如何使用Redis實(shí)現(xiàn)分布式鎖

    這篇文章主要介紹了一文詳解如何使用Redis實(shí)現(xiàn)分布式鎖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Redis 常用命令總結(jié)

    Redis 常用命令總結(jié)

    本文總結(jié)了Redis在開發(fā)中常用的基礎(chǔ)操作、String(字符串)、Hash(哈希)、List(列表)、Set(集合)、ZSet(有序集合)等等常用應(yīng)用場(chǎng)景,緩存場(chǎng)景、計(jì)數(shù)器、分布式鎖、排行榜、消息隊(duì)列、用戶標(biāo)簽等,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • Redis 緩存雙寫一致性的解決方案

    Redis 緩存雙寫一致性的解決方案

    本文主要介紹了Redis 緩存雙寫一致性的解決方案,包括CacheAsidePattern、ReadThrough/WriteThrough和WriteBehind三種模式,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02

最新評(píng)論

永善县| 科尔| 建德市| 会理县| 射阳县| 南京市| 历史| 伊川县| 安图县| 伊吾县| 旬邑县| 东乡族自治县| 龙泉市| 和硕县| 乌拉特中旗| 肃南| 宁化县| 阿城市| 河东区| 嘉兴市| 安仁县| 泾源县| 黔西| 高阳县| 耿马| 伊宁县| 瑞丽市| 崇礼县| 梨树县| 林甸县| 元朗区| 福建省| 赤城县| 云梦县| 宝鸡市| 佛山市| 福安市| 肥城市| 乌恰县| 航空| 阜阳市|