Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1236|回复: 0
打印 上一主题 下一主题

Redis缓存穿透原理与解决方案

[复制链接]

697

主题

1142

帖子

4086

积分

认证用户组

Rank: 5Rank: 5

积分
4086
跳转到指定楼层
楼主
发表于 2019-1-15 17:31:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
为什么使用数据缓存
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





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-5 13:06 , Processed in 0.074397 second(s), 22 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表