Redis 持久化机制
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题
热点数据和冷数据是什么
Memcache与Redis的区别都有哪些?
单线程的redis为什么这么快
redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构
redis的过期策略以及内存淘汰机制
Redis 为什么是单线程的,优点
如何解决redis的并发竞争key问题
Redis 集群方案应该怎么做?都有哪些方案?
有没有尝试进行多机redis 的部署?如何保证数据一致的?
对于大量的请求怎么样处理
Redis 常见性能问题和解决方案?
讲解下Redis线程模型
为什么Redis的操作是原子性的,怎么保证原子性的?
Redis事务
Redis实现分布式锁
Redis支持多线程的好处
多线程讲解:https://www.cnblogs.com/gz666666/p/12901507.html
- 1 可以充分利用服务器 CPU 资源,目前主线程只能利用一个核。
- 2 多线程任务可以分摊 Redis 同步 IO 读写负荷。
- Redis 6.0 默认是否开启了多线程?
否,在conf文件进行配置
io-threads-do-reads yes
io-threads 线程数
官方建议:4 核的机器建议设置为 2 或 3 个线程,8 核的建议设置为 6 个线程,线程数一定要小于机器核数,尽量不超过8个。
开启多线程后,是否会存在线程并发安全问题?
不会,Redis 的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行。
Redis 线程中经常提到 IO 多路复用,如何理解?
-
这是 IO 模型的一种,即经典的 Reactor 设计模式,有时也称为异步阻塞 IO。
-
**多路指的是多个 Socket 连接,复用指的是复用一个线程。**多路复用主要有三种技术:Select,Poll,Epoll。
-
Epoll 是最新的也是目前最好的多路复用技术。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),
且 Redis 在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了 Redis 具有很高的吞吐量。 -
总结:也就是单个线程 处理多个socket,当某一个socket套接字好read or write数据的时候,我们按顺序执行(这里是内存中执行,速度非常快)
Redis 6.0 之前的版本真的是单线程吗?
Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。
它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。
因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。
- 总结:文件事件分配器 会按顺序单线程的处理所有的客户端请求。
Redis 持久化机制
- Redis是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化。当Redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的。
- 实现:
- 单独创建fork()一个子进程,将当前父进程的数据库数据复制到子进程的内存中,然后由子进程写入到临时文件中,
- 持久化的过程结束了,再用这个临时文件替换上次的快照文件,然后子进程退出,内存释放。
- RDB是Redis默认的持久化方式。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件。
即Snapshot快照存储,对应产生的数据文件为dump.rdb,通过配置文件中的save参数来定义快照的周期。
( 快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。)- 恢复数据块
- 容易丢失数据
- AOF:Redis会将每一个收到的写命令都通过Write函数追加到文件最后,类似于MySQL的binlog。当Redis重启是会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
- 缺点:命令重写指定会更慢
- 优点:但是数据不易丢失,并且如果有那种误操作,毕竟是可视化的命令就可以直接找出来在文件中删除。
- 当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题
缓存雪崩
-
缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间
(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,
而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。 -
也可以直接理解为缓存直接都不可用了, 我们可以采取分布式缓存的策略,提高缓存的高可用性
-
解决办法:
大多数系统设计者考虑用加锁( 最多的解决方案)或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。
还有一个简单方案就时将缓存失效时间分散开。
缓存穿透
- 缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。(不恰当的业务、或者恶意的攻击)这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,
然后返回空(相当于进行了两次无用的查询ÿ