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 10000dbfilename 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