Redis持久化机制和内存回收机制
中国加油,武汉加油!
篇幅较长,配合目录观看
案例准备
1. Redis持久化机制
Redis会定期的把内存中的数据持久化到硬盘上,当Redis服务关闭后,重启Redis会自动把硬盘的数据恢复到内存中继续使用。
1.1 Redis两种持久化方式
1.1.1 RDB(快照,默认的方式)
- 记录当前Reids一瞬间的内存结构,以文件的形式保存的硬盘上。
- save: 手动进行快照,这个过程是前台快照,在执行的快照的的过程中,Redis是拒绝写命令的。
- bgsave: 手动进行快照,这个过程是后台快照,Redis会启动一个新的线程执行快照,当前线程是接收执行写命令的(它是把写的命令放到缓存中)
1.1.1.1 修改配置
cd /usr/local/redis3/bin
vim redis.conf
save 900 1 # 配置快照的频率,意思是900s之内有1个数据发送了变化就拍快照。
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes # 因为bgsave命令是启动一个新的线程执行快照,当前线程还是接收写命令的,如果新线程在执行快照的过程中出现错误是否停止写命令,默认是yes,这样用户可以感知到执行快照失败。
rdbchecksum yes # 快照时检查快照的完整性
dbfilename dump.rdb # 生成快照文件的名字(可以把这个文件发送给别人,启动后缓存就会有的对应的数据)
dir ./ #快照文件存放的位置
1.1.2 AOF(只追加文件)
AOF把服务器执行的所有写(增删改)的命令记录在一个文件中,并在服务器启动时,通过重新执行这些命令来还原数据集。
1.1.2.1 修改配置
appendonly no # 是否开启只追加文件
appendfilename "appendonly.aof" # 只追加文件的名称
# 只追加文件记录评率
# appendfsync always # 每次执行写操作后记录到只追加文件中(绝对安全)
appendfsync everysec # 每秒中记录一次只追加文件(默认值)
# appendfsync no # 不主动记录只追加文件,需要手动记录
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb # 只追加文件的大小,超过64兆新建一个文件记录命令
aof-load-truncated yes # 如果最后一个命令出现错误,是否丢弃。
1.2 快照 VS 只追加文件
- 快照:记录和恢复的速度快,数据的安全性不高(因为他是按照时间来记录的)
- 只追加文件:记录和恢复的速度慢(命令一旦很多久执行慢),数据安全性高(因为最多只丢失1s的数据)
- 如果Redis只是作为缓存服务器话,快照和只追加文件都可以关闭,这样可以大大的提高Redis读写性能,如果对数据要求安全性很高,则两个都可以开启。
2. Reids内存回收机制
cd /usr/local/redis3/bin
vim redis.conf
算法名称 | 算法描述 |
---|---|
volatile-lru | 只限于设置了 expire 的部分; 优先删除最近最少使用的 key |
allkeys-lru | 所有key通用; 优先删除最近最少使用的 key |
volatile-random | 采用随机淘汰策略删除超时的键值对 |
allkeys-random | 只限于设置了 expire 的部分; 随机删除一部分 key |
volatile-ttl | 只限于设置了 expire 的部分; 优先删除剩余时间短的key |
noeviction | 不淘汰任何键值对,当内存已满,只支持读,不支持写 |
2.1 注意
为了提高垃圾回收的策略,LRU和TTL算法都不是精确的算法,而是一个近似的算法。
就是他会根据探测样本的数量设置,来进行探测,然后根据探测到这几个进行淘汰。
LRU:看命中率
maxmemory-samples 5 #设置抽取的样本数量
2.2 总结
- 默认的回收策略:默认不回收
- 设置回收的算法:LRU,random,TTL
- 算法不是精确的,而是采样的方式,可以设置采样的个数,默认是5个