使用redis的原因,缓存穿透和缓存雪崩
为什么使用redis而不使用map?
map是本地缓存,随着jvm关闭而销毁,多实例时每个实例都要保存一份缓存。而redis是分布式缓存,多实例下只保存一份缓存,且提供持久化,即使服务器宕机数据也不会消失。
缓存穿透
访问大量没有做缓存的数据,导致大量请求落到数据库,数据库崩溃。
解决方案:将所有存在的数据装入一个bitmap或者布隆过滤器中,一开始就把不存在数据的请求过滤掉,还可以查询数据库时无论数据存在还是不存在,都缓存一份空,这样短期内再访问就不会进入数据库了。
缓存雪崩
缓存同一时间大面积失效,导致很多请求落到数据库上导致数据库崩溃。
解决方案:
首先要设置合理的过期策略,过期时间通常要设置为固定时间+随机时间。
其次要保证redis集群的高可用性,选择合适的持久化策略,使恢复的redis重新加载缓存。用本地的java缓存框架做缓存,请求先取java中的缓存,然后再查redis,如果都没有再查数据库。用限流组件来保证落到数据库的请求在一个合理的范围内,这样就能保证一部分用户使用正常,也能保证数据库不崩溃。被限流组件过滤掉的返回一个设计好的默认值或者提示。