5.redis相关
参考外部博文
一、Redis入坟
https://www.jianshu.com/p/583d105cd2a5
二、Redis入坟(二)高级特性,发布订阅、事务、Lua脚本
https://www.jianshu.com/p/0070033af93a
三、Redis入坟(三)Redis为什么这么快?
https://www.jianshu.com/p/9866165b2384
四、Redis入坟(四)Redis内存回收知多少
https://www.jianshu.com/p/8a34d1594046
五、Redis入坟(六)分布式集群,概念、原理、实操
https://www.jianshu.com/p/199255aa7bf1
六、Redis入坟(八)内存管理与优化,面试必考
https://www.jianshu.com/p/d39f087850c9
七、Redis入坟(番外篇)配置文件redis.conf,解析每个参数的含义
https://www.jianshu.com/p/564c6cbd1cbc
一、redis持久化机制
https://www.cnblogs.com/xingzc/p/5988080.html
二、redis api相关操作
https://www.jianshu.com/p/a21ea6828249
三、缓存穿透及布隆过滤器
https://www.jianshu.com/p/60b036355523
四、缓存雪崩、集群搭建
https://www.jianshu.com/p/436537e0f1bb
五、redis实现分布式锁
https://www.jianshu.com/p/71e066a3a456
RDB持久化
1.手动触发
save命令:主线程处理持久化,会阻塞client端发出的命令。
bgsave命令:主线程fork一个子线程处理持久化,主线程继续处理client请求,主线程不阻塞。
2.自动触发RDB持久化 ,配置redis.conf
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
具体持久化流程
1). Redis先fork子进程。
2). 子进程将快照数据写入到临时RDB文件中。
3). 当子进程完成数据写入操作后,再用临时文件替换老的文件。
AOF持久化 redis.conf配置
# 是否启用aof持久化方式 。否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。
# 因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly yes
#AOF持久化时机,共有3个可选值:
# no:表示等操作系统进行数据缓存同步到磁盘(快,持久化没保证)
# always:同步持久化,每次发生数据变更时,立即记录到磁盘(慢,安全)
# everysec:表示每秒同步一次(默认值,很快,但可能会丢失一秒以内的数据)
# appendfsync always
appendfsync everysec
aof重写机制(即混合持久化机制)
1.手动触发
执行bgrewriteaof命令
2.自动触发
#当AOF文件增长到一定大小的时候Redis能够调用 BGREWRITEAOF 对日志文件进行重写 。
#当AOF文件大小大于该配置项时自动开启重写
auto-aof-rewrite-min-size 64mb
#当AOF文件增长到一定大小的时候Redis能够调用 BGREWRITEAOF 对日志文件进行重写 。
#当AOF文件大小的增长率大于该配置项时自动开启重写。
auto-aof-rewrite-percentage 100
3.no-appendfsync-on-rewrite参数
在执行bgrewriteaof操作和主进程写aof文件的操作,两者都会操作磁盘,而bgrewriteaof往往会涉及大量磁盘操作,这样就会造成主进程在写aof文件的时候出现阻塞的情形,现在no-appendfsync-on-rewrite参数出场了。如果该参数设置为no,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题。如果设置为yes呢?这就相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区,因此这样并不会造成阻塞(因为没有竞争磁盘),但是如果这个时候redis挂掉,就会丢失数据。丢失多少数据呢?在linux的操作系统的默认设置下,最多会丢失30s的数据。
因此,如果应用系统无法忍受延迟,而可以容忍少量的数据丢失,则设置为yes。如果应用系统无法忍受数据丢失,则设置为no。
#值为no代表不能忍受数据丢失
no-appendfsync-on-rewrite no
4.aof重写流程
image.png