Redis
2021-06-25 12:48:34 65 举报
AI智能生成
登录查看完整内容
Redis学习笔记整理
作者其他创作
大纲/内容
Redis
Redis 线程模型
IO多路复用
读写操作无锁串行化
Redis 数据结构
String
Hash
List
Set
Sorted Set
Redis 持久化
RDB
优点
文件体积小
恢复速度快
缺点
容易丢数据
save 和 bgsave 对比
IO 类型:save 同步,bgsave 异步
是否阻塞redis其他命令:save是,bgsave否(在生成子进程调用fork函数时会有短暂阻塞)
复杂度:O(n)
优点:save不会消耗额外内存,bgsave不阻塞客户端命令
缺点:save阻塞客户端命令bgsave需要fork子进程,消耗内存
AOF
安全性高(根据策略决定)
文件体积大
恢复速度慢
AOF持久化策略
always
everysec(推荐)
no
AOF重写
混合持久化
RDB和AOF比较
启动优先级:RDB低,AOF高
体积:RDB小,AOF大
恢复速度:RDB快,AOF慢
数据安全性:RDB容易丢数据,AOF根据策略决定
Redis数据备份策略
写定时调度脚本每小时copy一份rdb或aof目录的备份到一个目录中去,仅仅保留最近48小时的备份
每天都保留一份当日的数据,可以保留最近一个月的备份
每次copy备份的时候,都把太旧的备份删了
每天晚上将当前机器上的备份复制到其他机器上,以防机器损坏
Redis 集群
主从复制
全量复制
增量复制
复制风暴问题
哨兵+主从集群
哨兵作用
集群监控
故障转移(重新选举主节点)
筛选
优先级高的从库得分高
和旧主库同步程度最接近的得分高
ID号小的从库得分高
消息通知
新的主节点选举出来后,通知从节点连接新的主节点同步数据
通知客户端连接新的主节点
分片集群
原理
无中心架构,支持动态扩容,对业务透明
具备哨兵的自控和自动Failover(故障转移)能力
客户端不需要连接集群中所有节点,连接集群中任何一个节点即可
高性能,客户端直连redis服务,免去了proxy代理的损耗
运维复杂,数据迁移需要人工干预
只能使用0号数据库
不支持批量操作
分布式逻辑和存储模块耦合
Redis缓存相关问题
缓存穿透
原因
解决方案
接口层增加校验,非法参数直接拦截
缓存空数据,过期时间设短点
布隆过滤器
缓存雪崩
同一时间缓存大面积失效
Redis 缓存实例宕机
事前
高可用分片集群,避免全盘崩溃
缓存数据的过期时间随机
给每一个缓存数据增加相应的缓存标记,记录缓存是否失效如果缓存失效,则更新缓存
热点数据预热
更新缓存数据加互斥锁
准备降级方案
事中
服务限流降级,避免数据库被打死
事后
redis持久化,一旦重启,自动从磁盘加载数据,迅速恢复缓存数据
缓存击穿
设置热点数据永不过期
缓存数据库双写一致性
先删缓存后更新数据库
潜在问题
先更新数据库后删缓存
延时双删(安慰剂,未解决根本问题)
Redis 实现分布式锁
1. setnx expire 不是原子操作,可能导致死锁
2. set 命令可以同时指定NX和过期时间,解决1的问题
3.Lua 脚本也可以解决1的问题
4.如何防止线程释放非本线程的锁
5.释放锁操作也要原子化
6.如何实现可重入锁
7.锁过期了业务未执行完怎么办
8.Redis主从集群故障转移导致锁失效的问题怎么处理
缓冲区溢出
缓冲区类型
输入缓冲区
输出缓冲区
主从复制缓冲区
复制积压缓冲区
输入缓冲区溢出
可能原因
写入了bigkey
服务端处理请求的速度过慢
如何应对
避免客户端写入bigkey
避免Redis主线程阻塞
输出缓冲区溢出
服务端返回bigkey的大量结果
执行了monitor命令
缓冲区大小设置得不合理
避免bigkey
不要在生产环境中持续使用monitor
设置合理的缓冲区大小上限,或者缓冲区连续写入时间和写入量上限
主从复制缓冲区溢出
控制主节点保存的数据量大小,推荐2-4G
设置合理的复制缓冲区大小,设置依据:主节点数据量大小,主节点的写负载压力,主节点本身内存大小
BigKey
什么是BigKey
单个string过大
单个集合中元素过多
危害
导致Redis阻塞
网络拥塞
过期同步删除,存在阻塞Redis的可能性
产生
社交类 明星或者大V粉丝列表
统计类 大流量系统按天存储某项功能或网站的用户集合
缓存类 把缓存当数据库用,加载大容量大体积数据到数据库中
如何优化
拆 分段存储
选择合适的数据类型(推荐)
控制key的生命周期,redis不是垃圾桶(推荐)
Redis慢调用排查
是否用了慢查询命令?如果是,使用其他命令代替慢命令,或者把聚合计算命令放在客户端做
是否对过期key设置了相同的过期时间?对于批量删除的key,可以在每个key的时间上加一个随机数,避免同时删除
是否存在bigkey?bigkey的同步删除会阻塞主线程,可以用异步线程删除或者scan命令迭代删除对于bigkey的集合查询和聚合操作,可以使用scan命令在客户端完成
Redis AOF配置级别是什么?业务层面是否的确需要这一可靠性级别?
Redis实例的内存是否使用过大?发生swap了吗?
Redis 为什么那么快
基于内存实现
使用IO多路复用,非阻塞IO
单线程模型,避免了不必要的上下文切换
高效的数据结构
动态字符串
双向链表
压缩链表
跳跃表
整数数组
根据实际数据类型选择合适的数据编码
Redis数据淘汰
noevction(不进行数据淘汰)
进行数据淘汰的策略
在设置了过期时间的数据中进行淘汰
volatile-lru
volatile-random
volatile-ttl
在所有数据中进行淘汰
allkeys-lru
allkeys-random
0 条评论
回复 删除
下一页