一、Redis集群搭建,Redis主从复制,读写分离
默认情况下每台redis服务器都是主节点。
(1) 主从复制:是指将一台redis服务器的数据,复制道其他redis服务。前者成为主节点,后者成为从节点。默认情况下每一台redis服务器都是主节点。主机用来写,从机只能用来读。
(2) 配置从库:需要修改redis.conf的配置文件
配置从库的redis.conf的修改的内容:
端口号:
后台启动:
新建日志文件:
pid进程号文件:
dump.rdb文件名字
命令配置从机:salveof ip 主机端口号(暂时配置)
info replaction :查看主机的信息;
文件配置:
(3):主机断开连接,主机不能写,从机还能读。主机一旦恢复,还是可以继续写。
(4) 复制原理:
全量复制:从机第一次连接到主机后,主机会进行一次全量的复制给到从机。
增量复制:后面增加一些东西给从机
(5)主机宕机后手动配置主机:
选择从机当作主机输入命令:salveof on one ;之后原来的主机从新启动,那原来的主机需要从新配置,原来的主机之前的从机不存在。
二、哨兵模式(面试重点)
(1) 自动选取主机的方式:自动将从机转为主机
(2) 配置哨兵文件: sentinel.conf (文件名不能错)
(3) 启动哨兵:redis-sentinel redis_config/sentinel.conf
(4) 如果之前的主机从新启动,那也只能当作新的主机下的从机。
优缺点:
优点:可以主从切换容易,哨兵模式是主从模式的升级,更加健壮。
缺点:不可扩容。
三、缓存击穿、穿透和雪崩 (面试重点)
(1) 缓存击穿
缓存击穿: 一个并发访问量比较大的key在某个时间过期,导致所有的请求直接打在DB上。
解决:
1) 加锁更新
查询缓存,发现缓存中不存在,加锁,让其它线程等待,只让一个线程去更新缓存。
2) 异步更新
还有一个可行的方案是把缓存设置永不过期。那缓存怎么更新呢?通过异步的方式去更新缓存。
比如后台设置一个守护线程定时更新缓存,但这种定时比较难以把握。异步更新机制实际上更适合用于缓存预热。
(2) 缓存穿透
缓存穿透:缓存穿透指的查询缓存和数据库中都不存在的数据,这样每次请求直接打到数据库,就好像缓存不存在一样。
解决:
1)缓存空值/默认值
一种方式是在数据库不命中之后,把一个空对象或者默认值保存到缓存,之后再访问这个数据,就会从缓存中获取,这样就保护了数据库。
2) 布隆过滤器
除了缓存空对象,我们还可以在存储和缓存之前,加一个布隆过滤器,做一层过滤。
布隆过滤器里会保存数据是否存在,如果判断数据不在,就不会访问存储。
(3) 缓存雪崩
缓存雪崩: 当某⼀时刻发⽣⼤规模的缓存失效的情况,例如缓存服务宕机、大量key在同一时间过期,这样的后果就是⼤量的请求进来直接打到DB上,可能导致整个系统的崩溃,称为雪崩。
解决:
1) 提高缓存可用性
- 集群部署:通过集群来提升缓存的可用性,可以利用Redis本身的Redis Cluster或者第三方集群方案如Codis等。
- 多级缓存:设置多级缓存,第一级缓存失效的基础上,访问二级缓存,每一级缓存的失效时间都不同。
2) 过期时间
- 均匀过期:为了避免大量的缓存在同一时间过期,可以把不同的 key 过期时间随机生成,避免过期时间太过集中。
- 热点数据永不过期。
3) 熔断降级
- 服务熔断:当缓存服务器宕机或超时响应时,为了防止整个系统出现雪崩,暂时停止业务服务访问缓存系统。
- 服务降级:当出现大量缓存失效,而且处在高并发高负荷的情况下,在业务系统内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的 fallback(退路)错误处理信息。暂停一些不重要的服务。