1. redis持久化?
把Redis内存中的临时数据写入到磁盘中,永久的保存下来,以免数据丢失
2. 持久化方式
- RDB:基于快照的方式,触发RDB机制后,就会把数据写入到一个在当前目录下名为dump.rdb的文件中,存储的是二进制数据
- AOF:基于日志的方式,redis会把发生变化的key的命令以日志的形式保存到一个文件中,文件会越来越大,大到一定时候,文件需要被重写【要对文件进行压缩】,压缩后的格式跟dump.rdb文件是一致,使用的是二进制存储
- 混合持久化:同时开启了RDB和AOF
3. RDB和AOF的选择?
- RDB:dump.rdb 文件小【因为存储的是二进制】,如果追求性能,对数据安全要求不高,可以选择RDB
- AOF:appendonly.aof 文件大【因为在没重写前,使用的是命令存储】,如果开启AOF,会优加载appendonly.aof,且读取效率比较高,如果性能和安全双追求,那么选择混合持久化【开启AOF,RDB开不开都行】
4. 全量复制与增量赋值?
- 全量复制:从节点通过RDB把主节点数据全部接收, 并写入到自己内存中。如果中间断掉了,那么重连后,会续传
- 增量复制:从节点跟主节点之间如果断开了,再次连接上的时候,就会执行增量复制,是把主节点新增加的数据接收并写入到内存中,而不是把全部数据再接收一遍。
5. 哨兵机制
- 在主从架构中,主节点负责读写,从节点只负责读,如果主节点宕机了,那么整个Redis架构就不能执行写操作了,哨兵机制解决此问题
- 主节点宕机,哨兵1监听到,通知哨兵2、3,让其与主节点通信
- 若确定主节点挂了,采取投票策略(谁的数据多,谁当主节点),选出主节点
6. Redis的淘汰策略
当Redis 内存达到一定程度时,会对内存进行优化,以此来满足能够存入新的数据。
7. Redis在什么时候会使用淘汰策略?
- 惰性删除:当读取一个key,发现这个key已经过期了,那么redis会去删除这个key
- 主动删除:redis会执行一个后台线程,在一定时间范围内根据淘汰策略(可能删除没过期的key)去删除key
8. redis如何选择要删除的key
- 可以指定删除的基数,默认值是5
- 根据淘汰策略,把redis的key分为5个一组,然后在5个key找到要删除的key,然后把它删掉
9. 穿透及解决?
- 查询一个缓存跟数据库都不存在的数据,最终一定要去访问数据库
- 解决方案:
- 如果数据库没有,就放一个无用的对象到缓存中,并设置过期时间
- 布隆过滤器:查询时,通过布隆过滤器经过多个无偏hash函数对key进行计算,并对位数组长度取模,找到对应索引的值,判断是否至少有一个为0,那么就可以判断该key在缓存中一定不存在。那么如果都是1,也不代表在缓存一定存在,只是有可能存在。
10. 击穿【失效】及解决?
- 同一时间点,缓存中有大量的key过期了,那么在这个时间节点,如果有很多的请求同时访问缓存时,发现缓存并没有数据,则会直接访问数据库,感觉就像缓存被击穿了
- 解决:
- 热点数据永不过期
- 不同的key设置过期时间+随机数
11. 雪崩及解决?
- 缓存由于某些原因,导致在某个时间点不可用,那么这个时间点的所有请求都会直接打到数据库,可能会造成数据库宕机
- 解决:集群、快速失败的熔断策略