redis缓存使用过程中的问题
- 问题一:
- 情景:文件生成及下载时,为了防止相同文件重复生成,占用系统内存,可以将文件的唯一标识+路径保存在redis内,这样在下载具有相同唯一标识的文件时,只需要拿到文件路径,就能直接下载了。
- 问题:如果服务器重启,或者重新部署,导致文件不存在,而redis缓存仍然存在。那么文件下载就会一直报错。
- 解决:下载时不仅要判断缓存是否有效,还要判断文件是否存在,如果不存在,就要重新生成。
redis做分布式事务需要考虑的点:
- 锁。
- 锁过期时间。
- 锁过期时间的延续。
- 跨线程释放锁问题。
redis缓存击穿,缓存穿透,缓存雪崩
redis的bloom过滤器:
定义:
一个初始值为零的bit数组和多个哈希函数构成,用来快速判断集合中是否存在某个元素。不一定100%准确:
- 可能存在集合中。
- 一定不存在集合中。
代码:
/**
* 使用Redisson生成布隆过滤器
*/
//过滤器名称
String filterName = "myBloomFilter";
RBloomFilter<Long> bloomFilter = redissonClient.getBloomFilter(filterName);
//设置容量,误判率
bloomFilter.tryInit(1000, 0.01);
//bloom存入数据
bloomFilter.add("orderID");
//判断是否存在:
if(bloomFilter.contains("orderID")){
System.out.print("orderID存在于布隆过滤器中");
}else{
System.out.println("orderID不存在于布隆过滤器中")
}
使用:
使用bool过滤器判断数据是否为空,如果为空,则直接取缓存拿,如果不为空,则判定为无效请求。用以解决缓存穿透、用户黑名单等问题。短时间内同一请求达到某个值时,存入bool过滤器
数据类型:
bitMap。
redis.setbit("","")1:存在,0:不存在。
比较(布谷鸟)
- 查询性能相对弱。
- 空间利用率相对低。
- 不支持反向操作。
- 不支持计数。