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(哈希函数的个数)

特性

存在一定的误判率

特点

如果布隆过滤器判断元素存在集合中,元素可能不存在

如果布隆过滤器判断元素不存在,一定不存在

如果元素实际存在,布隆过滤器一定判断存在

如果元素实际不存在,布隆过滤器可能判断存在

为什么用哈希函数?

哈希函数经过计算后都会得到一个相同长度的结果

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐