Redis进阶学习—持久化

192 阅读3分钟

1 Redis 作为缓存

Redis 可作为缓存使用也可做为数据库使用。

二者区别:

  • 缓存数据不重要,不是全量数据
  • 缓存数据随着访问变化而变化
  • 缓存只保留热数据
  • 数据库中数据绝对不能丢
  • 缓存追求速度,数据库追求速度+持久化
  • 内存中的数据掉电易失
  • redis 作为缓存一般使用RDB
  • redis 作为数据库使用 AOF

1.1 缓存只保留热数据

** 原因 **

内存的大小是有限制的(成为瓶颈)

1.2 Redis 数据怎么随着业务变化

1.2.1 随业务逻辑变化

key的有效期(某些数据只保存1天或几天)

key的有效期不会随着访问时间变长
发生写操作,会清楚key的过期时间
设置key的倒计时过期时间 EXPIRE key seconds

*** 过期Key的清除策略 ***

  • 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
  • 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
  • 当前已用内存超过maxmemory限定时,触发主动清理策略

1.2.2 随业务运转变化

因为内存是有限的,随着访问变化,淘汰调冷数据

设置内存使用大小及回收策略 maxmemory <bytes>
maxmemory-policy noeviction

2 Redis 持久化

Redis持久化有两种快照副本(RDB)和日志(AOF)

2.1 RDB

** 快照记录具有时点性 **

快照时,redis 启动一个子进程执行
使用fork 快照一个数据的指针集到子进程中(速度快,空间小)
fork 是 copy on write ,创建子进程的时候不发生拷贝

** save 保存**

使用save 时机:比如——关机维护

save 是同步保存操作,Redis实例中的某一时间点所有数据的快照,以RDB文件的形式保存到磁盘上
save 会阻塞所有的客户端

** bgsave 保存**

调用fork 创建一个子进程

** 相关配置 **

save <seconds> <changes>

save 900 1
save 300 10
save 60 10000

dbfilename dump.rdb
dir /var/lib/redis/6379

** 优点**

恢复数据相对快——类似 JAVA 序列化

** 缺点 **

不支持拉链 —— 永远只有一份dump.rdb
时点与时点之间的数据容易丢失

2.2 AOF

AOF 是把Redis的写操作记录到文件中

在redis中,如果同时开启了RDB和AOF,只会使用AOF来恢复数据

4.0 以前:删除抵消的命令,合并重复的命令—最终生成一个纯指令的日志文件
4.0以后:将老的数据RDB Appned到AOF文件中—AOF是一个混合体,利用了RDB的快,利用了日志的全量

** 相关配置 **

appendonly yes
appendfilename "appendonly.aof"
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes
写策略

appendfsync always — 写完就flush appendfsync everysec — 写完每秒flush
appendfsync no — 写buffer,满了之后flush

** 优点 **

丢失数据相对少

** 缺点 **

4.0 前 AOF体量无限变大
redis是内存数据库,写操作时会触发IO