zoukankan      html  css  js  c++  java
  • redis 学习(17) -- RDB

    redis -- RDB

    什么是 RDB

    经过RDB之后,redis会将内存中的数据创建一份快照到硬盘中,称为RDB文件(二进制)

    当redis重新启动时,会加载硬盘中的RDB文件,加载到内存中完成数据恢复。

    RDB 的触发方式 - 主要三种方式

    • save(同步)
    • bgsave(异步)
    • 自动
    1. save(同步)

    执行流程如下:

    • 在 save 的同时,其他命令会阻塞等待
    • 如果存在老的 RDB 文件,会先创建一个临时文件,然后对老文件进行替换
    • 时间复杂度,O(n)
    redis> save
    OK
    
    2. bgsave(异步)

    执行流程如下:

    • 调用 bgsave 后,会调用 linux 的 fork() 函数,创建一个子进程
    • 如果存在老的 RDB 文件,会先创建一个临时文件,然后对老文件进行替换
    • 时间复杂度,O(n)
    • 子进程名称:redis-rdb-bgsave
    redis> bgsave
    BAckground saving started
    
    3. 通过配置自动进行 RDB 操作
    • 内部相当于bgsave
    • Redis默认的save配置
    配置 second changes
    save 900 1
    save 300 10
    save 60 10000

    满足以上任一条件,将创建(bgsave)RDB 文件(二进制)。
    比如 60秒内,10000 条数据发生改变,将自动生成 RDB 文件。

    缺点
    不好控制 RDB 文件的生成,假如写入量很大的话 RDB 生成太过频繁,频繁写入硬盘,对硬盘负担很大。

    RDB 相关配置

    配置项 默认值 含义
    dbfilename dump.rdb RDB快照文件名
    dir ./ RDB快照文件生成所在目录
    stop-writes-on-bgsave-error yes bgsave时发生错误是否停止写入
    rdbcompression yes RDB文件是否采用压缩
    rdbchecksum yes 是否对RDB进行校验

    RDB 最佳配置

    • 不配置自动RDB操作
    • dbfilename dump-${port}.rdb
    • dir /redisDataPath
    • stop-writes-on-bgsave-error yes
    • rdbcompression yes
    • rdbchecksum yes

    不容忽视的触发机制

    • 主从复制时机的全量复制,master 节点会执行 bgsave
    • debug reload
    • shutdown
    • flushDB 、 flushAll

    演示

    这里重新写一个 redis-server 的启动配置文件,命名为 redis-6379.conf,放到 /opt/soft/redis/config/ 目录下,修改内容如下,其他配置保持默认不变。

    daemonize yes
    pidfile /var/run/redis-6379.pid
    port 6379
    logfile "6379.log"
    # save 900 1
    # save 300 10
    # save 60 10000
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump-6379.rdb
    dir /opt/soft/redis/data
    

    启动 redis 服务:

    redis-server /opt/soft/redis/config/redis-6379.conf
    

    启动客户端:

    redis-cli
    

    执行:

    可以看到,在 /opt/soft/redis/data/ 目录下,生成了 RDB文件。

    现在我们演示一下自动生成 RDB 文件操作,修改 redis-6379.conf 文件,配置自动 RDB 操作:

    save 60 5
    

    然后重启 redis 服务,启动 redis 客户端,执行:

    打印日志尾部信息,可以看到在 60 s 内发生了 5 次改变,所以生成了 RDB 文件。


    总结

    1. RDB 是 redis 内存到硬盘的快照,用于持久化。
    2. save 通常会阻塞 redis。
    3. bgsave 不会阻塞 redis,但是会 fork 新进程。
    4. save 自动配置满足任一就会被执行。
    5. 有些触发机制不容忽视。
  • 相关阅读:
    解决了Excel的一个貌似很奇怪的问题~~~
    关闭子页面,刷新父页面
    动态控制DataGrid中的TextBox的状态及输入值!!
    C#对Oracle BLOB字段的写入读取方法
    谈恋爱,好累...
    可移植,可扩展高效Proactor模式
    When are asynchronous file writes not asynchronous...
    [转]How to support 10,000 or more concurrent TCP connections
    [转]Creating a forwarding dll
    [转]非金钱激励员工的108种手段
  • 原文地址:https://www.cnblogs.com/weixuqin/p/10966763.html
Copyright © 2011-2022 走看看