缓存穿透:
当访问一个redis和数据库中并不存在的一个key值时,访问redis时并不能获取值随之访问数据库,此时数据库也无法查询该值。一般出现于对数据库的恶意访问,当短时间大量的访问不存在的值时容易导致数据库的崩溃。
解决方法:当第一次出现访问并不存在的值时,数据库可返回一个“null”值,则后续访问时redis就回给访问者返回一个“null”值。
缓存击穿:
某一时刻,大量的访问已过期的缓存,因为redis中的缓存已过期转而访问数据库,导致数据库的压力增大,导致缓存击穿。
举极端例子:redis中有一亿个缓存刚好过期,恰好这时访问这一亿个key,因为过期转而访问数据库,由于短时间大量的访问导致数据库的压力剧增。
解决方法:给过期的key加锁,当访问第一个过期的key时不允许其他key的访问,并返回该key的value到redis以便第二次访问该key时不需要访问数据库。
Redis的雪崩
当短时间访问的数据量大于redis的缓存量时所导致的Redis崩溃进而导致Redis的集群雪崩。
解决方法:给redis里面的key设置一个随机过期时间,使之不能同时过期。
注:如果redis的存储也是10000,恰好这时redis里的10000条数据都过期进而击穿访问数据库导致数据库崩溃而引起的雪崩,这属于是数据库的雪崩,并不是redis雪崩,因为这时的redis还是可以继续使用的。
博主才疏学浅,上述问题解决方法并非唯一,本文若有出入请联系博主,谢谢!
--------续更
Redis的过期key如何处理!
Redis的过期key处理方式有两种:惰性处理、定期处理。
顾名思义,惰性处理就是当我们要查询这个key的时候,发现这个key过期了再清理这个key。当然如果遇到极端情况,比如有大批量的过期key未处理,这样就会占用内存空间,所以惰性处理会节省cpu的资源,但是会占用大量内存。
定期处理即每隔一定的时间,会扫描一定数量的key并清楚其中过期的key,通过定期扫描一定数量的key限定了时间,平衡优化了cpu和内存。