redis原理之快照(rdb)原理

redis 的持久化有两种 一种就是rdb 另一种就是 aof

首先 看看rdb的配置,在redis.conf中 (yum安装 的话默认在 /etc/redis.conf)中


save 900 1
save 300 10
save 60 10000

900秒内,如果超过1个key被修改,则发起快照保存
300秒内,如果超过10个key被修改,则发起快照保存
60秒内,如果1万个key被修改,则发起快照保存

redis rdb的文件保存位置,也是在 redis.conf中


dbfilename dump.rdb  #这个代表rdb文件的文件名

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /var/lib/redis  # 这里代表 rdb文件的问价存储路径

所以rdb文件存储在 /var/lib/redis/dump.rdb

实现原理

Redis 使用操作系统的多进程 COW(Copy On Write) 机制来实现快照持久化。Redis 在持久化时会调用 glibc 的函数 fork 产生一个子进程,快照持久化完全交给子进程来处理,父进程继续处理客户端请求。子进程刚刚产生时,它和父进程共享内存里面的代码段和数据段。这时你可以将父子进程想像成一个连体婴儿,共享身体。这是 Linux 操作系统的机制,为了节约内存资源,所以尽可能让它们共享起来。在进程分离的一瞬间,内存的
增长几乎没有明显变化。

子进程做数据持久化,它不会修改现有的内存数据结构,它只是对数据结构进行遍历读取,然后序列化写到磁盘中。但是父进程不一样,它必须持续服务客户端请求,然后对内存数据结构进行不间断的修改。

​ 这个时候就会使用操作系统的 COW 机制来进行数据段页面的分离。数据段是由很多操作系统的页面组合而成,当父进程对其中一个页面的数据进行修改时,会将被共享的页面复制一份分离出来,然后对这个复制的页面进行修改。这时子进程相应的页面是没有变化的,还是进程产生时那一瞬间的数据.

​ 随着父进程修改操作的持续进行,越来越多的共享页面被分离出来,内存就会持续增长。但是也不会超过原有数据内存的 2 倍大小。另外一个 Redis 实例里冷数据占的比例往往是比较高的,所以很少会出现所有的页面都会被分离,被分离的往往只有其中一部分页面。每个页面的大小只有 4K,一个 Redis 实例里面一般都会有成千上万的页面。
子进程因为数据没有变化,它能看到的内存里的数据在进程产生的一瞬间就凝固了,再也不会改变,这也是为什么 Redis 的持久化叫「快照」的原因。接下来子进程就可以非常安心的遍历数据了进行序列化写磁盘了.

总的来说就是 COW 就是 用两个进程,主进程会复制一份数据页面进行修改,而子进程会将修改前的数据进行持久化到磁盘中。

所以可以确认rdb文件备份一定会比当前修改版本落后。

redis内存淘汰机制

通过 配置redis.conf中的maxmemory这个值来开启内存淘汰功能

maxmemory为0的时候表示我们对Redis的内存使用没有限制。默认是没有配置的 ,默认是 0,redis 默认的淘汰策略为 noeviction (当内存使用达到阈值的时候,所有引起申请内存的命令会报错。)

我们可以在redis 中使用info来查看 内存配置

# Memory
used_memory:813440
used_memory_human:794.38K
used_memory_rss:6062080
used_memory_rss_human:5.78M
used_memory_peak:853712
used_memory_peak_human:833.70K
total_system_memory:1927323648
total_system_memory_human:1.79G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0  #redis最大使用内存
maxmemory_human:0B
maxmemory_policy:noeviction #默认内存淘汰机制
mem_fragmentation_ratio:7.45
mem_allocator:jemalloc-3.6.0
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值