【每日八股】Redis篇(一):概述
Redis 为什么快?
一句话概括:
Redis 之所以快,主要是因为它是基于内存操作的,避免了磁盘 I/O 的开销;采用单线程模型,避免了上下文切换和锁竞争;使用了高效的数据结构和紧凑的编码方式;支持非阻塞 I/O 和异步持久化,能够高效处理并发请求;同时,Redis 的网络协议简单,减少了传输和解析的开销。
具体来说:
- 基于内存的操作:Redis 的绝大部分操作在内存当中就可以实现,数据也存储在内存当中,与传统的磁盘文件操作相比减少了 I/O,提高了操作速度;
- 高效的数据结构:Redis 有专门的 STRING、LIST、HASH 等高效数据结构,依赖各种数据结构提升了读写的效率;
- 采用单线程:单线程操作省去了上下文切换带来的开销以及 CPU 的消耗,同时不存在资源竞争,避免了死锁现象的发生。
- I/O 多路复用:采用 I/O 多路复用机制同时监听多个 Socket,根据 Socket 上的事件来选择对应的事件处理器进行处理。
为什么 Redis 是单线程?
Redis 采用单线程模型主要是为了避免上下文切换和锁竞争,简化代码实现和维护;同时,Redis 使用高效的事件驱动模型和非阻塞 I/O,能够处理大量并发连接;内存操作本身已经很快,单线程足以满足性能需求。尽管是单线程,Redis 仍然能够支持极高的吞吐量和低延迟。
Redis 为什么要引入多线程?
Redis 引入多线程主要是为了优化网络 I/O 性能,解决单线程在高并发场景下的瓶颈问题;同时,多线程能够提高吞吐量,充分利用多核 CPU 的计算能力,并并行化后台任务(如持久化、异步删除等),避免阻塞主线程。需要注意的是,Redis 的核心操作仍然是单线程的,以确保原子性和一致性。
为什么用Redis作为MySQL的缓存?
使用 Redis 作为 MySQL 的缓存可以显著提升系统性能,减少数据库负载。Redis 基于内存,访问速度快,能够缓存热点数据,减少对 MySQL 的查询;同时,Redis 支持高并发和丰富的数据结构,能够灵活缓存不同类型的数据,并通过缓存失效和更新机制保证数据的一致性。此外,Redis 的高可用性和持久化功能也确保了数据的安全性。
使用 Redis + MySQL 结合的方式可以有效地提高系统的 FPS。
实际应用场景
- 热点数据缓存:将频繁访问的数据(如商品信息、用户信息)缓存到 Redis 中,减少对 MySQL 的查询;
- 会话缓存:将用户的会话信息(如登录状态)缓存到 Redis 中,避免每次请求都查询 MySQL;
- 排行榜和计数器:利用 Redis 的有序集合(ZSet)和计数器功能,可以实现排行榜和计数功能,避免频繁更新 MySQL。
- 分布式锁:使用 Redis 实现分布式锁,避免多个服务同时操作 MySQL 中的同一个资源。
Redis 和 Memcached 的联系和区别?
Redis 和 Memcached 都是高性能的内存缓存系统,但 Redis 支持多种数据结构和持久化,适合需要丰富功能的场景;而 Memcached 仅支持简单的键值对,性能更高,适合简单的缓存场景。Redis 适合需要复杂数据操作和持久化的场景,而 Memcached 适合需要极高吞吐量的简单缓存场景。
如何理解 Redis 原子性操作原理?
- API:Redis 提供的 API 都是单线程串行处理的;
- 网络模型:采用单线程的 epoll 的网络模型,用来处理多个 Socket 请求;
- 请求处理:Redis 会 fork 子进程来处理类似于 RDB 和 AOF 的操作,不影响主进程工作。
RDB 和 AOF
RDB(Redis Database)和 AOF(Append-Only File)是 Redis 中两种不同的持久化机制,用于将内存中的数据保存到磁盘,以防止数据丢失。