前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于Redis的几件小事 | 持久化/缓存雪崩与穿透

关于Redis的几件小事 | 持久化/缓存雪崩与穿透

作者头像
大数据真好玩
发布2019-08-08 15:41:27
1.1K0
发布2019-08-08 15:41:27
举报
文章被收录于专栏:暴走大数据暴走大数据

1.redis持久化的意义

redis持久化的意义,在于 故障恢复 。 如果没有对数据进行持久化,那么如果redis遇到灾难性的故障,就会丢失所有的数据。 如果通过redis的持久化机制将数据持久化到硬盘上面去,然后在定期将磁盘上的文件备份到一起其他的服务器上面(比如:云服务器),这样就可以保证即使redis遇到了灾难事故,也可以使用提前备份的文件对数据进行回复,之后丢失最近的一部分数据,而不会全部丢失数据。

2.redis的两种持久化方式

redis的持久化是跟高可用相关的。redis有两种持久化的方式,分别是RDB和AOF。

(1)RDB和AOF两种持久化机制介绍

RDB持久化机制,对redis中的数据执行周期性的持久化。 AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的时候,可以通过回复AOF日志中的写入指令来重新构建整个数据集。 如果我们想要redis仅仅作为纯内存的缓存来用,那么可以禁止RDB和AOF所有持久化机制。 通过RDB或AOF,都可以将redis内存中的数据给持久化到磁盘上面去,然后可以将这些数据备份到别的地方去。 如果redis挂了,服务器上的内存和磁盘上的数据都丢了,可以从云服务上拷贝回来之前的数据,放到指定的目录中,然后重新启动redis,redis就会自动根据持久化数据文件中的数据,去恢复内存中的数据,继续对外提供服务。 如果同时使用RDB和AOF两种持久化机制,那么在redis重启的时候,会使用AOF来重新构建数据,因为AOF中的数据更加完整。

(2)RDB持久化机制的优点

①RDB会生成多个数据文件,每个数据文件代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备。 做冷备优势 :由redis去控制固定时长生成快照文件的事情,比较方便;在最坏的情况下,提供数据恢复的时候,比AOF速度快。

②RDB持久化对redis对外提供的读写服务,影响非常小,可以让redis保持高性能,因为redis主进程会fork一个子进程,让子进程执行磁盘的IO操作来进行RDB持久化。 原因 :RDB直接写redis内存,只是在一定时候,才会将数据写入内存。AOF每次都是直接写文件,虽然可以快速的写os cache中,但还是要耗费一定时间,比RDB略慢一些。

③相对于AOF持久化机制来说,直接基于RDB数据文件来重启和恢复redis进程,更加快速。 原因 :AOF,存放的指令日志,做数据恢复的时候,其实是要回放和执行所有的指令日志,来恢复出来内存中的所有数据的。 RDB,就是一份数据文件,恢复的时候,直接加载到内存中即可。

(3)RDB持久化的缺点

①如果想要在redis故障时,尽可能少的丢失数据,那么RDB没有AOF好。因为RDB都是每隔一段时间去做的备份,如果redis宕机,那么就会丢失这一段时间内所有的数据。所以不适合做第一优先的恢复方案。

②RDB每次在fork子进程来执行RDB快照文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停数毫秒,设置数秒。 一般不要让RDB的间隔时间太长,否则每次生成的RDB文件太大了,对redis本身的性能也有影响。

(4)AOF持久化的优点

①AOF可以更好的保护数据不丢失。 原因 :一般AOF会每隔1秒,通过一个后台进程执行一次fsync操作。将 os cache里面的数据刷到磁盘里面去,这样就算redis挂了,也至多丢失一秒钟的数据。

②AOF日志文件是以append-only模式写入,所以没有任何的磁盘寻址的开销,写入性能非常高,而且文件不容易破损,即使文件维普破损,也很容易修复。

③AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。 原因 :因为在rewrite log的时候,会对其中的指令进行压缩,创建出一份恢复数据的最小日志出来。在创建新日志文件的时候,老的日志文件还是照常写入。当新的merge后的日志文件ready的时候,再交换新老日志文件即可。

④AOF日志文件的命令是通过非常可读的方式进行记录的,这非常适合做 误删除这种操作的紧急回复。 原因 :比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据。

(5)AOF持久化的缺点

①对于同一份数据来说,AOF日志通常比RDB文件更大。

②AOF开启后,支持的QPS会比RDB支持的QPS低。 原因 :因为AOF一般会配置成每秒fsync一次日志文件,当然,每一秒fsync性能还是可以的。

③AOF比RDB更加脆弱,可能会出现恢复出来的数据不一致的情况。类似AOF这种较为复杂的基于命令日志/merge/回放的方式,比基于RDB每次持久化一份完整的数据快照文件的方式,更加脆弱一些,容易有bug。不过AOF就是为了避免rewrite过程导致的bug,因此每次rewrite并不是基于旧的指令日志进行merge的,而是基于当时内存中的数据进行指令的重新构建,这样健壮性会好很多。

④在做数据恢复的时候比较慢,想用来做冷备、定期备份比较麻烦,可能要自己写脚本去做。不太适合做冷备。

(6)RDB和AOF如何选择

①不要仅仅使用RDB,这样会导致丢失很多数据。

②也不要仅仅使用AOF,因为使用AOF做冷备恢复速度太慢,还有可能会出现数据不一致。

③综合使用RDB和AOF两种持久化机制,用AOF保证数据不丢失,作为数据恢复的第一选择;用RDB来做不同程度的冷备,在AOF文件都丢失或者不可以的时候,还可以用RDB来进行快速的数据恢复。

3.缓存雪崩

(1)什么是缓存雪崩

缓存雪崩指的是在同一时刻,缓存大量失效,导致大量的请求直接到了数据库,数据库压力剧增,引起系统崩溃。可能出现的情况有: ①大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。 ②缓存系统出现故障,造成缓存系统无法提供服务,造成瞬时DB请求量大、压力骤增,引起雪崩。

(2)怎么避免缓存雪崩

事前 : ①在设置key的过期时间时,在过期时间上加上一个随机值,防止大量key同时过期。 ②搭建高可用的缓存架构,比如使用 哨兵+主从 结构或者使用 cluster模式,避免缓存系统出现故障。 ③可以在系统中使用ehcache做个小缓存,防止redis崩掉之后,还有一部分缓存。 事中 : ①对系统请求进行降级和限流,防止数据库之间崩掉。 事后 : 赶快使用redis持久化的数据,快速恢复缓存数据

4.缓存穿透

(1)什么是缓存穿透

缓存穿透是指有请求访问到了并不存在的数据,这样请求就会直接到达数据库,数据库就会压力剧增。

(2)怎么避免缓存穿透

①可以使用一个足够大的bitmap,将可能存在的key放到里面,请求过来先检查bitmap里面有么有,如果没有直接过滤掉这个请求。 ②将数据库查询出来的空值也放到缓存里面去,是这个key对应一个空值,只是这个key设置的时间比较短。

5.缓存击穿

(1)什么是缓存击穿

一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到数据库,造成数据库请压力骤增。

(2)怎么避免缓存击穿

在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。

— THE END —

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据真好玩 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.redis持久化的意义
  • 2.redis的两种持久化方式
    • (1)RDB和AOF两种持久化机制介绍
      • (2)RDB持久化机制的优点
        • (3)RDB持久化的缺点
          • (4)AOF持久化的优点
            • (5)AOF持久化的缺点
              • (6)RDB和AOF如何选择
              • 3.缓存雪崩
                • (1)什么是缓存雪崩
                  • (2)怎么避免缓存雪崩
                  • 4.缓存穿透
                    • (1)什么是缓存穿透
                      • (2)怎么避免缓存穿透
                      • 5.缓存击穿
                        • (1)什么是缓存击穿
                          • (2)怎么避免缓存击穿
                          相关产品与服务
                          云数据库 Redis
                          腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档