Redis的主从同步与对象模型详解

 更新时间:2026年03月27日 09:50:28   作者:FL4m3Y4n  
本文介绍了Redis的内存管理机制、淘汰策略、以及持久化方法,包括RDB、AOF和混合持久化等,同时,还讨论了Redis的主从复制、集群配置以及高可用性方案,感兴趣的朋友跟随小编一起看看吧

淘汰策略

当内存达到max_memory(在redis.conf中进行配置,主机内存96G,则设置为48G,因为持久化需要fork一份当前redis的快照)
首先明确淘汰策略并不会检测value内部的key,也即list的element,hash的field这些。

时限key中淘汰

淘汰策略意义
volatile-lru最长时间没有使用
volatile-lfu最少次数使用 或 随机采样
volatile-ttl最近要过期
volatile-random随机

所有key中淘汰

淘汰策略意义
allkeys-lru最长时间没有使用
allkeys-lfu最少次数使用 或 随机采样
volatile-random随机

禁止淘汰(默认)

指令返回错误

持久化

redis是一个内存数据库,所有的数据储存在内存中,虽然访问速度快但是易丢失。默认开启rdb持久化
fopen fwrite setbuf fflush fsync fclose
fwrite只是把buffer中的数据写到用户态缓冲区中,内核并不知情
fflush把fd对应的用户态缓冲区内部数据移动到page cache(高速缓存)
不调用fsync,数据也会到文件中,只不过不知道何时,通过LRU把page cache中的数据淘汰到file中。

机器断电,丢失1,2的数据
进程关闭,丢失1的数据
fork写时复制:子进程和父进程映射同一块物理内存。
父进程复制一块虚拟内存页表给子进程,同时二者设置为可读,二者虚拟内存映射到同一块物理页。只有其中的任意一个进程试图修改一个共享的只读物理页面时(例如,修改一个全局变量或在堆上分配新内存),才会写保护中断触发,物理页复制,谁修改,谁指向新的,把只读状态修改为可读可写状态。

利用fork进程 的功能给父进程的内存打了快照。
在维持了redis对外服务能力的基础上,对redis数据做了一次保存。

aof

通过追加写日志到buffer的方式进行持久化。顺序磁盘io≈内存随机io
但是会有数据冗余的情况,多条set只有最后一条set是有效的。
aof的策略:
①always 一旦有对redis的修改就要落盘
②every_sec (bio_fsync_aof)每秒钟进行一次落盘
③no buffer的数据到page cache(见上)

aof-rewrite
fork一份子进程,只保存redis内存当前的状态,根据内存数据状态生成aof文件,避免同一个key的历史冗余。在重写aof期间,对redis所有的写操作记录到重写缓冲区,当重写结束后,附加到aof文件末尾。

rdb

通过fork子进程进行持久化,基于内存中的数据进行持久化。但是缺点是rdb不能看到两次rdb之间数据的修改。
rdb-aof混合持久化
在rdb持久化期间,对redis的写操作记录到重写缓冲区,rdb持久化建立后,附加到aof文件末尾

redis持久化相关配置

在redis.conf中完成配置

######### aof #########
# redis.cnf
appendonly no
appendfilename "appendonly.aof"
# aof read write  invert
# appendfsync always
appendfsync everysec
# appendfsync no
# auto-aof-rewrite-percentage 为 0 则关闭 aof 复写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# yes 如果 aof 数据不完整,尽量读取最多的格式正确的数据;
# no 如果 aof 数据不完整 报错,可以通过 redis-check-aof 来修复 aof 文件;
aof-load-truncated yes
# 开启混合持久化
aof-use-rdb-preamble yes
######### rdb #########
# save ""
# save 3600 1
# save 300 100
# save 60 10000

aof

# 开启 aof
appendonly yes
# 关闭 aof复写
auto-aof-rewrite-percentage 0
# 关闭 混合持久化
aof-use-rdb-preamble no
# 关闭 rdb
save ""
# 1. 每条命令刷盘 redis 事务才具备持久性
# appendfsync always
# 2. 每秒刷盘
appendfsync everysec
# 3. 交由系统刷盘
# appendfsync no

aof-fwrite

# 开启 aof
appendonly yes
# 开启 aof复写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 关闭 混合持久化
aof-use-rdb-preamble no
# 关闭 rdb
save ""
# 1. redis 记录上次aof复写时的size,如果之后累计超过了原来的size,则会发生aof复写;
auto-aof-rewrite-percentage 100
# 2. 为了避免策略1中,小数据量时产生多次发生aof复写,策略2在满足策略1的前提下需要超过 64mb 才会发生aof复写;
auto-aof-rewrite-min-size 64mb

rdb

# 关闭 aof 同时也关闭了 aof复写
appendonly no
# 关闭 aof复写
auto-aof-rewrite-percentage 0
# 关闭 混合持久化
aof-use-rdb-preamble no
# 开启 rdb 也就是注释 save ""
# save ""
save 3600 1
save 300 100
save 60 10000
# redis 默认策略如下;
# 注意;写了多个 save 策略,只需要满足一个则开启rdb持久化
# 3600 秒内有以1次修改
save 3600 1
# 300 秒内有100次修改
save 300 100
# 60 秒内有10000次修改
save 60 10000

rdb-aof混合持久化

# 开启 aof
appendonly yes
# 开启 aof复写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 开启 混合持久化
aof-use-rdb-preamble yes
# 关闭 rdb
save ""

redis持久化方案的优缺点

特性AOF (Append Only File)RDB (Redis Database Snapshot)
优点数据可靠,丢失较少
持久化过程代价较低
RDB 文件小
数据恢复快
缺点AOF 文件过大
数据恢复慢
数据丢失较多
持久化过程代价较高(fork子进程实现)

高可用:Redis主从复制数据备份+主从切换机制-在几秒钟内得到合理答案

主要用来实现redis数据的可靠性;防止redis所在的磁盘损坏,造成数据永久丢失;
redis主从间采用异步复制的方式;异步复制优点高效,缺点是只能保证最终一致。现代分布式系统都是半数一致性。

#redis.conf
replicaof 127.0.0.1 7002
info replication

主从切换

哨兵模式
只保证一个节点的可用性

redis-cluster集群

多个中心节点对外提供服务。

问题:向其中一个主节点写入数据时,怎么保证数据均衡地落到其他主节点
关注分布式一致性hash
配置redis-cluster集群

https://github.com/0voice

到此这篇关于redis的主从同步与对象模型的文章就介绍到这了,更多相关redis主从同步与对象模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 记录一次并发情况下的redis导致服务假死的问题解决

    记录一次并发情况下的redis导致服务假死的问题解决

    由于Redis需要依赖于操作系统环境,如果系统资源受限,比如过量的进程在挤占系统资源、系统死锁等情况,本文主要介绍了记录一次并发情况下的redis导致服务假死的问题解决,感兴趣的可以了解一下
    2023-09-09
  • 基于Redis无序集合如何实现禁止多端登录功能

    基于Redis无序集合如何实现禁止多端登录功能

    这篇文章主要给你大家介绍了关于基于Redis无序集合如何实现禁止多端登录功能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Redis数据结构-跳跃表skiplist详解

    Redis数据结构-跳跃表skiplist详解

    这篇文章主要介绍了Redis数据结构-跳跃表skiplist,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-09-09
  • 浅谈Redis中LFU算法源码解析

    浅谈Redis中LFU算法源码解析

    Redis的LFU淘汰算法主要用于 maxmemory-policy 设置为allkeys-lfu或volatile-lfu时,以最少使用频率的键进行淘汰,本文主要介绍了浅谈Redis中LFU算法源码解析,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Redis高效检索地理位置的原理解析

    Redis高效检索地理位置的原理解析

    这篇文章主要介绍了Redis是如何高效检索地理位置,通过geo相关的命令,可以很容易在redis中存储和使用经纬度坐标信息,具体实现方法跟随小编一起看看吧
    2021-06-06
  • 基于Redis实现每日登录失败次数限制

    基于Redis实现每日登录失败次数限制

    这篇文章主要介绍了通过redis实现每日登录失败次数限制的问题,通过redis记录登录失败的次数,以用户的username为key,本文给出了实例代码,需要的朋友可以参考下
    2019-08-08
  • 使用Redis完成接口限流的过程

    使用Redis完成接口限流的过程

    在一个高并发系统中对流量的把控是非常重要的,当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用,为了避免这种情况的发生我们就需要在请求接口时对接口进行限流的操作,这篇文章主要介绍了使用Redis完成接口限流的过程,需要的朋友可以参考下
    2024-05-05
  • 详解Redis单线程架构的优势与不足

    详解Redis单线程架构的优势与不足

    很多人都遇到过这么一道面试题:Redis是单线程还是多线程?这个问题既简单又复杂,说他简单是因为大多数人都知道Redis是单线程,说复杂是因为这个答案其实并不准确,本文就给大家讲讲Redis单线程架构的优势与不足,需要的朋友可以参考下
    2024-02-02
  • 搭建Caffeine+Redis多级缓存机制

    搭建Caffeine+Redis多级缓存机制

    本文主要介绍了搭建Caffeine+Redis多级缓存机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • 基于redis+lua进行限流的方法

    基于redis+lua进行限流的方法

    这篇文章主要介绍了基于redis+lua进行限流,通过实例代码详细介绍了lua+redis进行限流的做法,开发环境使用idea+redis+lua,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07

最新评论