redis缓存击穿、穿透、雪崩及衍生问题(学习记录2022/10/19)

骐骥一跃,不能十步。驽马十驾,功在不舍!

文章目录

  • 前言
  • 一、redis缓存击穿、穿透、雪崩
  • 二、布隆过滤器
  • 三、cpu缓存命中率
  • 总结及遗留问题


前言

好记性不如烂笔头

以前也学懂了挺多“复杂”的知识,但是过段时间再回忆忘得,干干净净。突发奇想开始写学习记录。加油!


一、redis缓存击穿、穿透、雪崩

1.雪崩:大量热点key同时失效,比如淘宝首页,访问量巨大,肯定要走缓存。这样数据库瞬间压力激增。

解决方式:设置key不过期,或者随机在一个区间时间内过期比如2-3小时过期,随机的话,出现同时过期概率就小了。

2.击穿:某个热点key失效,瞬间大量请求给到数据库。

解决方式:设置key不过期,或者用锁、只让一个请求去查数据库,别的线程先等待,然后从缓存读取。

3.穿透:某个key不存在,比如id=-1,用户(黑客)频繁请求这个key,导致一直访问数据库。黑客穿透redis打到数据库。

解决方式:在缓存中写入这个key。eg:key=-1 val=null。或者用布隆过滤器(后面有)。

https://blog.csdn.net/lannijiang/article/details/120783538

二、布隆过滤器

布隆过滤器的作用是判断一个元素是否在集合中

这个时候我就想到了一些场景:
黑名单、白名单、防止穿透等等过滤场景。

那么问题就来了,为什么要用布隆过滤器,别的集合Set等等也可以呀:
Bloom Filter是一种是一种空间效率高的概率型数据结构,专门用于判断某个元素是否存在于一个超大集合(亿级)

布隆过滤器是一个很长的二进制数组、把一个值放入布隆过滤器,会经过多次hash。
假设我们经过三次哈希,存的二进制数组下标为1,3,7,就将这三个下标的元素改为1。
如果这三个数组的下标对应的元素都为1 则表示存在该商品,放行这次请求。如果有一个为0,则不存在该商品。
redis缓存击穿、穿透、雪崩及衍生问题(学习记录2022/10/19)_第1张图片

布隆过滤器判断存在、不一定存在、但是判断不存在、一定不存在。
布隆过滤器对这种误判率称之为假阳性概率,即:False Positive Probability,简称为fpp。
提高正确率有两种方式、一是增加数组的长度、二是增加hash的次数(最好写代码测试一下)。
要降低fpp必然要牺牲执行时间(hash次数)、存储空间(数组长度)。这让我联想到了hashmap的负载因子,0.75。挺有意思,负载因子决定了hashmpa的扩容机制。当负载因子为0.5时空间利用率太低,当为1时哈希冲突又太频繁。所以这个fpp也要根据实际业务去把控。
所以布隆过滤器的缺点就是不适用于结果绝对准确的场景、无法删除元素(一个元素经过多次hash将多个下标的值改为了1,会存在多个元素公用一个下表的情况)、cpu缓存命中率低(挺有意思哈、下一项介绍)
https://blog.csdn.net/qq_40179653/article/details/125716731

三、cpu缓存命中率

1.什么是cpu缓存
cpu缓存介于cpu和内存之间、在没接触cpu缓存之前、我认为cpu拿数据是这样的:cpu-》内存-》磁盘
其实是这样:cpu-》一级缓存-》-》二级缓存-》三级缓存-》内存
2.为什么搞这么多缓存、访问速度从左到右递减、容量空间从左到右递增。所以越是热的数据越往前放。
3.一二三级缓存合称高速缓存。
4.上文说到缓存命中率低、其实就是对某一个元素进行多次hash、所得到值比较分散、比如1、10000、10000000这种情况。从而无法很好的利用缓存机制。
5.。。。。。。这张图是我切的、我记一下快捷键win+shift+s、以免下次切的时候忘了。
6.一般来说,每级缓存的命中率大概都在80%左右(这么恐怖吗?有时间我要再往深看看),也就是说全部数据量的80%都可以在一级缓存中找到,只剩下20%的总数据量才需要从二级缓存、三级缓存或内存中读取,由此可见一级缓存是整个CPU缓存架构中最为重要的部分。
redis缓存击穿、穿透、雪崩及衍生问题(学习记录2022/10/19)_第2张图片

百度、cpu三级缓存、cpu三级缓存硬件结构等等。

总结及遗留问题

1.基于布隆过滤器的缺点又出了个布谷鸟过滤器,这个必须要学的。
2.cpu的结构。
3.redis其他的知识。

你可能感兴趣的:(缓存,redis,学习)