Redis 高级篇 分布式缓存

本文详细分析了单机Redis的RDB和AOF两种持久化方案,讨论了它们的工作原理、执行时机、优缺点以及如何结合使用以提高数据安全性。特别强调了RDB的定时执行可能导致数据丢失,而AOF通过记录命令提供更高可靠性。
摘要由CSDN通过智能技术生成

基于Redis集群解决单机Redis存在的问题

单机的Redis存在四大问题:

1.Redis持久化

Redis有两种持久化方案:

  • RDB持久化

  • AOF持久化

1.1.RDB持久化

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。

1.1.1.执行时机

RDB持久化在四种情况下会执行:

  • 执行save命令

  • 执行bgsave命令

  • Redis停机时

  • 触发RDB条件时

1)save命令

执行下面的命令,可以立即执行一次RDB:

这个在执行的过程中任何的请求都不会处理 当数据的量非常的多 执行save 这时候任何操作redis的请求都为false (分布式锁redission,登录,消息队列,GEO,等)

 save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。

2)bgsave命令

下面的命令可以异步执行RDB:

这个命令执行后会开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响。

 

3)停机时

redis默认的保存数据的方式 这个存在问题 (最基本的服务器宕机没来的及停机)

Redis停机时会执行一次save命令,实现RDB持久化。

4)触发RDB条件

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

# 900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB
save 900 1  
save 300 10  
save 60 10000

RDB的其它配置也可以在redis.conf文件中设置:

# 是否压缩 ,建议不开启,压缩也会消耗cpu,磁盘的话不值钱
rdbcompression yes

# RDB文件名称
dbfilename dump.rdb  

# 文件保存的路径目录
dir ./ 

1.1.2.RDB原理

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。

 bgsave通过子线程去完成内存的同步不会影响主线程但是fork主线程的过程是异步的,所以就得尽快的加快速度

  在平时主进程是无法直接操作物理内存的 主进程只能操作虚拟内存(也就是这个页表) 通过虚拟内存和主进程的映射关系来间接的访问物理内存来完成读写操作 而fork直接复制了页表 就提升了效率

fork采用的是copy-on-write技术:

在读的过程中如果写了一个数据就可能会出现脏数据 fork过程中会把内存的数据设置为只读的属性然后把数据复制一份副本 在fork中读和写的操作都操作这个副本 fork完成就把副本同步到物理内存然后去掉只读

  • 当主进程执行读操作时,访问共享内存;

  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

1.1.3.小结

RDB方式bgsave的基本流程?

  • fork主进程得到一个子进程,共享内存空间

  • 子进程读取内存数据并写入新的RDB文件

  • 用新RDB文件替换旧的RDB文件

RDB会在什么时候执行?save 60 1000代表什么含义?

  • 默认是服务停止时

  • 代表60秒内至少执行1000次修改则触发RDB

RDB的缺点?

  • RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险

  • fork子进程、压缩、写出RDB文件都比较耗时

 

1.2.AOF持久化

1.2.1.AOF原理

AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

 

1.2.2.AOF配置

AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:

# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"

 AOF的命令记录的频率也可以通过redis.conf文件来配:

# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always 
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec 
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

三种策略对比:

1.2.3.AOF文件重写

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

 

如图,AOF原本有三个命令,但是set num 123 和 set num 666都是对num的操作,第二次会覆盖第一次的值,因此第一个命令记录下来没有意义。

所以重写命令后,AOF文件内容就是:mset name jack num 666

Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:

# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写 
auto-aof-rewrite-min-size 64mb

1.3.RDB与AOF对比

RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。

黑马Redis高级笔记提供了关于Redis的一些最佳实践和高级功能的知识点。其中包括了以下几个主题: 1. Redis键值设计:介绍了如何设计优雅的key结构,避免BigKey的出现,并选择恰当的数据类型来提高性能。 2. 批处理优化:介绍了在Redis集群中如何进行批处理优化,包括使用Pipeline来提高性能,并分享了在集群环境下的批处理技巧。 3. 服务端优化:介绍了一些Redis服务器的优化方法,包括持久化配置、慢查询优化、命令及安全配置以及内存配置。 4. 集群最佳实践:提供了关于Redis集群的最佳实践,包括如何查询集群状态以及散列插槽的相关知识。 这些笔记提供了关于如何优化Redis性能及使用Redis集群的一些实用技巧和建议。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [黑马Redis笔记高级 | 分布式缓存](https://blog.csdn.net/2301_77450803/article/details/130547696)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [黑马Redis笔记高级 | Redis最佳实践](https://blog.csdn.net/2301_77450803/article/details/130659537)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值