redis总体概念

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情况(避免全局扫) 设置默认值或上级缓存或使用过滤器