摘录于 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采用的过期策略:惰性删除+定期删除

Redis的一些问题相关推荐

  1. Spring AOP + Redis解决重复提交的问题

    Spring AOP + Redis解决重复提交的问题 用户在点击操作的时候,可能会连续点击多次,虽然前端可以通过设置按钮的disable的属性来控制按钮不可连续点击,但是如果别人拿到请求进行模拟,依 ...

  2. Redis问题——Error: 磁盘在使用中,或被另一个进程锁定。

    Redis出于对数据保护,默认只能本地客户端连接.远程连接就会出现以上错误.如何解决这一问题,看下: server -A,PC-A, 修改server-A的redis.conf:注释掉本地绑定: bi ...

  3. 实现 连续15签到记录_MySQL和Redis实现用户签到,你喜欢怎么实现?

    现在的网站和app开发中,签到是一个很常见的功能 如微博签到送积分,签到排行榜 微博签到 如移动app ,签到送流量等活动, 移动app签到 用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面 ...

  4. Redis 笔记(16)— info 指令和命令行工具(查看内存、状态、客户端连接数、监控服务器、扫描大key、采样服务器、执行批量命令等)

    Info 命令返回关于 Redis 服务器的各种信息和统计数值.通过给定可选的参数 section ,可以让命令只返回某一部分的信息. 1. 显示模块 server : 一般 Redis 服务器信息, ...

  5. Redis 笔记(15)— 管道 pipeline(客户端将批量命令打包发送用来节省网络开销)

    Redis 是一种基于客户端-服务端模型以及请求/响应协议的 TCP 服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听 Socket 返回,通常是以阻塞模式,等 ...

  6. Redis 笔记(14)— 持久化及数据恢复(数据持久方式 RDB 和 AOF、数据恢复、混合持久化)

    1. 持久化 所谓持久化是指将数据从内存中以某种形式同步到硬盘中,在 Redis 重启后能够根据硬盘中的记录恢复数据.Redis 持久化有两种方式,分别为 RDB(redis data base) [ ...

  7. Redis 笔记(13)— scan 和 keys 寻找特定前缀key 字段(命令格式、使用示例、定位大key)

    1. keys Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key. 127.0.0.1:6379> keys * (empty array) 127. ...

  8. Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程

    Redis 使用了单线程架构.非阻塞 I/O .多路复用模型来实现高性能的内存数据库服务.Redis 是单线程的.那么为什么说是单线程呢? Redis 在 Reactor 模型内开发了事件处理器,这个 ...

  9. Redis 笔记(11)— 文本协议 RESP(单行、多行字符串、整数、错误、数组、空值、空串格式、telnet 登录 redis)

    RESP 是 Redis 序列化协议Redis Serialization Protocol 的简写.它是一种直观的文本协议,优势在于实现异常简单,解析性能极好. ​ Redis 协议将传输的结构数据 ...

  10. Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)

    1. 发布-订阅概念 发布-订阅 模式包含两种角色,分别为发布者和订阅者. 订阅者可以订阅一个或者若干个频道(channel): 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消 ...

最新文章

  1. php调用restful接口_jzq_sdk_php
  2. 计算机组成原理——数据表示、运算与校验1
  3. 技术圈鄙视链形成的真实原因?
  4. 安全测试需要关注那些要点
  5. fastjson jar包_经过性能对比,我发现温少的FastJson真牛。
  6. 百万大奖参赛攻略 | 让程序员走向财富自由
  7. C#.NET Thread多线程并发编程学习与常见面试题解析-1、Thread使用与控制基础
  8. LeetCode 1905. 统计子岛屿(BFS)
  9. 全球知名大学课件下载地址汇总
  10. 7-14 求整数段和
  11. 令人蛋疼的错误提示 0xcdcdcdcd ,0xdddddddd ,0xfeeefeee ,0xcccccccc ,0xabababab
  12. L298N电机驱动器
  13. 利用Jscript实现淘宝购物车的全选框功能
  14. spring boot打包本地idea跑能行,上线jar包跑不行 解决
  15. Ubuntu系统播放*.avi格式出错
  16. 高德地图POI分类查询
  17. 【Bulldog】靶场记录
  18. BUUNCTF Hack World
  19. 十 ARM9(2440)的IIC——理论知识及程序实例
  20. 一个int类型到底占多少个字节?

热门文章

  1. LSMW、BDC、CATT 区别
  2. Enhanced ABAP Development with Core Data Services (CDS)
  3. SAP ABAP ALV(LVC)的一个自定义事件(F4帮助事件,回车ENTER按钮事件)的一个实例
  4. delphi获取闲置时间
  5. SAP ABAP逻辑数据库
  6. 从“不务正业”到“回归本行”,“中年”雅戈尔的偶然与必然
  7. 在线音乐用户寄望用爱发电,资本不愿无米之炊
  8. MySQL高可靠_MySQL高可用与高可靠架构
  9. mysql重启电脑提示145_MYSQL错误:Can’t open file: ‘#215;#215;#215;.MYI’ (errno: 145)修复方法...
  10. pwn(ctf)中常见的系统调用