一 Redis持久化机制
RDB文件的载入工作是在服务器启动时自动执行的,并没有专门的命令。但是由于AOF的优先级更高,因此当AOF开启时,Redis会优先载入AOF文件来恢复数据;只有当AOF关闭时,才会在Redis服务器启动时检测RDB文件,并自动载入。服务器载入RDB文件期间处于阻塞状态,直到载入完成为止。
Redis载入RDB文件时,会对RDB文件进行校验,如果文件损坏,则日志中会打印错误,Redis启动失败。
(一)、RDB持久化模式
1、Redis DataBase(简称RDB)模式说明
1.1 RDB 文件是在硬盘上的二进制文件Redis 定期 将内存数据保存到RDB文件中;
1.2 RDB模式 redis默认的规则;
1.3 RDB模式记录的是内存存储的数据在某一时刻的快照 ,持久化效率更高(只保留最新数据);
1.4 RDB模式由于定期持久化,可能导致数据丢失;
1.5 RDB 文件可在 Redis 启动的时候载入;
1.6 RDB 文件是 Redis 节点复制时的媒介。
2、RDB命令
2.1 持久化操作 save 同步操作 可能其他线程陷入阻塞
2.2 后端持久化 bgsave 异步操作 用户操作不会陷入阻塞 该操作什么时候完成不清楚。
3、RDB模式配置
save 900 1 900秒内用户更新1次 则持久化1次
save 300 10 300秒内用户更新10次 持久化 1次
save 60 10000 60秒内用户更新10000次 持久化1次
save 1 1 保证数据安全性 问题:效率极低 阻塞…
如果想让持久化性能更优,则需要通过监控的手段灵活运用。
RDB常用的配置项,以及默认值:
save m n:bgsave自动触发的条件;如果没有save m n配置,相当于自动的RDB持久化关闭,不过此时仍可以通过其他方式触发;
stop-writes-on-bgsave-error yes:当bgsave出现错误时,Redis是否停止执行写命令;设置为yes,则当硬盘出现问题时,可以及时发现,避免数据的大量丢失;设置为no,则Redis无视bgsave的错误继续执行写命令,当对Redis服务器的系统(尤其是硬盘)使用了监控时,该选项考虑设置为no;
rdbcompression yes:是否开启RDB文件压缩。Redis默认采用LZF算法对RDB文件进行压缩。虽然压缩耗时,但是可以大大减小RDB文件的体积,因此压缩默认开启;可以通过命令关闭;
rdbchecksum yes:是否开启RDB文件的校验,在写入文件和读取文件时都起作用;关闭checksum在写入文件和启动文件时大约能带来10%的性能提升,但是数据损坏时无法发现;
dbfilename dump.rdb:RDB文件名;
dir ./:RDB文件和AOF文件所在目录
2、AOP持久化模式
Append-only file (简称AOF) 将“操作 + 数据”以格式化指令的方式追加到操作日志文件的尾部,在append操作返回后(已经写入到文件或者即将写入),才进行实际的数据变更,“日志文件”保存了历史所有的操作过程;当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。
2.1 AOP持久化特点
优点:可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会丢失1s的数据;且如果日志写入不完整支持redis-check-aof来进行日志修复;AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)
AOF持久化时,采用异步方式进行
缺点:AOF文件做追加的操作,文件较大,且恢复速度慢,需定期清理。
我们可以简单的认为AOF就是日志文件,AOF的特性决定了它相对比较安全,如果你期望数据更少的丢失,那么可以采用AOF模式。同时需要提醒,如果你的redis持久化手段中有aof,那么在server故障失效后再次启动前,需要检测aof文件的完整性。AOF默认关闭,开启方法,修改配置文件reds.conf: appendonly yes
2.2 AOF持久化原则
appendfsync always 用户执行一次操作,持久化一次
appendfsync everysec 每秒持久化一次
appendfsync no 不主动持久化
二 Redis内存优化策略
1、内存说明
Redis运行环境在内存中,但是内存资源是有限的,不能一味扩容,所以需要对内存进行优化。
Redis内存大小的设定:
最大内存设定:
2、LRU算法
LRU是Least Recently Used的缩写,即**最近最少使用**,是一种**常用的页面置换算法**,选择最近最久未使用的页面(数据)予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
维度: 时间T
3、LFU算法
LFU(least frequently used (LFU) page-replacement algorithm)。即最不经常使用页置换算法,要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。
维度: 引用次数
4、随机算法
随机生成挑选数据删除
5、TTL算法
根据设定了超时时间的数据,将快要超时的数据提前删除
6、算法优化
6.1
volatile-lru 设定超时时间的数据中,采用lru算法删除数据
allkeys-lru 在所有数据中,采用lru算法删除数据
volatile-lfu 设定超时时间的数据中,采用lfu算法删除数据
allkeys-lfu 在所有数据中,采用lfu算法删除数据
volatile-random 设定超时时间的数据中,采用随机算法删除数据
allkeys-random 在所有数据中,采用随机算法删除数据
volatile-ttl 设定超时时间的数据中,采用ttl算法删除数据
6.2
noeviction默认不删除数据,如果内存满了,则报错返回
三 关于Redis缓存常见面试题
1、缓存穿透
在高并发的条件下,用户频繁访问一个不存在的数据.导致大量的请求直接发往数据库.导致服务器宕机.
解决方案:
1.1 布隆过滤器
布隆过滤器在Redis里面就是一个大型位数组跟几个无偏hash函数组成(所谓无偏hash就是能够相对的将数据算的比较均匀)。步骤如下:
1.1.1 当一个key添加到布隆过滤器时,使用hash函数对key进行hash得一个整数;
1.1.2 将第一步得到的整数对数组长度进行取模,得到的值就是key所在的数组位置;
1.1.3 将位置数组位置设为1;
1.1.4 使用下一个hash函数重复以上步骤;
1.2 IP限流 黑名单. 微服务中可以通过API网关进行控制
2、缓存击穿
在高并发条件下 用户频繁访问一个热点数据. 但是该热点数据在缓存中失效.导致用户直接访问数据库.
3、缓存雪崩
所谓缓存雪崩就是在某一时刻,缓存大量失效,导致大量请求直接打到数据库,给数据库带来巨大的负担
解决方案:
1.为热点数据设定超时时间时 采用随机数. 10秒+随机数 保障数据不会同时失效.
2. 设定多级缓存