使用jedis連接redis-cluster實現純redis實現的bloom過濾器

上一篇演示了通過jedis的api進行多個發佈訂閱消息的案例,本篇演示使用jedis連接redis-cluster實現純redis實現的bloom過濾器。

package com.coderman.jedis.clusterdemo.bloomfilter;

import com.coderman.jedis.clusterdemo.ClusterTest;
import org.junit.Test;

import java.util.BitSet;
import java.util.Random;

/**
 * @Author fanchunshuai
 * @Date 2020/1/7 11
 * @Description:
 * 純redis實現的bloom過濾器
 */
public class RedisBloomFilterTest extends ClusterTest {
    //新年第一天登錄
    private String key1 = "loginuser:2020:01:01";
    private String key2 = "loginuser:2020:01:02";
    private String key3 = "loginuser:2020:01:03";

    /**
     * 初始化登錄人員數據
     */
    @Test
    public void addBit(){
        Random random = new Random();
        for (int i = 0;i< 10000;i++){
            //十萬位登錄用戶隨機登錄
            cluster.setbit(key1,random.nextInt(100000),true);
            cluster.setbit(key2,random.nextInt(100000),true);
            cluster.setbit(key3,random.nextInt(100000),true);
        }
        System.out.println("隨機數據生成完成");
    }


    /**
     * 獲取登錄用戶數
     */
    @Test
    public void getUniqueCount(){
        BitSet loginUser = BitSet.valueOf(cluster.get(key1.getBytes()));
        long count1 = loginUser.cardinality();
        System.out.println("count1 = "+count1);
        BitSet loginUser2 = BitSet.valueOf(cluster.get(key2.getBytes()));
        long count2 = loginUser2.cardinality();
        System.out.println("count2 = "+count2);

        BitSet loginUser3 = BitSet.valueOf(cluster.get(key3.getBytes()));
        long count3 = loginUser3.cardinality();
        System.out.println("count3 = "+count3);
    }


    /**
     * 獲取三天內所有登錄過的用戶數
     */
    @Test
    public void getAllLoginCount(){
        BitSet loginUser = BitSet.valueOf(cluster.get(key1.getBytes()));
        BitSet loginUser2 = BitSet.valueOf(cluster.get(key2.getBytes()));
        BitSet loginUser3 = BitSet.valueOf(cluster.get(key3.getBytes()));
        //並集運算
        loginUser3.or(loginUser2);
        loginUser3.or(loginUser);
        long count3 = loginUser3.cardinality();
        System.out.println("count3 = "+count3);
    }

    /**
     * 獲取三天內每天都登錄過的用戶數
     */
    @Test
    public void getEveryLoginCount(){
        BitSet loginUser = BitSet.valueOf(cluster.get(key1.getBytes()));
        BitSet loginUser2 = BitSet.valueOf(cluster.get(key2.getBytes()));
        BitSet loginUser3 = BitSet.valueOf(cluster.get(key3.getBytes()));
        //交集運算
        loginUser3.and(loginUser2);
        loginUser3.and(loginUser);
        long count3 = loginUser3.cardinality();
        System.out.println("count3 = "+count3);
    }

    @Test
    public void testGetIsExit(){
        for (long i = 0;i < 10000;i++) {
            //判斷10000位用戶是否存在
            boolean b =  cluster.getbit(key2,i);
            if(b){
                System.out.println("login userid = "+i);
            }
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章