上一篇演示了通過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);
}
}
}
}