当前位置: 首页 > article >正文

【每日八股】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 中两种不同的持久化机制,用于将内存中的数据保存到磁盘,以防止数据丢失。
在这里插入图片描述


http://www.kler.cn/a/559585.html

相关文章:

  • 从零开始学习PX4源码9(部署px4源码到gitee)
  • Vue 中单向数据流原则
  • 设计模式-observer模式(观察者模式)
  • 云原生(五十六) | CDN概述
  • 代码随想录算法训练day62---图论系列6《并查集2》
  • 前端VUE3框架的快速搭建
  • CSS 盒子模型:网页布局的基石
  • BeautifulSoup、lxml/XPath和正则表达式在数据爬取中的适用场景
  • 骁勇善战的量化利器:多因子模型【量化理论】
  • Ryu:轻量开源,开启 SDN 新程
  • ubuntu22.04使用minikube安装k8s
  • 【僵尸进程】
  • socket编程详解
  • RK Android11 WiFi模组 AIC8800 驱动移植流程
  • redis的容器化部署
  • YOLOv5 的量化及部署 - RGB 专题
  • 在单片机中是否应该取消32.768kHz外部晶振
  • FPGA开发要学些什么?如何快速入门?
  • RK3568开发板/电脑/ubuntu处于同一网段互通
  • UE_C++ —— Gameplay Tags