老规矩来一段redis介绍(懂的略过):

Redis是一款内存高速缓存数据库;

数据模型为:key - value,非关系型数据库使用的存储数据的格式;

可持久化:将内存数据在写入之后按照一定格式存储在磁盘文件中,宕机、断电后可以重启redis时读取磁盘中文件恢复缓存数据;

分布式:当前任务被多个节点切分处理,叫做分布式处理一个任务。单个服务器内存,磁盘空间有限,无法处理海量的缓存数据,必须支持分布式的结构;

nosql:not only structured query language 不仅仅结构化查询语言

  结构化数据:有规律的一类数据;例如:人的信息,动物信息,考试信息

  非结构化数据:海量的不具备任何共同特性的数据集合;例如:网页,日志;图片

  关系型数据库:体现不同类结构化数据之间的关系的数据,例如ORACLE mysql

  非关系型数据库:存储的是非结构化的海量数据;无法体现数据的关系;例如 mongoDB redis

其次,你要知道缓存的流程:




redis查看存储 怎么看redis中缓存数据_数据


来来来,进入主题:

1.1 缓存雪崩

假如有一个系统,如果每天高峰期每秒 10000+ 个请求,但是缓存在高峰期可以只能承受每秒 6000 个请求,这时候缓存机器意外发生了全盘宕机(瞬间爆炸)。缓存挂了,此时 1 秒 好多个请求全部跑去请求数据库,数据库扛不住,它难受了,然后就崩了。此时,如果没有采用什么特别的方案来处理这个故障,数据库管理员采取重启数据库,但是数据库立马又被新的请求给制裁了。这就是缓存雪崩(说到底还不是你的缓存机器low)


redis查看存储 怎么看redis中缓存数据_缓存_02

我既然用wps来给你画图


怎么解决雪崩?

用户发送一个请求,系统 收到请求后,先查本地 ehcache 缓存,如果没查到再查 redis。如果 ehcache 和 redis 都没有,再查数据库,将数据库中的结果,写入 ehcache 和 redis 中。

限流组件,可以设置每秒的请求,有多少能通过组件,剩余的未通过的请求,走降级!可以返回一些默认的值,或者空白的值。

1.2 缓存穿透:

对于系统,假设一秒 1W+ 个请求,结果其中 8000 个请求是黑客恶意攻击。

黑客发出的那 8000 个攻击,缓存中查不到,都跑去数据库里查,也查不到。

黑客发过来的请求 id 全部都是负数。这样的话,缓存中不会有,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给搞崩溃


redis查看存储 怎么看redis中缓存数据_数据_03


怎样解决缓存穿透?

每次系统 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN。然后设置一个过期时间,这样的话,下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓存中取数据。

1.3 缓存击穿

缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库。

怎么解决缓存击穿?

1.可以将热点数据设置为永远不过期;

2.基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。

以上就是缓存雪崩,击穿,穿透,如何解决的介绍。

记录学习,每天进步一点点的橘子大王。