面试集——redis

背景:该贴主要用来记面试过程中redis相关的问题,方便后期回顾。

 

为什么说Redis是单线程的以及Redis为什么这么快!

https://blog.csdn.net/xlgen157387/article/details/79470556

共5点:1 数据内存存储,类似hashmap查找 2、数据结构简单,redis专门设计 3单线程,减少了cpu切换消耗,也没有锁的问题。 4、IO多路复用,非阻塞IO 5、底层实现模型,redis构建了自己的VM机制,避免了调用系统函数的开销

多线程可以通过单机部署多实例实现。

单线程QPS:10W+

 redis主从复制 哨兵集群

(转)深入浅出Redis-redis哨兵集群

Redis的那些最常见面试问题

https://www.cnblogs.com/Survivalist/p/8119891.html

缓存穿透 雪崩 读写不一致问题解决方案

(转)面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题

 

redis分布式锁如何续期

【肥朝】面试官问我,Redis分布式锁如何续期?懵了。

你上次提到redis中守护线程  这个和你说的思路一样 。不过这个用的是redission的分布式可重入锁  在加锁成功后,开启一个看门狗的线程,用来续期。默认30s的锁超时时间,每隔10s就会进行一次续期

 

reids事务

Redis 事务详解

讲的很详细

3 个阶段

  • 开启:以 MULTI 开始一个事务
  • 入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
  • 执行:由 EXEC 命令触发事务

3 个特性

  • 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题
  • 不保证原子性:Redis 同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

在传统的关系式数据库中,常常用 ACID 性质来检验事务功能的安全性。Redis 事务保证了其中的一致性(C)和隔离性(I),但并不保证原子性(A)和持久性(D)。

最后

Redis 事务在发送每个指令到事务缓存队列时都要经过一次网络读写,当一个事务内部的指令较多时,需要的网络 IO 时间也会线性增长。所以通常 Redis 的客户端在执行事务时都会结合 pipeline 一起使用,这样可以将多次 IO 操作压缩为单次 IO 操作。

 

事务中的错误

上边规规矩矩的操作,看着还挺好,可是事务是为解决数据安全操作提出的,我们用 Redis 事务的时候,可能会遇上以下两种错误:

  • 事务在执行 EXEC 之前,入队的命令可能会出错。比如说,命令可能会产生语法错误(参数数量错误,参数名错误等等),或者其他更严重的错误,比如内存不足(如果服务器使用 maxmemory 设置了最大内存限制的话)。
  • 命令可能在 EXEC 调用之后失败。举个例子,事务中的命令可能处理了错误类型的键,比如将列表命令用在了字符串键上面,诸如此类。

Redis 针对如上两种错误采用了不同的处理策略,对于发生在 EXEC 执行之前的错误,服务器会对命令入队失败的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事务(Redis 2.6.5 之前的做法是检查命令入队所得的返回值:如果命令入队时返回 QUEUED ,那么入队成功;否则,就是入队失败)

对于那些在 EXEC 命令执行之后所产生的错误, 并没有对它们进行特别处理: 即使事务中有某个/某些命令在执行时产生了错误, 事务中的其他命令仍然会继续执行

posted @ 2019-03-22 08:25  CS408  阅读(183)  评论(0编辑  收藏  举报