缓存击穿。
存的是数据的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--------------------------------------------------------