面试-redis内容补充

**

1.持久化方式

**
Redis虽然是内存数据库,一旦服务器进程退出,数据库的数据就会丢失。为了解决这个问题,Redis提供三种持久化的方式。
(1)RDB持久化
在这里插入图片描述
关键配置信息:
Redis每个时段的读写请求肯定是不均衡的。
60秒、300秒,900秒
在这里插入图片描述
在这里插入图片描述
表示:当备份进程出错时,主进程就停止接受新的写入。
保护持久化数据的一致性。
在这里插入图片描述
Rdb文件压缩相关。Yes表示备份时需要将Rdb文件进行压缩后才去做保存。
建议设置成no.Redis本身是cpu密集型服务器。开启压缩会带来更多cpu消耗
自动化触发RDB持久化的方式:
在这里插入图片描述
可以通过java计时器或者course定期掉写redis的bgsave指令去备份rdb文件。并按照时间戳存储rdb文件,作为redis某段时间的全量备份脚本。

BgSave的原理:
在这里插入图片描述
调用的是redis源码中的rdbSaveBackground()方法
Linux系统下,fork系统调用实现COPY-ON-WRITE写时复制。传统情况下,fork在创建子进程时,直接将所有资源复制给子进程。实现方式简单,效率低下。复制资源可能会毫无用处。

Linux为了降低创建子进程的成本,改进fork实现方式,当父进程创建子进程时,内核只为子进程创建虚拟空间,父子两个进程使用的是相同的物理空间。只有父子进程发生更改时,才会为子进程分配独立的地址空间。这种方式就是COPY-ON-WRITE

缺点:
在这里插入图片描述
(2)AOF持久化
AOF持久化:保存写状态
记录下除了查询以外的所有变更数据库状态的指令
以append的形式追加保存到AOF文件中(增量)

配置信息:
appendonly no (默认的情况是关闭的) 修改成:appendonly yes
appendfilename “appendonly.aof”
appendfsync everysec

日志重写原理:
例如:递增一个计数器100次。
AOF会将100次递增的命令完成的记录下来。事实上要恢复这个记录只需要一个命令就可。就是AOF里面的100条命令可以精简为一条。所以Redis支持这样一个功能,在不中断服务的情况下,在后台重建AOF文件,原理如下:
在这里插入图片描述
RDB和AOF的优缺点
在这里插入图片描述
(3)混合模式
在这里插入图片描述
区别:全量数据是以Redis命令方式写入。
先以RDB格式写入全量数据,再追加增量数据。
子进程在AOF重写时,会通过管道从父进程去读取增量数据。
再以RDB格式保存全量数据时,也会从管道读取数据。同时不会造成管道的堵塞。
总结一下:AOF的前半段是RDB格式的全量数据,而后半段是Redis命令的增量数据。
在这里插入图片描述
**

2.主从同步

**
在这里插入图片描述
先同步全量数据快照,在做增量同步。(M,S分别都是独立的RedisServer实例)
M用来写操作,S用来进行读操作。都代表一个个独立的RedisServer实例。定期的数据备份操作也是选择一个S去完成的,这样可以最大程度发挥Redis的性能。为的是让其支持数据的弱一致性,既最终一致性。我们不需要实时保证M跟S之间的数据是同步的,但是在过了一段时间之后它们的数据是趋于同步的。
第一次同步时,主节点进行一次bgsave,并同时将后续的修改操作记录到内存的buffer里面去。待全部完成后,将RDB文件全量同步到从节点里面。从节点接受完成后,将RDB的镜像加载到内存中。加载完成后,再通知主节点将期间修改的操作(增量数据)同步到从节点进行重放。
Redis同步机制:
在这里插入图片描述
在这里插入图片描述

Redis Sentinel:Redis哨兵
Redis官方提供的集群管理工具。独立运行的进程,能够监控多个Master-Slave集群。发现Master宕机之后能进行自动切换。
在这里插入图片描述
3.补充
(1)redis过期策略
Redis中过期Key的删除是惰性删除和定期删除两种方式配合使用的.
惰性删除
当客户端发送命令请求时,服务端会先通过expireIfNeeded()方法,进行判断key是否过期,如果key过期就进行删除,然后在进行后续命令操作.
定期删除
每隔一段时间,程序就对数据库进行一次检查,删除里面的部分过期Key.
在这里插入图片描述
(2)缓存雪崩,缓存击穿,缓存穿透
缓存雪崩:
缓存中大量 key 同时过期或者Redis 实例挂掉了,无法处理请求导致大量请求发送到了数据库,数据库压力激增,甚至可能导致数据库崩溃,从而导致整个系统崩溃,引发雪崩一样的连锁效应。
预防方式:
对于大量 key 同时过期的场景。可以修改 key 过期的时间,使用随机过期策略。
应对方式:
可采用服务熔断或者请求限流。

缓存击穿:
缓存击穿是指,针对某个热点数据,突然在缓存中失效,然后这些请求到热点数据的请求会都请求到数据库。
应对方式:
可以使用互斥锁避免大量请求同时落到db。
布隆过滤器,判断某个容器是否在集合中
可以将缓存设置永不过期(有限制)
做好熔断、降级,防止系统崩溃。

缓存穿透:
通常是一个不存在的key,在数据库查询为null。每次请求 Redis 发现没有对应的 key之后,再去请求数据库,发现数据库也没有,每次请求落在数据库、并且高并发,数据库扛不住会挂掉。
应对方式:
将该key的值设置为NULL。
用布隆过滤器先过滤

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值