firemail

标题: Redis缓存穿透原理与解决方案 [打印本页]

作者: java    时间: 2019-1-15 17:31
标题: Redis缓存穿透原理与解决方案
为什么使用数据缓存
1、读写快高性能2、常用的数据(节省计算时间) 3、减轻数据库压力 4、分布式的一致性问题

为什么不用HashMap做缓存?
更新丰富的数据结构
只能同一个进程 本地与分布工的差别




缓存和数据库都不存在 : 缓存穿透
如何解决
数据库不存在,也在缓存中存入一下特定值(null) 要加缓存时间


如何在海量元素中(如10亿无序\不定长\不重复)
快速判断一个元素是否存在?

把10亿数据加载到内存中?用什么结构?

解决方案:元素-->映射--->byte数组特定位置

BitMap(位图)
BitSet java实现

元素要和位图位置固定  映射方法?
1.输出长度相同
2.均匀分布

Hash Function

怎么减少哈希碰碰撞?
1.进行多次hash
2.扩大位图容量
在1和2中取一个平衡点
布隆过滤器

初始扫一遍库加载?效率


布隆过滤器容量比实际元素要大很多,防止都是1


成熟的布隆过滤器
Guava(Rate Limter)  Google开源工具包

根据你提供的误判率参数来决定 要扩容 还是增加hash映射函数

hash碰撞是不可避免的

所的线程都查库 加锁
synchronized(rand){
    ...
}

1000个线程 同时连接数据库查询,数据库连接线程池溢出,出错,用布隆过滤器过滤点一些一定不存在的情况.

如何解决数据库数据与BloomFilter的数据实时一致性?
新增加少,直接 调用 bf.put
删除少  直接 调用? 没看到有删除的方法
因为有hash冲突

删除元素  增加计数器 Countting 在没有冲突时它的值就变成0
Counting Bloom Filter 带删除功能的布隆过滤器

hashmap是如何解决  连表 树

海量元素中过滤实例
爬虫 url
垃圾邮箱 Spamer










欢迎光临 firemail (http://firemail.wang:8088/) Powered by Discuz! X3