Redis入门到精通
2022-11-29 15:37:14 0 举报
AI智能生成
Redis入门到精通
作者其他创作
大纲/内容
Redis高可用篇
持久化
RDB快照(Redis Database)
触发时机
非阻塞
配置触发
save
shutdown指令
flushall指令
bgsave指令
阻塞
save指令
优劣势
优势
文件小,备份恢复快
主线程不需要跟磁盘IO,性能快
劣势
数据安全性低
消耗CPU
Append Only File
持久化时机
appendfsync always 表示每次写入都执行fsync(刷新)函数 性能会非常非常慢 但是非常安全
appendfsync everysec 每秒执行一次fsync函数 可能丢失1s的数据
appendfsync no 由操作系统保证数据同步到磁盘,速度最快
重写
重写时机
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
重写优化
RDB+AOF
优劣势
优势
安全性非常高,默认也只会有1s丢失
可读性相对高
劣势
数据文件比rdb大,加载数据慢
7.0以下版本,重写期间会有2次IO,占用大量内存
集群
主从
数据备份
负载
主从数据一致性保证
全量同步
slave发起
条件
传的repid跟master不相等
相差的offse在replication_backlog_buffer找不到
master收到请求:bgSave生成RDB文件给slave
新的指令通过client-output-buffer-limit保存
增量同步
slave发起
传的repid跟master相等
相差的offse在replication_backlog_buffer能找到
指令同步
master发起
指令异步同步给slave
哨兵sentinel
自动故障转移
发现故障
主观下线
客观下线
转移故障
raft选择sentinel进行故障转移
哪个slave成为master
断开时间
replica-priority
offset
Run ID
配置提供
客户端直接配置sentinel地址
脑裂
分区容错性导致多个master出现
数据丢失场景
多个master都写入数据
网络恢复,会丢失之前master写入的数据
cluster
备份
每个master都会有slave并且可以自动故障转移
分片
不同的key对应不同的master实例
虚拟槽
更灵活的数据分片
节点扩容、缩容不需要更改所有数据
Redis内存管理篇
过期策略
被动过期
使用key的时候判断是否过期
定期过期
定时任务ServerCron方法 hz配置执行频率
1.扫描设置了过期时间的key-expires
2.根据hash桶维度扫描,最多扫20(可配)key为止
3.删除扫到的key中过期的key
4.删除比例如果超过10%(可配)
5.每执行16次会进行时间判断
淘汰策略
淘汰流程
1.判断是否需要淘汰
空间是否满足新的key,如果满足不淘汰
策略是否为novication,如果是不淘汰
2.判断当前空间是否满足新的key
3.取样数据
maxmemory-samples:5(默认)
4.循环取样数据
5.根据淘汰算法得到key的淘汰值:ide 越大越容易淘汰
maxmemory-policy
配置淘汰算法
6.塞入淘汰池 pool
1.取样的数据比淘汰池中的数据更容易淘汰
将取样数据放入淘汰池
不适合淘汰的从池子移除
2.淘汰池未满,直接插入
7.从淘汰池中实现末尾淘汰,释放数据内存空间
淘汰算法
淘汰范围
allkeys
所有key
volatile
设置了过期时间的key
淘汰算法
random
lru
最久未使用越容易淘汰
server.lrulock>=redisObject.lru
server.lrulock-redisObject.lru
server.lrulock<redisObject.lru
server.lrulock-redisObject.lru+24bit的最大值
lfu
次数越少越容易淘汰
redisObject.lru=16bit时间+8bitCount
16bit时间得到对象多少分钟没访问
lfu-decay-time 1 多少分钟没操作减少一次
解决时效性问题
8bitcounter够不够
如果小于5,必+1
大于5 小于255
已有counter越大,几率越低
lfu-log-factor越大,几率越低
=255 不加次数
ttl
过期时间越小越容易淘汰
Redis场景篇
Redis数据丢失场景分析
脑裂
主从同步
持久化
Redis缓存场景分析
数据一致性
并发导致的数据库跟DB的数据不一致
保证最终一致性即可
设置过期时间
Mysql canel同步
缓存穿透
redis跟DB都没有,请求都会进入DB
布隆过滤器
布谷鸟过滤器
缓存击穿
单个key过期或者redis没有,产生大量并发
互斥锁
缓存雪崩
保证Redis的高可用
互斥加锁
DB集群提高可用性
Redis调优
慢日志查询
大key查询
Redis数据结构篇
Redis数据字典dictht
扩容机制
2个ht,非扩容的时候,只有ht[0]有数据
扩容时机
在持久化,已用数据>分配数量*5
不在持久化,已用数据>=分配数量
hash冲突解决
头插链地址法
Redis命令执行是单线程,不会有循环链问题,性能比尾插高
渐进式rehash
指令执行执行hash桶的数据迁移
定时任务执行hash桶数据迁移
不同数据类型Value的数据结构
String
SDS
牺牲空间换时间
Hashes
zipList
节省内存
连锁更新问题、只适合数据量小的场景
hash-max-ziplist-value 64
hash-max-ziplist-entries 512
ditcht
Lists
quicklist
分段zipList
一定程度上解决zipList连锁更新带来的性能问题
Sets
intset
有序集合
时间O(n),也只适合数量小场景
必须是整数类型
set-max-intset-entries 512
dictht
Sorts set
zipList
节省内存
连锁更新问题、只适合数据量小的场景
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
skipList
空间换时间
Redis高阶使用篇
高级功能
事务
multi、exec/DISCARD
保证多个指令的原子性,但是不能拿到中间结果做业务处理
pipelining
不能保证原子性,减少网络开销次数提升性能
lua脚本
保证多个指令的原子性
发布与订阅
subscribe/psubscribe、publish
Redission分布式锁
lua+hash实现可重入
自旋等待
Semaphore+发布订阅
看门狗自动时间续期
hashWheelTimer定时续期
联锁
尽可能减少Redis的不可靠性
往多个实例加锁,过半成功
Redis基础使用篇
Redis简介
Redis由来
Redis特性
速度快
基于内存
命令执行单线程
k、v结构、底层数据结构支持
多路IO复用
持久化
主从复制
高可用、分布式部署
基本应用场景
缓存存储类相关场景
缓存
session
分布式可重入锁
对象类数据存储
购物车
抽奖
集合操作:交集、差集、并集
关注/点赞
排行榜
高性能位图操作
有序列表
阻塞队列、堆栈
收藏
收藏
0 条评论
下一页