Redis知识导图
2021-07-05 18:09:31 0 举报
AI智能生成
redis知识架构思维导图
作者其他创作
大纲/内容
redis要点
核心数据结构与应用场景
string
分布式session
token
后端接口缓存
分布式递增编号生成
文章阅读数或网页浏览数统计
分布式锁
hash
对象缓存
购物车
list
用于模拟数据结构
栈
队列
阻塞队列
用于做消息中间件(一般不用,使用专业mq)
模拟消息推送
set
模拟抽奖
文章点赞
共同好友统计
zset
记录排名
高性能原理
单线程
内存数据库
epoll实现IO多路复用
Redis持久化
RDB快照模式
写时复制机制COW
持久化内存内数据
save与bgsave
AOF(append-only file)
记录修改操作指令
AOF的重写
混合持久化
AOF+RDB的形式
redis4.0版本引入
加快大量持久化数据恢复的速度
RDB和AOF的优劣
Redis Lua脚本
Redis 2.6版本加入对lua脚本支持
减少网络开销
院子操作
替代redis事务功能
使用注意
避免死循环
避免耗时操作
Redis 管道(Pipeline)
一次发送多条命令
减少网络io开销
非原子操作
操作结果一次返回
避免管道中插入过多命令
Redis主从架构
将对主节点的读操作压力分散到子节点
主从数据复制原理
从节点断点续传原理
对主节点缓冲区数据部分复制
使用树二叉树结构构件主从
缓解主从复制风暴
哨兵模式
高可用
只有一个主节点对外提供哨兵服务
无法支持高并发
哨兵节点不提供读写服务
哨兵节点用于监控实例节点
用于将主从的主节点ip返回给客户端
主节点宕机之后进行选举
哨兵leader选举流程
很少再使用该模式
Cluster集群架构
多个主从节点群组成的分布式服务器集群
复制、高可用和分片特性
数据被分配到16384个槽位之中
槽位定位算法
使用crc16hash算法散列之后取模16384
跳转重定位
如果客户端请求的槽位不在本服务器上,将请求重定位到正确的节点
集群节点间的使用gossip协议通讯
gossip协议的多种消息
meet
邀请新节点加入集群通讯
ping
频繁发送ping消息互相通讯,交换元数据
pong
作为meet和ping消息的返回
fail
用于传播某个节点宕机的信息
等等
集群过半生效机制
防止脑裂
redis节点数推荐为奇数,并大于3个master节点
从节省机器资源的角度出发
redis集群对于批量操作命令的支持
只支持落在同一个slot下的操作
redis分布式锁
需考虑问题
使用setnx命令作为锁
设置锁存活时间避免服务宕机导致无法释放锁
为服务器分配id为锁的值避免其他服务器释放锁
锁时长过期业务未执行完成的问题
使用定时任务进行锁续命
使用Redission框架
提供了分布式锁的完善实现
大量请求操作热点key
使用分段锁来提高性能
redis缓存设计
缓存穿透
原因
自身业务代码或数据问题
被恶意攻击、爬虫造成大量命中
解决
缓存空对象
布隆过滤器
缓存击穿
大量缓存同时失效
同一批缓存失效时间设置为同一时间段内的不同时间点
缓存雪崩
缓存层崩溃引发蝴蝶效应导致系统崩溃
保证缓存层高可用性
Redis sentinel
Redis Cluster
依赖隔离组件限流熔断并降级
Sentine
Hystrix
热点缓存key重建优化
热点key失效瞬间大量线程重建缓存导致后端压力过大
使用互斥锁
只允许一条线程重建缓存
开发规范与性能优化
键值设计
key名设计
可读性和管理性
简洁性
不要包含特殊字符
value设计
拒绝bigkey
字符串类型
超过10kb
非字符串
元素超过5000个
bigkey的危害
导致redis阻塞
导致网络拥塞
过期删除问题
bigkey的删除
避免bigkey过期自动使用del删除
如何优化bigkey
拆
选择合适的数据类型
控制key的生命周期
命令使用
使用数据集操作的使用需要明确N的值
禁用keys、flushall、flushdb等命令
合理使用select
使用批量操作提升效率
原生命令:mget,mset
非原生命令:可以使用pipeline提升效率
Redis事务功能较弱,使用lua替代
客户端的使用
避免多个应用使用同一个redis实例
使用带连接池的数据库框架
0 条评论
回复 删除
下一页