一、缓存的处理流程
前台请求数据,先经过redis,如果数据存在则直接返回结果,不存在则再请求数据库。如果数据库中存在数据,则更新缓存并返回结果,否则就直接返回空结果。
二、缓存穿透
是什么?
缓存穿透是指数据库和缓存中都没有数据,而单一用户不断发起请求,导致数据库压力过大。
如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
怎么解决?
1、数据不存在时设置默认值
在查询数据库的时候如果未查询到数据,依然在redis中保存一条记录,把key-value设置为key-null或者其他便于区分的值,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样以后再有请求访问过来就不会redis直接去查库。
2、拦截请求
在redis获取数据前增加查询校验。
比如用户鉴权校验;id做基础校验,id<=0的请求直接拦截;把所有可能存在的查询参数缓存到hash集合中,若某个请求在该集合中存在,则可以访问redis,否则丢弃该请求。
三、缓存击穿
1、是什么?
缓存击穿是指数据库中有数据而缓存中没有(一般是缓存到期),这时候由于并发用户特别多,同时读缓存没有读到数据,又同时去数据库中取数据,导致数据库压力瞬间增大。
2、怎么解决?
1、设置热点数据永不过期
2、加互斥锁
四、缓存雪崩
1、是什么?
缓存雪崩是指缓存中大批量的数据同时过期,而查询数据量巨大,引起数据库压力过大甚至宕机。
和缓存击穿不同的是,缓存击穿是并发查的同一条热点数据过期了,而缓存雪崩是指不同的数据都过期了,导致大量的请求扑向数据库。
2、怎么解决?
1、设置不同的过期时间,防止大批量的数据同时失效;
2、如果缓存数据库是分布式部署,把热点数据均匀地分布在不同的缓存数据库中;
3、设置热点数据永不过期。