一、Redis持久化

1.1、Redis为什么要持久化

因为Redis完全基于内存,绝大部分请求是纯粹的内存操作,而内存就是断电则失。

1.2、Redis持久化方式有哪些

  • RDB:通过快照完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘
  • AOF:一秒一次,每一次去通过一个后台的线程fsync操作,将每条写入命令,写入到日志,并作为日志。以追加的方式方式写入一个日志文件中,所以没有任何磁盘寻址的开销,所以很快。

1.3、两种机制各自优缺点是什么

优点

RDB:

它每次储存会生成多个数据文件,每个数据文件分别都代表了某一时刻Redis里面的数据。一旦服务挂了,我们想恢复多少分钟之前的数据,就去拷贝一份之前的数据文件就行。RDBRedis的性能影响非常小,是因为在同步数据的时候他只是fork了一个子进程去做持久化的,而且他在数据恢复的时候速度比AOF来的快。

AOF:

RDB最快是一分钟一次生成快照,AOF是一秒同步一次数据。那么最多丢一秒的数据。同时AOF在对数据文件进行操作的时候是以追加的方式方式写入,只会有一个文件,所以它的写入性能惊人,文件也不容易破损。

缺点

RDB:

都是快照文件,都是默认五分钟才会生成一次,最快一分钟。这意味着你这次同步到下次同步这中间五分钟的数据都很可能全部丢失掉。AOF则最多丢一秒的数据,数据完整性上高下立判。

AOF:

一样的数据,AOF文件比RDB还要大。

1.4、两者机制怎么选择

全都使用,你单独用RDB你会丢失很多数据,你单独用AOF,你数据恢复没RDB来的快,如果出了问题,第一时间用RDB恢复,然后AOF做数据补全。

二、缓存穿透

2.1、什么是缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。

2.2、场景

Redis持久化和缓存穿透、击穿

数据库id都是大于0的,我一直用小于0的参数去请求你,每次都能绕开Redis直接打到数据库,数据库也查不到,每次都这样,并发高点就容易崩掉了

2.3、解决

  • 在接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等
  • 布隆过滤器

三、缓存击穿

3.1、什么是缓存击穿

缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。

3.2、解决

缓存击穿的话,设置热点数据永远不过期