redis篇
- 第一章节 redis介绍
- 第二章节 redis集群策略
- 第三章节 redis高级特性
第一章节
- redis介绍
- 1.1 redis 特性
- 1.2 redis 数据类型
- 1.3 redis 应用场景
- 1.4 redis Java客户端
1.1 redis特性
- 单核单线程 没有线程安全问题
- 性能高 IO多路复用 内存操作
- 支持多种持久化方案
- 支持弱事务 不支持Rollback
- 支持排序 分页 模糊搜索功能
- 支持队列订阅发布
1.2 redis 数据类型
- String类型 字符串类型 4.0版本后增加json的schema
- hash类型 即可支持kkv模型
- List类型 支持排序 支持队列命令 可用于简单的消息队列
- Set类型 数据唯一类型 类似list
- Sorted set类型 类似set/list 可通过score参数来自动排序
1.3 redis 应用场景
- 各类别缓存方案 页面 业务 数据
- 实时计数器 统计仪表 排行榜
- 分布式锁 开关
- 消息队列 发布/订阅
- session存储
- 支持分页 模糊查询
- 搜索倒排的缓存
1.4 redis Java客户端
- Redisson 提供分布式相关操作服务 支持延迟队列
- Jedis 多线程下 有线程安全问题 提供了基础操作
- lettuce 高级Redis客户端 线程安全 springboot2.0集成支持
第二章节
- redis集群策略
- 2.1 redis 主从复制
- 2.2 redis 哨兵模式
- 2.2 redis 自带的集群模式
2.1 redis 主从复制
- 主数据库(master) 从数据库(slave) master可以进行读写操作 当读写操作导致数据变化时会自动将数据同步salve
- 机制初始化 slave发送SYNC命令 master接收到SYNC 将保存的快照文件(rdb)和缓存的命令发送给slave
- 复制初始化后 master每次接收到的写命令都会同步发送给slave 保证主从数据一致性
- 此方法不可保证高可用 或需要手动或程序来做主从切换等 但可以做到读写分离
2.2 redis 哨兵模式
- 基于主从模式下的监控模式
- 哨兵通过发送命令来监控master/slave是否正常运行
- master出现故障时 开启选举自动将slave转化为master
- 多哨兵配置的时候 哨兵之间也会自动监控
- 多个哨兵可以监控同一个redis
- 基于异步复制 脑裂切换有数据丢失情况
2.3 redis 自带集群模式
- 多master节点 通过hash算法落点到具体的slot master节点上
- 此集群模式 一般用于三主三从架构
- slave节点用于备份master节点数据
- 当master节点发生故障时 自动切换到slave节点
- 基于异步复制 主从切换有数据丢失情况
第三章节
- redis高级特性
- 3.1 redis 持久化
- 3.2 redis 淘汰机制
- 3.3 redis 穿透雪崩场景
3.1 redis 持久化
- redis 支持两种持久化方式 rdb aof
- rdb 存储简单 便于备份 启动效率高 性能高 fork子进程来同步
- rdb 同步由于由子进程来同步 无法做到实时同步
- aof 存储为日志操作形式记录 数据安全性高 有同步策略 更高数据完整性跟一致性
- aof 由于同步策略(每秒同步 每修改同步 不同步) aof在运行效率上往往会慢于rdb 且文件大于rdb
- aof文件会越来越大 数据恢复也会越来越慢 所以rdb在恢复数据时的速度比aof要快
3.2.1 redis 淘汰机制
- 内存的淘汰机制的初衷是为了更好地使用内存 用一定的缓存miss来换取内存的使用效率
- 在key无限增加的情况下 已无法达到过期失效 超过增加的极端情况
- redis自带对key的几种淘汰机制 当然也可以自己通过程序或lua编写淘汰机制
- 设置参数 maxmemory maxmemory-policy 策略 即可使用淘汰机制
3.2.2 redis 淘汰机制
- noeviction 当内存使用达到阈值的时候 所有引起申请内存的命令会报错
- allkeys-lru 在主键空间中 优先移除最近未使用的key
- volatile-lru 在设置了过期时间的键空间中 优先移除最近未使用的key
- allkeys-random 在主键空间中 随机移除某个key
- volatile-random 在设置了过期时间的键空间中 随机移除某个key
- volatile-ttl 在设置了过期时间的键空间中 具有更早过期时间的key优先移除
3.3 redis 穿透雪崩场景
- 有超时缓存 可采用双重加锁方式 让一个请求执行数据库操作并加入缓存 后续请求获得缓存
- 尽可能使用无超时缓存 使用redis 自带的淘汰机制
- 无超时缓存 使用定时任务 刷新移除缓存
- 利用各类缓存 如页面 数据库缓存 二级缓存
- 在redis前加进程缓存 消减redis使用率 通过redis watch机制保证缓存一致性
- 布隆过滤器 或自定义过滤器 如bitmap hash值占位
- 空key情况(避免全局扫) 设置默认值或上级缓存或使用过滤器