基于redis(key分段,避免一个key过大) 和db实现的 布隆过滤器(解决hash碰撞问题)...

以下是简易的代码例子:

package six.com.crawler.work.space;

import java.util.Objects;

import redis.clients.jedis.Jedis;

public class RedisAndDbBloomFilter {

    private String nameSpace;
    private Jedis jedis;
    private int fixSize;
    
    public RedisAndDbBloomFilter(String nameSpace,Jedis jedis,int fixSize){
        this.nameSpace=nameSpace;
        this.jedis=jedis;
        this.fixSize=fixSize;
    }
    
    private int getHash(String key){
        return key.hashCode();
    }
    
    private void addToDb(int hash,String key){
        //TODO 将记录保存至db
    }
    
    private boolean containsFromDb(int hash,String key){
        //TODO 根据 hash key 查询数据库是否存在
        return false;
    }
    
    /**
     * 根据hash和fixSize 算出bitKey
     * @param hash
     * @return
     */
    private String getBitKey(int hash){
        int bitKeyIndex=hash/fixSize;
        String bitKey=nameSpace+bitKeyIndex;
        return bitKey;
    }
    /**
     * 判断给定的key是否存在
     * @param key
     * @return
     */
    public boolean contains(String key){
        //TODO 如果是集群模式这里需要分布式锁,如果是单机这里需要线程锁
        Objects.requireNonNull(key, "the key must not be null");
        int hash=getHash(key);
        int offset=hash%fixSize;
        String bitKey=getBitKey(hash);
        Boolean result=jedis.getbit(bitKey,offset);
        if(result.booleanValue()&&containsFromDb(hash, key)){
            return true;
        }
        return false;
    }
    
    /**
     * 根据给定的key添加一个过滤记录
     * @param key
     */
    public void addRecord(String key){
        //TODO 如果是集群模式这里需要分布式锁,如果是单机这里需要线程锁
        int hash=getHash(key);
        int offset=hash%fixSize;
        String bitKey=getBitKey(hash);
        jedis.setbit(bitKey,offset, true);
        addToDb(hash, key);
    }    
}
 

转载于:https://my.oschina.net/u/3402193/blog/1489277

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值