Redis、Redis主从复制、Redis AOF RDB 、Redis哨兵模式、与Mysql缓存一致性
2021-09-14 10:58:21 42 举报
缓存一致性问题,采用双删除,保证数据一致
作者其他创作
大纲/内容
redis-cli -c
立即同步AOF
serverCron服务器周期性操作函数
累加从偏移量slave_repl_offset
每秒轮询
Redis 主从复制
删除缓存
appendfsync
主进程完成同步阻塞
Done
101
将根据offset将缓冲区的命令发送给从节点
操作系统决定
save key
RDB
主从复制
slave off
记录从属节点端口
size
struct dictEntry { // key - value 实体 void *key; //RedisObject union { void *val; //RedisObject uint64_t u64; int64_t s64; double d; } v; struct dictEntry *next;}dictEntry;
always
(1)当前时间-lastsave > m(2)dirty >= n
save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存
重连
sentinel
RDB文件二进制
重写完成
DB
间接阻塞
struct __attribute sdshdr5 { unsigned char flags; //用这字节后5位表示长度 char buf[]; // 存储真实的字符串}
Redis 哨兵模式
命令缓冲区
子进程
everysec
check
重写
监控master节点
100
更新
业务
触发部分复制
port
aof_rewrite_base_size
调用BGREWRITEAOF手动触发
2.建立Socket连接
struct RedisObject{ unsigned type:4; //string、set、zset、hash、ziplist、skiplist unsigned encoding:4; // int、 raw 、 embstr unsigned lru:LRU_BITS; //24bit int refcount; // int 4byte / long 8byte 引用计数 void *ptr; // 指向真实内存地址指针 8byte}
AOF
struct __attribute sdshdrX { // sdshdr5 、sdshdr8、sdshdr16 uint8_t len; //表示字符串长度 uint8_t alloc; //表示当前还有多少空余空间 unsigned char flags; // sdshdr5 用这字节后5位表示长度 char buf[]; // 存储真实的字符串}
命令传播阶段
3.发动ping命令
每秒replcon acf {offet}
主进程
fork
自动触发
write
断开
ping
大于2秒阻塞
slave
pong
psync
完全阻塞
查询
应用程序
ping 不通
AOF阻塞?
没有缓存
手动触发
# 启动主机redis-server /opt/redis6379.conf &redis-server /opt/redis6380.conf &redis-server /opt/redis6381.conf &redis-server /opt/redis6382.conf &redis-server /opt/redis6383.conf &redis-server /opt/redis6384.conf &# redis-server /opt/redis6385.conf &# 设置主从redis-cli --cluster create 192.168.133.100:6379 192.168.133.100:6380 192.168.133.100:6381 192.168.133.100:6382 192.168.133.100:6383 192.168.133.100:6384 --cluster-replicas 1
AOF文件旧
1.设置主节点信息
实时同步
Redis 持久化
aof_rewrite_perc
4.身份验证
身份验证
createRDB
append
thread 2
失败重试
条件
8.实时同步
master
缓冲区aof_buffer
String
AOF文件
thread 3
bgwriteaof
7.同步执行RDB期间命令
5.发送端口
ht[1]
设置缓存
struct redisService{ //1、记录保存save条件的数组 struct saveparam *saveparams; //2、修改计数器 long long dirty; //3、上一次执行保存的时间 time_t lastsave; }
Sentinel 集群
Master
thread 1
10 秒ping
redis
后台生成RDB
No
替换
struct dict { // 数据库的结构体 dictType *type; //表示字符串长度 void *privdata; dictht ht[2]; // 2 个 hashtable long rehashidx; int16_t pauserehash; }struct dictht { // 数据库 dictEntry **table; // unsiged long size; //hashtable size unsiged long sizemask; // unsiged long used; // 当前hashtable 总共有多少元素}
ack
Redis 源码
// 缓存行的64byte redisobject= (4+4+24)bit + 4byte + 8byte =16byte 64 - 16 = 48 byte redis 为了提高string 的 io 次数 将剩余的长度用与存储 span style=\
更新数据库
状态转移
save m n
1.Fork 操作都会导致主进程短暂的阻塞2.RDB 和 AOF 不能同时进行
线程
同步成功
pong?
通知
slaveof 192.168.133.100 6379
save
ht[0]
6.发送同步psync
bgsave
复制积压缓冲区(1MB)FIFO队列(丢失补救)
重写缓冲区aof_buffer
累加主偏移量master_repl_offset
每秒replcon ack {offet}
psync {runid} {offset}
双删,保证在跟新过程中其他线程的缓存在跟新后失效
struct saveparam{ //秒数 time_t seconds; //修改数 int changes;};
sleep
密码同步
一秒后同步
Redis 集群
0 条评论
回复 删除
下一页