1、内存泄漏
程序 申请 不在使用的对象占用内存不被回收
解决:使用强引用不能解决,但是使用弱引用可能解决。
2、强引用
new 反射 都属于 不会被垃圾回收 内存不足报错也不回收。
解决: 显式将引用赋值为null
3、弱引用
用WeakReference类来表示的对象 无论内存是否充足,都会被垃圾回收。
多用在缓存中。
4、Redis持久化
RDB:以快照的方式在规定的时间内写入磁盘。
优点:整个Redis数据库只包含一个dump.rdb文件,方便持久化。
容灾性好,方便备份
性能最大化
相对数据集大的时候,比AOF的启动效率高
缺点:数据安全性低。RDB是间隔一段时间持久化,在间隔时间内可能会发生故障。
AOF:以日志的方式写入磁盘,日志记录写和删除的操作,不记录查操作。
优点:数据安全,提供了3种同步策略,即每秒同步、每修改同步和不同步。
通过append模式写文件,可以用redis-check-aof工具解决数据一致问题
AOF的rewrite模式,定期对AOF文件重写,达到压缩的目的。
缺点:AOF比RDB文件大。恢复速度慢
数据集大的时候比rdb启动慢
运行效率没有RDB高。
5、Redis的过期键删除策略
1、惰性过期:当访问一个key时,才判断key是否过期。过期则清除,对cpu友好,对内存不友好
2、定期过期:定时扫描数据库里面的key,并清除已过期的key。
3、redis同时使用两种方案。
6、Redis线程模型,单线程为什么快
Redis是基于Reactor(响应式)模式开发的网络事件处理器,这个处理器叫做文件事件处理器,这个处理器是单线程的,所以Redis是单线程的模型。
单线程快的原因:
首先来理解一下单线程和多线程的区别,什么时候用单线程和多线程主要。
7、缓存雪崩
造成原因:同一时间大量缓存数据过期,造成大量数据去访问数据库,导致数据库崩掉。
解决方案:给缓存失效时间设置随机值,避免大量数据同一时间失效
给缓存数据加一个标识,如果缓存标识失效,则更新数据缓存
加锁和缓存预热
8、缓存穿透
造成原因:数据在缓存和数据库中都没有记录,造成大量数据请求都落在数据库上,导致数据库崩掉。
解决方案:在接口层加上基础校验
设置key-value为key-null
采用布隆过滤器
9、缓存击穿
造成原因:缓存中没有数据,导致大量数据访问数据库,造成数据库崩掉。
解决方案:设置热点数据永不过期。
加锁。
10、Redis高可用方案
1、主从模式
2、哨兵模式:集群监控: 监控主从节点
消息通知: 节点情况通知管理员
故障转移: 主节点转移从节点
配置中心: 配置变化