[redis] redis配置中的save引起rdb快照生成的规则
  TEZNKK3IfmPf 2023年11月13日 87 0

 

分析redis配置中的save, 具体是以何种规则来触发生成rdb.

redis配置中的注释:

#
# Save the DB on disk:
#
# save <seconds> <changes>
#
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# In the example below the behaviour will be to save:
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
#
# Note: you can disable saving completely by commenting out all "save" lines.
#
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save ""

save 900 1
save 300 10
save 60 10000

解释下:

save后边有两个参数:

  • 第一个参数是以秒为单位的周期
  • 第二个参数是该周期内key的变动次数

如果在该周期到达时, key的变动次数达到第二个配置参数的值, 则触发rdb生成.

否则开始新的周期, 上个周期内变动的key的数量, 算作新周期内key的数量.

比如:

设置 save 5 3

以5秒为周期, key的变动次数为3.

  1. 第一个5秒的周期, 设置了2个key, 那么不会触发rdb生成.
  2. 随后的5秒的 周期内, 因为上一个周期没有生成rdb, 所以上一个统计周期的key的变动次数2, 记录进本周期. 本周期只要有1个key变动, 则触发rdb生成

测试:

配置 save 5 3

测试脚本:

#!/bin/bash

RDB=./7000/dump.rdb

echo du -b $RDB
du -b $RDB

echo redis-cli -p 7000 set k1 v1
redis-cli -p 7000 set k1 v1

echo redis-cli -p 7000 set k2 v2
redis-cli -p 7000 set k2 v2

echo du -b $RDB
du -b $RDB

echo sleep 7s
sleep 7s

echo du -b $RDB
du -b $RDB

echo redis-cli -p 7000 set k3 v3
redis-cli -p 7000 set k3 v3

echo du -b $RDB
du -b $RDB

echo sleep 1s
sleep 1s

echo du -b $RDB
du -b $RDB

echo '------------------------------'


echo redis-cli -p 7000 set k4 v4
redis-cli -p 7000 set k4 v4

echo redis-cli -p 7000 set k5 v5
redis-cli -p 7000 set k5 v5

echo du -b $RDB
du -b $RDB

echo sleep 1s
sleep 1s

echo du -b $RDB
du -b $RDB

echo redis-cli -p 7000 set k6 v6
redis-cli -p 7000 set k6 v6

echo du -b $RDB
du -b $RDB

echo sleep 1s
sleep 1s

echo du -b $RDB
du -b $RDB

echo sleep 3s
sleep 3s

echo du -b $RDB
du -b $RDB

执行结果:

du -b ./7000/dump.rdb
176 ./7000/dump.rdb
redis-cli -p 7000 set k1 v1
OK
redis-cli -p 7000 set k2 v2
OK
du -b ./7000/dump.rdb
176 ./7000/dump.rdb
sleep 7s
du -b ./7000/dump.rdb
176 ./7000/dump.rdb
redis-cli -p 7000 set k3 v3
OK
du -b ./7000/dump.rdb
176 ./7000/dump.rdb
sleep 1s
du -b ./7000/dump.rdb
202 ./7000/dump.rdb
------------------------------
redis-cli -p 7000 set k4 v4
OK
redis-cli -p 7000 set k5 v5
OK
du -b ./7000/dump.rdb
202 ./7000/dump.rdb
sleep 1s
du -b ./7000/dump.rdb
202 ./7000/dump.rdb
redis-cli -p 7000 set k6 v6
OK
du -b ./7000/dump.rdb
202 ./7000/dump.rdb
sleep 1s
du -b ./7000/dump.rdb
202 ./7000/dump.rdb
sleep 3s
du -b ./7000/dump.rdb
224 ./7000/dump.rdb

结论:

  1. save配置的时间周期内, 如果key变动数量没到达, 则进入下一个周期累计
  2. 如果save配置的时间周期内, key的变动数量到达, 但是没到达时间周期, 依然不会触发rdb生成. 必须要等到周期结束的时间点才会生成.
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   30   0   0 redis用户
  TEZNKK3IfmPf   2024年05月31日   30   0   0 dataredis
  TEZNKK3IfmPf   2024年05月31日   27   0   0 sqlite数据库
  TEZNKK3IfmPf   2024年05月31日   27   0   0 awkredis
  TEZNKK3IfmPf   2024年05月31日   31   0   0 数据库mysql
  TEZNKK3IfmPf   2024年05月31日   27   0   0 数据库mysql
TEZNKK3IfmPf