@startmindmap

+[#OrangeRed] Redis

++[#yellow] 数据类型

+++[#Pink] 五大类型

++++[#MediumSpringGreen] String / 字符串
+++++[#LightBlue] 使用场景
++++++[#LightGreen] 分布式 Session
++++++[#GhostWhite]_ 分布式锁
++++++[#GhostWhite]_ 访问量统计

+++++[#LightBlue] 特点
++++++[#LightGreen] 支持整数、浮点，支持原子性自增
++++++[#LightGreen]_ 浮点精度：IEEE 754 标准
++++++[#LightGreen]_ 字符串大小限制：521 M

+++++[#LightBlue] 底层实现
++++++[#Aquamarine]_ sds 数据类型
+++++++[#GhostWhite] 封装原因
++++++++[#LightGreen]_ C 语言原生字符串不能存空格
+++++++[#LightGreen] 属性
++++++++[#LightGreen]_ free：当前额外可用
++++++++[#LightGreen]_ length：长度
++++++++[#LightGreen]_ char buff：字符数组和空格
+++++++[#LightGreen] 空间预分配
++++++++[#LightGreen]_ 小于 1 M：free 等于 length
++++++++[#LightGreen]_ 大于 1 M：free 等于 1 M
+++++++[#LightGreen] 惰性删除
++++++++[#LightGreen]_ 删除字符后，free 保持不变
++++++++[#LightGreen]_ 可以调 api 主动释放
+++++++[#LightGreen]_ 支持二进制文件的存储

++++[#AliceBlue] List / 队列
+++++[#GhostWhite]_ 时间轴列表
+++++[#GhostWhite]_ 最新新闻
+++++[#GhostWhite]_ 最热推荐

++++[#AliceBlue] Set / 集合
+++++[#GhostWhite]_ 好友推荐
+++++[#GhostWhite]_ 好友关系
+++++[#GhostWhite]_ 点赞

++++[#AliceBlue] Hash / 哈希

++++[#MediumSpringGreen] ZSet / 有序集合
+++++[#LightGreen] Skip List / 跳表
+++++[#LightGreen] Zip List / 压缩表
+++++[#GhostWhite]_ 排行榜


++[#yellow] 常见问题

+++[#Pink] 特性

++++[#MediumSpringGreen] Redis 为什么这么快
+++++[#LightGreen] IO
++++++[#Aquamarine]_ 内存：没有磁盘 IO 开销
++++++[#Aquamarine]_ 零拷贝：IO 多路复用
+++++[#LightGreen] 锁竞争开销
++++++[#Aquamarine]_ 单线程：没有锁竞争开销，不需要考虑线程安全问题
+++++[#LightGreen] 数据结构
++++++[#Aquamarine]_ 查询方式：k-v 数据，不需要做关联查询和聚合查询
++++++[#Aquamarine]_ 数据结构的底层优化：比如编码、跳表、压缩表

++++[#MediumSpringGreen] 为什么使用单线程
+++++[#AliceBlue]_ CPU 不是瓶颈，Redis 的瓶颈最有可能是机器内存的大小，或者网络带宽
+++++[#AliceBlue]_ 单线程没有锁竞争开销，不需要考虑线程安全问题

++++[#MediumSpringGreen] 线程安全问题？？
+++++[#AliceBlue]_ Redis 6.0 里面，增加了多线程的模型
+++++[#AliceBlue]_ 增加的多线程只是用来处理网络 IO 事件，对于指令的执行过程，仍然是由主线程来处理



+++[#Pink] 三剑客

++++[#AliceBlue] 缓存雪崩
+++++[#AliceBlue]_ 同时大面积失效
+++++[#AliceBlue]_ 内存淘汰策略选清理最少访问

++++[#MediumSpringGreen] 缓存击穿
+++++[#MediumSpringGreen]_ 热点 key 失效
+++++[#MediumSpringGreen]_ 热点 key 可以不设置失效的时间

++++[#AliceBlue] 缓存穿透
+++++[#AliceBlue]_ 同时大量无效的 key（恶意请求）
+++++[#AliceBlue]_ 布隆过滤器可以解决


+++[#Pink] key

++++[#MediumSpringGreen] 热 key 问题
+++++[#MediumSpringGreen]_ 利用二级缓存（ehcache）
+++++[#MediumSpringGreen]_ 备份热 key（多台分流）

++++[#MediumSpringGreen] 大 key 问题
+++++[#MediumSpringGreen]_ 删除大 key（如果不是热 key）
+++++[#MediumSpringGreen]_ 压缩和拆分 key（集合类型可以分片）

++++[#AliceBlue] 场景优化：内存不够用
+++++[#MediumSpringGreen]_ 内存淘汰策略：删除过期数据，再使用 LRU 算法进行淘汰，酌情使用 LFU 算法
+++++[#MediumSpringGreen]_ 转码压缩

++++[#MediumSpringGreen] 过期 key 的清理策略
+++++[#MediumSpringGreen]_ 参考内存淘汰


+++[#Pink] 内存淘汰

++++[#MediumSpringGreen] 内存淘汰策略（五）
+++++[#MediumSpringGreen]_ 背景：内存达到 MaxMemory 上限
+++++[#MediumSpringGreen]_ LRU 按时间早晚淘汰
++++++[#LightGreen]_ 候选池，根据空闲时间排序
+++++[#MediumSpringGreen]_ LFU 按访问次数的多少淘汰
++++++[#LightGreen]_ 维护访问次数：二维的双向链表（次数和相同次数的元素）
+++++[#MediumSpringGreen]_ TTL
++++++[#LightGreen]_ 寻找过期时间的 key
+++++[#MediumSpringGreen]_ 随机算法
+++++[#MediumSpringGreen]_ 内存不足，默认是直接报错

++++[#MediumSpringGreen] 过期策略（二）
+++++[#MediumSpringGreen]_ 定期删除
++++++[#LightGreen]_ 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key
+++++[#MediumSpringGreen]_ 惰性删除
++++++[#LightGreen]_ 客户端访问 key 的时候检查 key 是否过期


++[#yellow] ACID

+++[#Pink] ACID 属性
++++[#MediumSpringGreen]_ Atomicity / 原子性
+++++[#AliceBlue]_ 不支持，需要 lua 脚本实现
+++++[#AliceBlue]_ 传统事务比较复杂，Redis 追求简单高效
++++[#MediumSpringGreen]_ Consistency / 一致性
+++++[#AliceBlue]_ 支持，数据和命令都符合要求
++++[#MediumSpringGreen]_ Isolation / 隔离性
+++++[#AliceBlue]_ 支持，命令独立操作
++++[#MediumSpringGreen]_ Durability / 持久性
+++++[#AliceBlue]_ 开启持久化之后才支持

+++[#Pink] 持久性
++++[#MediumSpringGreen] 如何实现数据不丢失的（持久化）

+++++[#LightGreen] AOF 日志（Append Only File）
++++++[#AliceBlue]_ 文件追加方式，数据比较全（取决于策略）
++++++[#AliceBlue]_ 数据恢复比较慢，需要把命令全部重写执行一遍
++++++[#AliceBlue]_ 文件体积很大（AOF 重写后仍然很大）

+++++[#LightGreen] RDB 快照（Redis DataBase）
++++++[#AliceBlue]_ 每五分钟同步一次，会丢数据
++++++[#AliceBlue]_ 可快速恢复
++++++[#AliceBlue]_ 文件体积小
+++++[#LightGreen]_ 混合持久化方式

++++++[#AliceBlue]_ 集成了 RDB 和 AOF 的优点


+++[#Pink] 一致性
++++[#MediumSpringGreen] Gossip 算法
+++++[#LightGreen]_ 保证最终一致性，不保证数据的强一致性
+++++[#LightGreen]_ 主节点挂了的时候，如果数据没有同步到备节点，是会出现数据丢失的情况
+++++[#LightGreen]_ 发生网络分区的时候也可能会丢数据，这个时候有个 node timeout 时间概念


++[#yellow] 集群

+++[#Pink] 高可用
++++[#AliceBlue]_ 主从复制
+++++[#AliceBlue]_ 从一台主服务器同步数据到多台伺服务器
++++[#AliceBlue]_ 哨兵模式
+++++[#AliceBlue]_ 监控主从服务器，可以自动容灾恢复
++++[#MediumSpringGreen] Redis Cluster
+++++[#AliceBlue]_ 去中心化，数据分布在不同的服务器
+++++[#AliceBlue]_ 采用类一致性哈希算法实现存储节点选择

++++[#MediumSpringGreen] 主从复制原理（五）
+++++[#LightGreen]_ 从节点发出同步请求
+++++[#LightGreen]_ 主节点后台生成快照（第一次同步会触发全量）
+++++[#LightGreen]_ 主节点将新命令缓存在内存
+++++[#LightGreen]_ 主节点把快照发送给从节点，从节点写入磁盘后加载到内存
+++++[#LightGreen]_ 主节点把缓存的新命令发给从节点，从节点同步快照中缺失的数据

+++[#Pink] 节点增删

++++[#MediumSpringGreen] 哈希槽
+++++[#LightGreen]_ Redis 集群始终包含 16384 个哈希槽，容易添加或者删除节点
+++++[#LightGreen]_ 添加、删除或者改变某个节点的哈希槽数量，不影响集群的可用状态
+++++[#LightGreen]_ 为降低由于消息过大而造成的通信阻塞影响，Redis 的节点数限制在 1000，哈希槽数限制在 16384


++[#yellow] 其他

+++[#Pink] 分布式锁

++++[#MediumSpringGreen] CAP
+++++[#LightGreen]_ Consistency / 一致性
+++++[#GhostWhite]_ Availability / 可用性
+++++[#LightGreen]_ Partition Tolerance / 分区容错性

++++[#MediumSpringGreen]_ 生命周期
+++++[#LightGreen]_ 跨进程跨机器节点

++++[#MediumSpringGreen] 问题
+++++[#LightGreen] 分布式锁过期
+++++[#LightGreen] 主从切换，节点同步失败，分布式锁失效

++++[#AliceBlue] Redis 实现
+++++[#LightGreen]_ 命令：setNX + expire
+++++[#LightGreen]_ 使用 redisson：watch dog
+++++[#LightGreen]_ RedLock


+++[#Pink] 集成 SpringBoot
++++[#AliceBlue]_ 依赖 spring-boot-starter-data-redis
++++[#AliceBlue]_ 配置 RedisTemplate


+++[#Pink] 和 MySQL 的一致性问题

++++[#MediumSpringGreen] 延迟双删
+++++[#LightGreen] 在更新数据库之后再删一次缓存
+++++[#LightGreen] 延迟时间大于业务的一次读操作时间

++++[#MediumSpringGreen] RocketMQ
+++++[#LightGreen] 基于 RocketMQ 的可靠性消息通信，来实现最终一致性

++++[#MediumSpringGreen] Canal
+++++[#LightGreen] 通过 Canal 组件，监控 Mysql 中 binlog 的日志，把更新后的数据同步到 Redis 里面



++[#yellow] 2

+++[#Pink] 3

++++[#MediumSpringGreen] 4
+++++[#LightGreen] 5
++++++[#Aquamarine] 6
+++++++[#Aquamarine]_ 7




'https://www.cnblogs.com/qdhxhz/p/15684650.html


@endmindmap