持久化的模式
1 2 3 4 5 6 |
RDB模式 优点:速度快,适用于做备份,主从复制也是基于RDB持久化功能实现的。 缺点:会有数据丢失 AOF模式 优点:可以最大程度的保证数据不丢 缺点:日志记录量级比较大 |
缓存穿透:
1 |
访问一个不存在的key,缓存不起作用,请求会穿透到数据库中,流量过大会挂掉数据库。 |
解决方案:
1 2 |
采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的直接被过滤。 访问key未在数据库总查询到值,也将空值写入缓存,但可以设置较短的过期时间。 |
缓存雪崩:
1 |
大量的key设置了相同的过期时间,导致缓存在同一时刻全部失效,造成瞬时数据库请求量过大,压力大增,引起雪崩。 |
解决方案:
1 |
可以给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集中在同一时刻失效。 |
缓存击穿:
1 |
一个存在的key,在缓存过期的那一刻,同时有大量的请求。这些请求都会击穿到数据库,造成瞬时数据库请求量过大,压力大增。 |
解决方案:
1 |
在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期的key。 |
RDB工作模式
1 2 3 4 5 6 7 8 9 10 11 |
1.默认情况下,Redis保存数据集快照到磁盘,名为dump.rdb的二进制文件。你可以设置让Redis在N秒内至少有M次数据集改动时保存数据集,或者你也可以手动调用SAVE或者BGSAVE命令。 2.在上文中我们已经在配置文件中做过对应的配置: 例如,这个配置会让Redis在每个60秒内至少有1000次键改动时自动转储数据集到磁盘: save 60 1000 3.当 Redis 需要保存 dump.rdb 文件时,服务器执行以下操作: Redis 调用 fork() ,同时拥有父进程和子进程。 子进程将数据集写入到一个临时的 RDB 文件中。当子进程完成对新 RDB 文件的写入时, Redis 用新RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。 4.这种方式使得 Redis 可以从写时复制机制中获益。 |
RDB持久化优点
1 2 3 4 |
1.RDB是一种表示某个即时点的Redis数据的紧凑文件。RDB文件适合用于备份。例如,你可能想要每小时归档最近24小时的RDB文件,每天保存近30天的RDB快照。这允许你很容易的恢复不同版本的数据集以容灾。 2.RDB非常适合于灾难恢复,作为一个紧凑的单一文件,可以被传输到远程的数据中心。 3.RDB最大化了Redis的性能,因为Redis父进程持久化时唯一需要做的是启动(fork)一个子进程,由子进程完成所有剩余工作。父进程实例不需要执行像磁盘IO这样的操作。 4.RDB在重启保存了大数据集的实例时比AOF要快。 |
RDB持久化缺点
1 2 |
1.当你需要在Redis停止工作(例如停电)时最小化数据丢失,RDB可能不太好。你可以配置不同的保存点(save point)来保存RDB文件(例如,至少5分钟和对数据集100次写之后,但是你可以有多个保存点)。然而,你通常每隔5分钟或更久创建一个RDB快照,所以一旦Redis因为任何原因没有正确关闭而停止工作,你就得做好最近几分钟数据丢失的准备了。 2.RDB需要经常调用fork()子进程来持久化到磁盘。如果数据集很大的话,fork()比较耗时,结果就是,当数据集非常大并且CPU性能不够强大的话,Redis会停止服务客户端几毫秒甚至一秒。AOF也需要fork(),但是你可以调整多久频率重写日志而不会有损(trade-off)持久性(durability)。 |
RDB模式优缺点总结
1 2 |
1.优点:速度快,适合于用作备份,主从复制也是基于RDB持久化功能实现的。 2.缺点:会有数据丢失、导致服务停止几秒 |
RDB持久化参数:
1 2 3 4 5 6 7 |
[root@redis01 ~]# vim /usr/local/redis/etc/redis.conf dbfilename dump.rdb #rdb持久化数据文件名 dir /usr/local/redis #持久化数据文件存储位置 save 900 1 #15分钟内有一个数据变化就save持久化 save 300 10 #5分钟内有10个数据变化就save持久化 save 60 10000 #60秒内有10000个数据变化就save持久化 |
手动触发
1 2 |
save 会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。 bgsave 执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。 |
命令 | save | bgsave |
---|---|---|
IO 类型 | 同步 | 异步 |
是否阻塞 | 是 | 否(阻塞发生在 fork) |
优点 | 不会消耗额外内存 | 不阻塞客户端命令 |
缺点 | 阻塞客户端命令 | 创建 fork,消耗内存 |
AOF持久化
1 |
AOF(append only file)只追加文件,记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 |
AOF持久化参数:
1 2 3 4 5 6 |
[root@redis01 ~]# vim /usr/local/redis/etc/redis.conf appendonly yes #是否打开AOF日志功能 appendfsync always #每一条命令都立即同步到AOF #appendfsync everysec #每秒写一次 #appendfsync no #写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到AOF |
手动触发
1 |
127.0.0.1:6379> BGREWRITEAOF |