主从复制
数据的复制是单向的,只能从主节点到从节点
主从复制,读写分离!master以写为主,slave以读为主80%都是进行读操作,减缓服务器压力
单台redis最大使用内存不应该超过20G
环境配置(单机下)
info replication 查看当前库信息
修改port
pidfile
logfile 6381.log
dump6381.rdb
redis-server kconfig/redis.conf
默认情况下每台都是主节点,需要配置,只配置从节点
slaveof ip port 配置主节点信息
真实的主从配置应该在配置文件中配置,这样的话是 永久的,这里使用的是命令,暂时的
复制原理
全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中
增量复制:Master继续将新的收集到的修改命令依次传给slave,完成同步
只要从机重新连接到master,全量复制将被自动执行!高可用
宕机后手动配置主机
slaveof no one 如果主机断开连接,设置当前从机为主机
哨兵模式
除了监控各个redis服务器外,哨兵之间也会相互监视
1.配置哨兵配置文件 sentinel.conf
哨兵配置
port 默认26379
dir /tmp 工作目录
sentinel monitor 被监控的名称 host port 1
数字1,如果有1台哨兵发现主机挂了,slave投票
配置连接主机的密码
sentinel auth-pass
配置主观下线时间
sentinel down-after-milliseconds mymaster 30000 单位毫秒
启动哨兵
redis-sentinel kconfig/sentinel.conf
redis缓存穿透(查不到)
查询redis没有数据,查询MySQL也没有数据,查询之后不会被缓存到redis,利用这个查询,制造大量请求,造成问题
比如数据库id从1开始,那查询时key就选择负数,如-999、-1
解决方案
1.设置一个value为空,存到redis。 没啥用
2.布隆过滤器
缓存击穿(查太多)
key设置过期后
当在某个key过期的瞬间,有大量的请求并发访问,这类数据一般是热点数据,由于缓存过期,会同时访问数据库来查询最新数据,并且会写缓存,会导致数据库瞬间压力过大。
著名案例:微博
解决方案
1.设置热点数据永不过期
2.加互斥锁
分布式锁:使用分布式锁,保证对于每个key同时只有一个 线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大。
缓存雪崩
在某一个时间段缓存集中过期失效。或者redis宕机
大量请求去查询数据库,对数据库造成巨大压力,数据库挂掉
解决方案
redis高可用(搞集群)
异地多活
限流降级
加锁或者队列来控制数据库写缓存的线程数量,比如对某个key只允许一个线程查询数据和写缓存,其他线程等待
数据预热
先跑一遍,把数据加载到缓存中,设置不同的过期时间,让缓存失效的时间点尽量均匀