Redis 入门 3
Redis配置
- RDB --> Redis DataBase
- 根据配置文件SAVE规则执行持久化,由子进程执行;主进程不进行IO操作
- 满足以下触发条件时,会自动生成dump.rdb文件
- 满足save条件时
- 执行flushall时
- 关闭服务器时
- 恢复数据
- 将rdb文件放到启动目录,Redis会自动扫描并恢复数据
- 查看dump.rdb文件需要存放的位置 --> 此目录下的rdb文件数据会自动回复
config get dir
如 "/usr/local/var/db/redis"
- 适用场景
- 适合大规模数据
- 对数据完整性要求不高
- 缺点
- 意外宕机时,最后一次数据没有保存
- fork子进程占用一定内存
- AOF --> Append Only File
- 概念:将所有命令都记录下来(只追加不可改写),恢复的时候再执行一遍(读操作不记录)
- 将配置文件中开启项设置为yes,重启服务器就可以生成appendonly.aof文件
- 可通过redis-check-aof修复有错误的aof文件;否则服务器将无法正常启动
redis-check-aof --fix appendonly.aof
- 优点
- 每次修改都同步,文件完整性更好
- 每一秒同步,可能会丢失1秒的数据
- 不同步,效率最高
- 缺点
- 对于数据文件,aof远大于rdb,修复速度也慢
- Aof运行效率也较慢,默认为rdb模式
redis发布订阅
- 发布订阅:带有关注功能的系统,利用消息队列实现
- 测试
- 订阅端:订阅channel频道
subscribe channel
- 发送端:通过channel频道发布消息
publish channel message
- 原理
- 源码用c编写
- 频道用字典存储,每个频道接一个链表;当频道更新时,发送至链表的每个节点
- 场景
- 实时消息系统
- 实时聊天室(发送者将订阅者发给发送者的消息群发给所有订阅者)
- 订阅、关注系统
Redis主从复制
- 主从复制:从主节点(master/leader)将数据复制给从节点(slave/follower);
- 特点:单向复制;主节点以写为主,从节点以读为主(可减缓服务器压力)
- 作用
- 数据冗余
- 故障恢复
- 负载均衡(读写分离)
- 高可用基础:(哨兵和集群实现的基础)
- 默认每个主机都是主节点;从节点只能有一个主节点;
- 单机模拟主从复制的环境配置
- 配置步骤
- 只配置从库,主库默认;查看当前库的信息命令
info replication
- 修改从机的配置文件中重复项目名字,避免重复;按指定配置文件启动三个服务
- port
- pidfile name
- logfile name
- dbfilename
- 两个从机中配置命令,地址和端口指定三个服务中的一个,作为主机
slaveof hostname port
- 全量复制:从机重启后,主机将全部数据复制到该从机
增量复制:后续再增加数据,将逐渐复制给从机 - 链接模式
- 一对多
- 接龙
- 如果主机断了,使用命令使自己变为主机;其他子节点手动再链接到主机上
slaveof no one
哨兵模式 sentinel
- 概念
当主机宕机时,先做故障转移(failover),通过投票选出新的主机 - 新建哨兵进程,通过给redis服务器发送命令,等待回复,从而判断各服务器是否正常
- 一般都会设置多个哨兵进程
- 主观下线:当某个哨兵观察到主机宕机
- 客观下线:当哨兵通过投票切换主机,将主机下线
- 配置哨兵配置文件 --> 新建sentinel.conf
sentinel monitor myredis 127.0.0.1 6379 1
监控主机myredis 接对应地址和端口,1为投票模式 - 启动哨兵
redis-sentinel filepath/sentinel.conf
- 哨兵规则
- 如果主机宕机,从机自动投票选出新主机
- 当宕机的主机回来,只能归并到新的主机下当从机
- 优点
- 基于主从复制,因此主从复制的优点都继承
- 系统可用性更好,故障可以转移
- 主从模式的升级,从手动到自动,更健壮
- 缺点
- 不好在线扩容
- 配置哨兵模式很复杂
缓存穿透与雪崩
- 缓存穿透(查不到)
- 概念:请求查询的数据,缓存和数据库都没有;大量此类查询可能使服务器宕机
- 解决方案
- 布隆过滤器:一种数据结构,在控制层先校验,减轻对数据库的访问压力
- 缓存空对象:在缓存中新建空对象;缺点:缓存空间变大浪费、缓存和数据库一段时间不一致
- 缓存击穿(量太大,缓存过期)
- 解决方案:缓存不过期、加互斥锁(分布式锁:每个key同时只有一个线程去查询,其余等待)
- 缓存雪崩
- 概念:在某一时间段,缓存集中过期失效,或redis宕机
- 解决办法:
- 高可用:异地多活
- 限流降级:通过加锁控制访问数据库或写缓存的线程数量
- 数据预热:提前手动访问,以加载数据至缓存,并将过期时间设置均匀