Redis
2023-06-09 14:25:45 0 举报
AI智能生成
Redis
作者其他创作
大纲/内容
使用规范
key 命名规范
控制 key 的长度
避免使用 bigkey
键值对的值大小本身就很大
键值对的值是集合类型,元素非常多
使用高效序列化方法和压缩方法
使用整数对象共享池
避免使用整数共享池
使用 Redis 保存热数据
不同的业务数据分实例存储
数据保存设置过期时间
控制 Redis 实例的容量
线上禁用部分命令
替代方案
慎用 MONITOR 命令
慎用全量操作命令
分批返回
化整为零
序列化访存
缓存设计
客户端缓存
缓存失效
普通模式
广播模式
旁路缓存
只读缓存
同步直写的读写缓存
异步写回的读写缓存
引入复杂度
开发:需考虑失效、更新、一致性等问题
运维:掩盖系统缺陷,让问题在更久后、距离发生现场更远的位置出现
安全:可能导致保密数据泄漏和被攻击
缓存穿透
有期限的默认值
布隆过滤器
缓存雪崩
事前
事中
事后
缓存击穿
更新锁
后台更新
定时器
消息队列
多副本分流
无底洞
集群部署
主从复制
复制模式
全量复制
增量复制
主从链
故障恢复
2.8-
2.8+
repl_backlog_buffer
复制进度监控
常见问题
数据规模
同步故障
配置不一致
规避全量复制
复制风暴
单主节点复制风暴
单机器复制风暴
操作覆盖
主从不一致
主从数据不一致
读取到过期数据
服务宕机
脑裂
导致数据丢失
确认是否数据同步出错
排查客户端操作日志
确认是否原主库故障导致脑裂
解决方案
哨兵机制
健康检查:向主从节点周期性发送 PING 命令
故障转移
节点下线
主观下线:周期性 PING,超时则认为节点已宕机,可能存在误判
客观下线:所有 Sentinel 节点对节点失败要达成共识,即超过 quorum
选择主库
筛选
打分
1. 优先级最高的从库得分高:slave-priority
2. 和旧主库同步程度最接近的从库得分高:repl_offset
3. ID 号小的从库得分高
高可用读写分离
哨兵集群
定时任务
领导者选举
判断主观下线的哨兵节点向其他哨兵节点发送命令,自荐为领导者
收到命令的哨兵节点可同意或拒绝请求
如果该哨兵节点票数已超过哨兵集合半数且超过 quorum,则成为领导者
如果此过程有多个哨兵节点成为领导者,则等待一段时间再重新选举
领导者执行主节点的主观下线
发布/订阅机制
使用须知
切片集群
数据分片
分布方式
顺序分布
哈希分布
分片方式
服务端分片
* 哈希取模
* 一致性哈希
虚拟槽
数据写入
重定向
客户端分片
代理分片
通信机制
集中式
Gossip 协议
发送机制
meet
ping
pong
fail
通信频率优化
高可用原理
判断节点宕机
主观宕机(pfail)
客观宕机(fail)
从节点过滤
从节点选举
数据倾斜
数据中有 bigkey,某个实例数据量增加
业务代码避免创建 bigkey
把集合类型的 bigkey 拆解成多个小集合
Slot 手工分配不均,某些实例上有大量数据
规范操作,避免把过多 Slot 分配到一个实例
迁移热点实例上的 Slot 到其它实例
具体操作
使用了 Hash Tag,数据集中到某些实例上
不使用 Hash Tag
存在热点数据,数据访问倾斜
采用带有不同 key 前缀的多副本方法
版本特性
2.6
2.8
3.0
3.2
4.0
5.0
6.0
使用场景
分布式锁
SET NX 指令
实现原理
value 生成
超时释放
RedLock 算法
存在问题
数据统计
聚合统计
应用实例
排序统计
应用实例
二值状态统计
应用实例
基数统计
使用 Set
使用 Hash
使用 HyperLogLog
时序分析
Hash + Sorted Set
RedisTimeSeries
基本使用
发布 - 订阅
消息队列
事务机制
基本流程
客户端使用 MULTI 启用事务
客户端要执行的操作发送给服务端
Redis 实例把命令暂存到命令队列中
客户端向服务器端发送 EXEC 提交事务
服务器端执行命令队列中的所有命令
弱事务
原子性
执行 EXEC 前出错
命令入队时就报错
EXEC 命令执行时实例发生故障
一致性
命令入队时就报错
命令实际执行时报错
EXEC 命令执行时实例发生故障
隔离性
并发操作在 EXEC 命令前执行
并发操作在 EXEC 命令后执行
持久性
流水线
使用须知
查找表
计数器
慢查询分析
基本使用
数据结构
数据类型
String
简单动态字符串(SDS)
List
数据量较大:双向链表
数据量较小:压缩列表
Hash
压缩列表
哈希表
ZSet
压缩列表
跳表
Set
哈希表
整数数组
Bitmap
应用实例
HyperLogLog
应用实例
GEO
基本操作
GeoHash 编码
Sorted Set
特殊情况
自定义类型
定义新类型和底层结构
在 RedisObject 中增加新类型的定义
开发新类型的创建和释放函数
开发新类型的命令操作
键值存储
渐进式 rehash
使用须知
基本操作
单元素操作
多元素操作
范围操作
渐进式遍历
统计操作
其他情况
I/O 模型
I/O 多路复用
线程模型
文件事件
时间事件
定时事件
周期事件
调度与执行
6.0
I/O 基本流程
建立 Socket 连接,分配处理线程
I/O 线程读取并解析请求
主线程执行请求操作
I/O 线程回写 Socket 和主线程清空全局队列
数据存储
持久化
AOF(Append Only File):写后日志
写回策略
always:每个写命令都同步,会严重减低性能
everysec:每秒都同步,系统崩溃只会丢失最近一秒数据,对性能影响较低
no:系统决定何时同步,性能提升不明显,且增加系统崩溃时数据丢失的风险
AOF 重写
RDB(Redis Database):内存快照
触发机制
同步触发
异步触发
自动触发
其他机制
性能优化
异步写入
增量快照
结合 AOF
清理策略
定期删除
惰性删除
淘汰策略
在过期数据中淘汰
volatile-random
volatile-ttl
volatile-lru
volatile-lfu
在所有数据中淘汰
allkeys-lru
allkeys-lfu
allkeys-random
不淘汰
noeviction
使用须知
0 条评论
下一页