Redis的一些问题

摘录于 https://mp.weixin.qq.com/s/LGkS_2wkcXhThfOiRRQC7Q

一、Redis 的通讯协议是什么

Redis 的通讯协议是文本协议,是的,Redis 服务器与客户端通过 RESP(Redis Serialization Protocol)协议通信。

二、Redis 究竟有没有 ACID 事务

1、原子性

事务具备原子性指的是,数据库将事务中多个操作当作一个整体来执行,服务要么执行事务中所有的操作,要么一个操作也不会执行。

a、为何 Redis 不支持回滚

这个还是跟写 Log 有关系,Redis 是完成操作之后才会进行 AOF 日志记录,AOF 日志的定位只是记录操作的指令记录。

2、一致性

事务具备一致性指的是,如果数据库在执行事务之前是一致的,那么在事务执行之后,无论事务是否成功,数据库也应该是一致的。
未知

3、隔离性

隔离性指的是,数据库中有多个事务并发的执行,各个事务之间不会相互影响,并且在并发状态下执行的事务和串行执行的事务产生的结果是完全相同的。

Redis 因为是单线程操作,所以在隔离性上有天生的隔离机制,当 Redis 执行事务时,Redis 的服务端保证在执行事务期间不会对事务进行中断,所以,Redis 事务总是以串行的方式运行,事务也具备隔离性

4、持久性

事务的持久性指的是,当一个事务执行完毕,执行这个事务所得到的结果被保存在持久化的存储中,即使服务器在事务执行完成后停机了,执行的事务的结果也不会被丢失。

Redis 是否具备持久化,这个取决于 Redis 的持久化模式:

  1. 纯内存运行,不具备持久化,服务一旦停机,所有数据将丢失。
  2. RDB 模式,取决于 RDB 策略,只有在满足策略才会执行 Bgsave,异步执行并不能保证 Redis 具备持久化。
  3. AOF 模式,只有将 appendfsync 设置为 always,程序才会在执行命令同步保存到磁盘,这个模式下,Redis 具备持久化。(将 appendfsync 设置为 always,只是在理论上持久化可行,但一般不会这么操作)

简单总结:

  1. Redis 具备了一定的原子性,但不支持回滚。
  2. Redis 不具备 ACID 中一致性的概念。(或者说 Redis 在设计时就无视这点)
  3. Redis 具备隔离性。
  4. Redis 通过一定策略可以保证持久性。

三、Redis 的乐观锁 Watch 是怎么实现的

Redis 的 Watch 机制,更多是利用了 Redis 本身单线程的机制,采用了 watched_keys 的数据结构和串行流程实现了乐观锁机制。

四、Redis 是如何持久化的

1、RDB

使用 Bgsave ,Redis 会 Fork 一个子进程,快照的持久化就交给子进程去处理,而父进程继续处理线上业务的请求。

2、AOF

AOF 是 Redis 操作指令的日志存储,
AOF 写操作是在 Redis 处理完业务逻辑之后,按照一定的策略才会进行些 AOF 日志存盘
也因为此原因,Redis 因为处理逻辑在前而记录操作日志在后,也是导致 Redis 无法进行回滚的一个原因。

不过 AOF 日志也有两个比较大的问题:

1、一个是 AOF 的日志会随着时间递增,如果一个数据量大运行的时间久,AOF 日志量将变得异常庞大。

2、另一个问题是 AOF 在做数据恢复时,由于重放的量非常庞大,恢复的时间将会非常的长。

bgrewriteaof:针对上述的问题,Redis 在 2.4 之后也使用了 bgrewriteaof 对 AOF 日志进行瘦身。

bgrewriteaof 命令用于异步执行一个 AOF 文件重写操作。重写会创建一个当前 AOF 文件的体积优化版本。

3、RDB 和 AOF 混合搭配模式

在对 Redis 进行恢复的时候,如果我们采用了 RDB 的方式,因为 Bgsave 的策略,可能会导致我们丢失大量的数据。

如果我们采用了 AOF 的模式,通过 AOF 操作日志重放恢复,重放 AOF 日志比 RDB 要长久很多。

Redis 4.0 之后,引入了新的持久化模式,混合持久化,将 RDB 的文件和局部增量的 AOF 文件相结合。

RDB 可以使用相隔较长的时间保存策略,AOF 不需要是全量日志,只需要保存前一次 RDB 存储开始到这段时间增量 AOF 日志即可,一般来说,这个日志量是非常小的。

五、Redis 是怎么制定过期删除策略的

定时删除:在设置键过去的时间同时,创建一个定时器,让定时器在键过期时间来临,立即执行对键的删除操作。

惰性删除: 放任键过期不管,但是每次从键空间获取键时,都会检查该键是否过期,如果过期的话,就删除该键。

定期删除:每隔一段时间,程序都要对数据库进行一次检查,删除里面的过期键,至于要删除多少过期键,由算法而定。

Redis采用的过期策略:惰性删除+定期删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值