redis - 知识点

docker下的安装

  1. docker redis的镜像链接
    选择自己需要的tag。

  2. 然后在docker下运行 docker pull redis:latest (我这里选择了latest,图方便)

  3. 运行 docker images ,查看拉取的镜像的repository名字(我这里是叫做redis)

  4. 第一次运行,执行docker run -itd --name redis-docker -p 6379:6379 redis (name:随便起,redis是步骤三查到的名字,-p 6379:6379 对应的是容器端口:宿主端口。-itd:交互式,虚拟控制台,后台运行)
    第二次以及更多次的运行,执行 docker start redis-docker即可。(redis-docker是第一次运行,指定的名字)

  5. 运行 docker ps ,查看容器的运行信息。

  6. 运行docker exec -it redis-docker /bin/bash,在容器中运行命令,连接redis服务。

  7. 最后输入redis-cli,进入redis服务端。

持久化方式

持久化方式分为RDB和AOF。

RDB

将当前瞬间的数据生成快照,保存到磁盘中。分为手动触发和自动触发。

通过配置文件的dbfilename dump.rdb指定rdb文件名。

通过config set dir new_dirconfig set dbfilename new_dbfilename在运行期动态指定。

优点:RDB是一个二进制文件,代表redis在某个时间点上的数据快照。非常适用于备份,全量复制等场景。加载RDB恢复数据的效率高于AOF。

缺点:RDB没办法做到实时性(秒级)持久化,因为每次bgsave执行,都要执行fork操作创建子进程,属于重量级操作。RDB此外呢,使用特定的二进制格式保存,Redis版本推进过程中有多个格式的RDB版本,存在兼容性问题。

  • 手动触发:save命令和bgsave命令。

    save:会阻塞当前的redis服务端,直到rdb过程完成。线上不推荐使用。

    bgsave:redis进程执行fork操作创建子进程,rdb过程由子进程负责,执行完成会自动退出。阻塞会发生在fork操作,一般时间会很短。在执行持久化的阶段中,多次使用lastsave命令查看返回的时间戳是否变化,来判断是否执行成功。

  • 自动触发:配置文件的save命令、从节点的全量复制操作、debug reload操作、shutdown操作

    配置文件中的"save 900 1" (在900秒内,执行一个写命令时,使用bgsave的方式启用RDB)。

    从节点发生全量复制操作,主节点自动执行bgsave操作生成rdb文件,并发送给从节点。

    debug reload:save当前的rdb,清空当前的redis数据库,重新加载rdb。(save的过程中,不接收写命令,直到save过程完成)

    shutdown:关闭所有的客户端。如果有设置save策略,执行rdb持久化。如果有开启aof,刷新aof。关闭redis服务端。

redis - 知识点
1)执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进 程,如RDB/AOF子进程,如果存在bgsave命令直接返回。

2)父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通 过info stats命令查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒

3)父进程fork完成后,bgsave命令返回“Background saving started”信息并不再阻塞父进程,可以继续响应其他命令。

4)子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的 时间,对应info统计的rdb_last_save_time选项。

5)子进程发送信号给父进程表示完成,父进程更新统计信息,具体见 info Persistence下的rdb_*相关选项。

AOF