缓存预热
现象:
1、服务器启动后,请求数量较高,从数据库中查找数据然后将数据再存入缓存,造成了短期内对redis的高强度操作从而导致问题
2、主从之间数据吞吐量较大,数据同步操作频度较高
解决方式:
1、日常统计数据访问记录,统计访问频度较高的热点数据
2、将统计结果中的数据分类,根据级别,redis优先加载级别较高的热点数据
3、提前将相关的缓存数据直接加载到缓存系统
缓存雪崩产生的原因
由于大量缓存同时失效,所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力
解决方案
一,用加锁或者消息中间件的方式保证来保证不会有大量的线程对数据库一次性进行读写,避免缓存失效时对数据库造成太大的压力
缺点:降低了性能
二、不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
三、做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期(此点为补充)
四、对服务做限流、降级
缓存穿透
缓存穿透是指用户查询数据,在数据库没有,这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空。当别人攻击的时候,就会造成影响。
解决方案
1、把空结果,也给缓存起来,设定短时限,定期清理
2、使用黑名单,监控redis命中率,将相关ip拉入黑名单
3、key加密,符合加密规则的key才接受访问
缓存击穿——热点key
热点key:某个key访问非常频繁,当key失效的时候有大量线程来构建缓存,导致负载增加,系统崩溃。
解决办法:
①使用锁,单机用synchronized,lock等,分布式用分布式锁。
②缓存过期时间不设置,而是设置在key对应的value里。如果检测到存的时间超过过期时间则异步更新缓存。
③在value设置一个比过期时间t0小的过期时间值t1,当t1过期的时候,延长t1并做更新缓存操作。
④后台定时刷新数据,高峰期来临之前刷新数据有效期
⑤多级缓存
Redis性能监控工具
redis-benchmark 命令,可以查看redis服务器的并发性能。
slowlog 命令,可以获取慢查询日志信息:
slowlog get :获取慢查询日志信息
slowlog len :获取慢查询日志条目数
slowlog reset :重置慢查询日志