Redis(二)
一. Redis中的数据 删除策略??
- 删除策略:
- 针对 已过期 数据的处理策略
- 三种策略:
- 定时删除
- 惰性删除(默认)
- 定期删除(默认)
- 定时删除(极端):
- 性能换空间(时间换空间)
- 过期,立即删除
- 惰性删除(极端):
- 空间换性能(空间换时间)
- 过期,再次访问,判断删除
- 定期删除(折中):
- 周期性抽查存储空间(随机抽查,重点抽查)
- 每秒钟执行server.hz次serverCron()-------->databasesCron()--------->activeExpireCycle()对每个expires[*]逐一进行检测,随机挑选W个key检测
- 如果key超时,删除key
- 如果一轮中删除的key的数量>W*25%,循环该过程
- 如果一轮中删除的key的数量≤W*25%,检查下一个expires[*],0-15循环
- W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
二. Redis中的数据 淘汰策略??
- 淘汰策略:
- 新数据加入,检测内存是否充足,不充足,临时删除一些数据,为新加入数据,腾空间,此策略为逐出算法
- 策略配置:
- 最大可使用内存
- 每次选取待删除数据的个数
- 对数据进行删除的选择策略
- 删除策略:(3类8种)
- 第一类: 检测易失数据
- volatile-lru:挑选最近最少使用(最近不用的)的数据淘汰
- volatile-lfu:挑选最近使用次数最少的数据淘汰
- volatile-ttl:挑选将要过期的数据淘汰
- volatile-random:任意选择数据淘汰
- 第二类: 检测全库数据
- allkeys-lru:挑选最近最少使用的数据淘汰
- allkeLyRs-lfu::挑选最近使用次数最少的数据淘汰
- allkeys-random:任意选择数据淘汰,相当于随机
- 第三类: 放弃数据驱逐
- no-enviction(驱逐):禁止驱逐数据(redis4.0中默认策略),会引发OOM(Out Of Memory)
- 第一类: 检测易失数据
- 淘汰策略配置依据:
- 查看监控信息中的缓存hit和miss次数,根据业务需求调优Redis配置
三. 什么是主从复制??
- 主从复制:
- 将master中的数据,即时&有效的复制到slave中
- 主从特征:
- 一个master可以拥有多个slave(一对多)
- 一个slave只对应一个master(一对一)
- 主从职责:
- 主(master):
- 写数据
- 同步数据至slave
- 读数据
- 从(slave):
- 读数据
- 主(master):
- 作用:
- 读写分离 : master写; slave读
- 负载均衡 : slave 分担 master 负载
- 故障恢复 : master宕机, slave提供服务
- 数据冗余 : 实现数据 热备份
- 高可用基石 : 基于主从复制,构建哨兵模式与集群, 实现高可用方案
四. 主从复制的工作流程 以及 常见问题 及 解决方案??
- 工作流程:(3个阶段)
- 建立连接阶段
- 数据同步阶段
- 命令传播阶段(反复同步)
-
- 常见问题 及 解决方案:
- 频繁的全量复制
- 修改复制缓冲区大小
- 频繁的网络中断
- 通过设置合理的超时时间,确认是否释放slave
- 数据不一致
- 设置暂时屏蔽程序对该slave的数据访问(慎用,除非对数据一致性要求很高)
- 频繁的全量复制
五. 什么是哨兵??
- 哨兵:
- 管理多个Redis服务器的分布式系统
- 用于对主从结构(非集群)中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。
- 注意:
- 哨兵 也是一台Redis服务器, 只是不提供数据相关服务
- 哨兵 redis服务器数量配置为单数
六. 哨兵的作用 ,工作原理 ??
- 作用:
- 监控 : 主从服务器 运行,存活状态
- 通知 : 被监控的服务器出现问题,向其他哨兵发送通知
- 自动故障转移 : 断开主从之间连接,选取一个从服务器作为主服务器,其他从服务器来连接此主服务器,并告知客户端新服务器地址
- 工作原理
- 略
七. 如何使用哨兵??
- 略
八. 什么是缓存预热??
- 出现场景:
- 服务器启动后迅速宕机
- 原因:
- 大量请求同时进入缓存获取数据,但是没有数据,于是去数据库获取,再存入缓存,造成了短时间内对Redis的高强度操作导致的迅速宕机
- 缓存预热:
- 缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。用户直接查询事先被预热好的缓存数据。避免,用户请求的时候,再去加载相关的数据。
- 解决方案:
- Kafka
九. 什么是缓存雪崩??
- 出现场景:
- Redis服务器奔溃
- 数据库奔溃
- ........等等
- 原因:
- 在一个较短的时间内,缓存中较多的key集中过期
- 缓存雪崩:
- 缓存雪崩就是瞬间过期数据量太大,导致对数据库服务器造成压力。
- 解决方案:
- 超热数据使用永久key
- 定期维护(自动+人工)
- 设置热点数据有效期错峰:固定值+随机值,避免同时失效的情况
十. 什么是缓存击穿??
- 出现场景:
- 数据库奔溃
- 但Redis正常
- 原因:
- Redis中某个key过期,该key访问量巨大
- 大量请求统一数据到Redis后,都未命中
- 直接击穿了Redis,短时间内直接访问数据库,
- 导致数据库压力瞬间变大,直至奔溃
- 缓存击穿:
- 缓存击穿就是单个高热数据过期的瞬间,数据访问量较大,未命中redis后,发起了大量对同一数据的数据库访问,导致对数据库服务器造成压力。
- 解决方案:
- 预先设定
- 现场调整
- 后台刷新数据
- 二级缓存
十一. 什么是缓存穿透??
- 出现场景:
- 数据库奔溃
- 但Redis正常
- 原因:
- Redis中大面积出现未命中
- 出现非正常URL访问
- 缓存击穿:
- 缓存击穿就是指访问了不存在的数据,跳过了合法数据的redis数据缓存阶段,每次访问数据库,导致对数据库服务器造成压力。
- 解决方案:
-
在用户第一次请求时,如果找不到数据,就在redis中为用户请求的key设置value为null,或者使用布隆过滤器
-
十二. Redis相关的监控指标??
- 性能指标:Performance
- 响应请求的平均时间
- 平均每秒处理请求总数
- 缓存查询命中率
- 内存指标:Memory
- 当前内存使用量
- 内存碎片率
- 为避免内存溢出删除的key的总数量
- 基于阻塞操作(BLPOP等)影响的客户端数量
- 基本活动指标:Basic_activity
- 当前客户端连接总数
- 当前连接slave总数
- 最后一次主从信息交换距现在的秒
- key的总数
- 持久性指标:Persistence
- 当前服务器最后一次RDB持久化的时间
- 当前服务器最后一次RDB持久化后数据变化总量
- 错误指标:Error
- 被拒绝连接的客户端总数
- key未命中的总次数
- 主从断开的秒数