大厂五剑客之redis实战分布式缓存彻底解决方案---13----布隆过滤器等----二周目

15 篇文章 0 订阅

 

缓存击穿。

 

存的是数据的hashCode的内存。

布隆过滤器和set和map是平级的,是判断一定不存在还是可能存在的数据结构。

key进来多个hash进行散列映射。有一个没有映射上的就是一定不存在的。

布隆过滤器:https://www.jianshu.com/p/2104d11ee0a2

------------------------------------------------------01-----------------02------------------------------------------

需求:

代码:

第一步:引入包

第二步:启动加载到内存

@Service
public class BloomFilterService {

    @Resource
    private SysUserMapper sysUserMapper;

    private BloomFilter<Integer> bf;

    /***
     * PostConstruct 程序启动时候加载此方法
     */
    @PostConstruct
    public void initBloomFilter() {
        SysUserExample sysUserExample = new SysUserExample();
        // 在数据库lload出所有的数据
        List<SysUser> sysUserList = sysUserMapper.selectByExample(sysUserExample);
        if(CollectionUtils.isEmpty(sysUserList)){
            return;
        }
        //创建布隆过滤器(默认3%误差)
        bf = BloomFilter.create(Funnels.integerFunnel(),sysUserList.size());
        for (SysUser sysUser:sysUserList) {
            bf.put(sysUser.getId());
        }
    }

    /***
     * 判断id可能存在于布隆过滤器里面
     * @param id
     * @return
     */
    public boolean userIdExists(int id){
        return bf.mightContain(id);
    }

}

测试:略。

------------------------------------------------------03-----------------------------------------------------------

redis布隆过滤器与google布隆过滤器。

------------------------------------------------------03-----------------------------------------------------------

注意我们在131上安装布隆过滤器了。

Centos7安装git:https://blog.csdn.net/xiaoye319/article/details/89642875

改为这个redis:

安装布隆过滤器:

杀掉redis不能kill:

在redis.conf加入这个路径:loadmodule /usr/local/apps/rebloom/redisbloom.so(44)

注意主从模式的话都要加的。

连上6380。 ./redis-cli -h 127.0.0.1 -p 6380 -a "123456"

BF.ADD bloom redis
BF.EXISTS bloom redis
BF.EXISTS bloom nonxist

测试:

---------------------------------------------------05-----------------------------------------------------------

redis地址:

 redis:
      host: 192.168.244.131
      port: 6380
      password: 123456

redis在4.0才推出整合布隆过滤器的插件。

我们去github去搜索。

用哨兵模式实现布隆过滤器。

代码:

第一步:

 public Boolean bloomFilterAdd(int value){
        DefaultRedisScript<Boolean> bloomAdd = new DefaultRedisScript<>();
        bloomAdd.setScriptSource(new ResourceScriptSource(new ClassPathResource("bloomFilterAdd.lua")));
        bloomAdd.setResultType(Boolean.class);
        List<Object> keyList= new ArrayList<>();
        keyList.add(bloomFilterName);
        keyList.add(value+"");
        Boolean result = (Boolean) redisTemplate.execute(bloomAdd,keyList);
        return result;
    }
 public Boolean bloomFilterExists(int value){
        DefaultRedisScript<Boolean> bloomExists= new DefaultRedisScript<>();
        bloomExists.setScriptSource(new ResourceScriptSource(new ClassPathResource("bloomFilterExist.lua")));
        bloomExists.setResultType(Boolean.class);
        List<Object> keyList= new ArrayList<>();
        keyList.add(bloomFilterName);
        keyList.add(value+"");
        Boolean result = (Boolean) redisTemplate.execute(bloomExists,keyList);
        return result;
    }

第二步如上,和谷歌的用法是一样的。

lua脚本:

local bloomName = KEYS[1]
local value = KEYS[2]

-- bloomFilter
local result_1 = redis.call('BF.ADD', bloomName, value)
return result_1
local bloomName = KEYS[1]
local value = KEYS[2]

-- bloomFilter
local result_1 = redis.call('BF.EXISTS', bloomName, value)
return result_1

---------------------------------------------------------------06--------------------------------------------------------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值