redis 作为缓存
redis的缓存机制和结构
-
redis在从mysql中读取数据作为缓存的时候,如果不即使清除的话,那么会慢慢的占用很多空间,导致redis的性能降低,为了解决这个问题,我们通常会设置缓存数据的有效期,有效期过后,redis将会删除这些缓存数据。
-
在活动,比如618的时候,会有大量的数据比如上亿的数据需要缓存在redis中,但是你不可能给这几亿的数据完全放在redis中,因为28定律的存在,通常大量的数据中,只有几乎20%的数据才会被访问,所以,一般来说是只会缓存这20%的数据,另外,活动应该是额外的指定商品的,而且数据一般也不是那么大。
redis 缓存击穿(redis不存在+mysql存在)
由于大量的缓存失效(比如秒杀活动,大量数据的有效性同时失效),到时request直接到mysql中,导致mysql崩溃,导致mysql击穿。
为了解决这个 问题,我们需要设置的有效性计算方式为expired = fix(固定)+ random(12个小时) 来逐渐的删除缓存数据,避免大量同时失效,同时的大量缓存也会降低redis的性能
redis 缓存穿透
redis 不存在,mysql也不存在,那么如果request请求量大的话,那么因为mysql中没有,redis中无法缓存,所以,请求会每次都到mysql中读取,那么,导致了缓存完全失效,请求经过了多个节点,服务器->redis->mysql。
解决方案就是在服务器中,设置了返回null的时候,要求client做特殊处理,或者在redis中允许缓存empty值。
redis 缓存雪崩
如果有效期设置的不好的,几乎存在大量的数据同时失效,导致redis几乎不存在,或者redis宕机了,而且没有持久化的话,那么重启后,大量数据缓存失效,导致mysql在高并发的情形下,系统崩溃了。