Redis 缓存击穿原理及解决方案
为什么要使用数据缓存?
为什么把数据库的数据放在内存中?
内存速度比磁盘快
可以减少数据库的压力
指标计算的sql很复杂时,可以把结果放在内存中,避免复杂的sql重复查询
为什么不用HashMap做缓存,以及HashMap和Redis的区别?
持久化
存储大小
本地与分布式
API
更丰富的数据结构
过期策略
Redis为什么快?
单线程的多路复用 epoll
内存
Redis缓存击穿什么时候发生?
查询一个必然不存在的数据。每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成影响。
产生问题:
要避免从数据库查询不存在的数据,怎么做?
如何从海量数据中快速判断一个元素是否存在?
如果一个网站有100亿url有一个url存在黑名单中,每条url平均64个字节
1)这个黑名单要怎么存?
2)若此时任意输入一个url,如何判断url是否在这个黑名单中?
解决办法:
布隆过滤器
布隆过滤器使用
1.离线数据加载到布隆过滤器
2.布隆过滤器查询
3.布隆过滤器不存在,直接返回
4.布隆过滤器存在,cache不存在,从数据库查询
5.数据返回
布隆过滤器的本质
1.位数组(二进制向量)
2.一系列随机映射函数
存储什么? 0或1
怎么存储? hash()计算index
怎么快速判断是否存在?布隆过滤器
什么时候出现误判? 哈希碰撞
误判以后会发生什么?不存在的认为存在
怎么减少误判率?m(位数组长度) k(哈希函数的个数)
特性
存在一定的误判率
特点
如果布隆过滤器判断元素存在集合中,元素可能不存在
如果布隆过滤器判断元素不存在,一定不存在
如果元素实际存在,布隆过滤器一定判断存在
如果元素实际不存在,布隆过滤器可能判断存在
为什么用哈希函数?
哈希函数经过计算后都会得到一个相同长度的结果