【Redis】Redis底层原理(持久化 分布式锁)

目录

持久化

RDB

给哪些内存数据做快照?

RDB文件的生成是否会阻塞主线程

bgsave执的行流程

RDB文件

RDB的优缺点

RDB的优点

RDB的缺点

Redis中RDB导致的数据丢失问题

AOF

使用AOF

AOF的工作流程

命令写入

重写机制

重启加载

文件校验

RDB-AOF混合持久化

Redis持久化相关的问题

主线程、子进程和后台线程的联系与区别?

Redis持久化过程中有没有其他潜在的阻塞风险?

为什么主从库间的复制不使用 AOF?

分布式锁

Redis分布式锁最简单的实现

如何避免死锁?

锁被别人释放怎么办?

Java代码实现分布式锁

锁过期时间不好评估怎么办?

分布式锁加入看门狗

分布式锁加入看门狗代码实现

Redisson中的分布式锁

集群下的锁还安全么?

Redlock真的安全吗?

Redlock实现整体流程

RedLock的是是非非

RedLock总结


持久化

Redis虽然是个内存数据库,但是Redis支持RDB和AOF两种持久化机制,将数据写往磁盘,可以有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。

RDB

RDB持久化是把当前进程数据生成快照保存到硬盘的过程。所谓内存快照,就是指内存中的数据在某一个时刻的状态记录。这就类似于照片,当你给朋友拍照时,一张照片就能把朋友一瞬间的形象完全记下来。RDB 就是Redis DataBase 的缩写。

给哪些内存数据做快照?

Redis 的数据都在内存中,为了提供所有数据的可靠性保证,它执行的是全量快照,也就是说,把内存中的所有数据都记录到磁盘中。但是,RDB 文件就越大,往磁盘上写数据的时间开销就越大。

RDB文件的生成是否会阻塞主线程

Redis 提供了两个手动命令来生成 RDB 文件,分别是 save 和 bgsave。

save:在主线程中执行,会导致阻塞;对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。 bgsave:创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是Redis RDB 文件生成的默认配置。

命令实战演示

image.png

【Redis】Redis底层原理(持久化 分布式锁)_第1张图片

image.png

image.png

除了执行命令手动触发之外,Redis内部还存在自动触发RDB 的持久化机制,例如以下场景:

1)使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave。

【Redis】Redis底层原理(持久化 分布式锁)_第2张图片

2)如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点。

3)执行debug reload命令重新加载Redis 时,也会自动触发save操作。

image.png

4)默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave。

【Redis】Redis底层原理(持久化 分布式锁)_第3张图片

关闭RDB持久化,在课程讲述的Redis版本(6.2.4)上,是将配置文件中的save配置改为 save “”

【Redis】Redis底层原理(持久化 分布式锁)_第4张图片

bgsave执的行流程

为了快照而暂停写操作,肯定是不能接受的。所以这个时候,Redis 就会借助操作系统提供的写时复制技术(Copy-On-Write, COW),在执行快照的同时,正常处理写操作。

【Redis】Redis底层原理(持久化 分布式锁)_第5张图片

bgsave 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据。bgsave 子进程运行后,开始读取主线程的内存数据,并把它们写入 RDB 文件。

如果主线程对这些数据也都是读操作(例如图中的键值对 A),那么,主线程和bgsave 子进程相互不影响。但是,如果主线程要修改一块数据(例如图中的键值对 B),那么,这块数据就会被复制一份,生成该数据的副本。然后,bgsave 子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程仍然可以直接修改原来的数据。

这既保证了快照的完整性,也允许主线程同时对数据进行修改,避免了对正常业务的影响。

RDB文件

RDB文件保存在dir配置指定的目录下,文件名通过dbfilename配置指定。

你可能感兴趣的:(redis,redis,分布式,数据库,java,缓存)