面试集——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的那些最常见面试问题
https://www.cnblogs.com/Survivalist/p/8119891.html
缓存穿透 雪崩 读写不一致问题解决方案
(转)面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题
redis分布式锁如何续期
你上次提到redis中守护线程 这个和你说的思路一样 。不过这个用的是redission的分布式可重入锁 在加锁成功后,开启一个看门狗的线程,用来续期。默认30s的锁超时时间,每隔10s就会进行一次续期
reids事务
讲的很详细
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
命令执行之后所产生的错误, 并没有对它们进行特别处理: 即使事务中有某个/某些命令在执行时产生了错误, 事务中的其他命令仍然会继续执行。