【每日八股】Redis篇(一):概述

devtools/2025/2/25 2:06:24/

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.ppmy.cn/devtools/161467.html

相关文章

C转C++

#include<bits/stdc.h> 万能头文件&#xff0c;但vs要自己添加&#xff0c;具体操作下次再发 using namespace std; 必须要加&#xff0c;跟#define _CRT_SECURE_NO_WARNINGS 一样 这张图是我看B站下的&#xff0c;但原视频好像被盗过&#xff0c;不知原作者是谁&#…

前端开发中的贪心算法实践:以最小成本解决实际问题

一、什么是贪心算法&#xff1f; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最优解的策略&#xff0c;希望通过局部最优的累积达到全局最优的算法思想。其核心特征是&#xff1a; 无后效性&#xff1a;当前决策不影响后续状态 贪…

深度学习入门:从零开始理解神经网络

欢迎来到深度学习的世界&#xff01;如果你是初学者&#xff0c;可能会对这个领域感到既兴奋又有些迷茫。别担心&#xff0c;我会带你一步步走进这个充满魅力的领域。深度学习是人工智能领域的一个重要分支&#xff0c;它通过模拟人脑的神经网络结构来处理数据。深度学习的核心…

基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知

写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我站在人潮中央&#xff0c;思考这日日重复的生活。我突然想&#xff0c…

Java集合之ArrayList(含源码解析 超详细)

1.ArrayList简介 ArrayList的底层是数组队列&#xff0c;相当于动态数组。与Java中的数组相比&#xff0c;它的容量能动态增长。在添加大量元素前&#xff0c;应用程序可以使用ensureCapacity操作来增加ArrayList实例的容量。这可以减少递增式再分配的数量。 ArrayList继承于Ab…

MusicGPT的本地化部署与远程调用:让你的Windows电脑成为AI音乐工作站

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 在如今快节奏的生活里&#xff0c;音乐不仅能够抚慰我们的心灵&#xff0c;还能激发无限创意。想象一下&#xff0c;在忙碌的工作间隙或闲暇时光中&#xff0c;只需输…

0基础玩转python(打怪升级篇)第一章1.1安装python编辑器

第一章 新手村 1.1合适的武器 &#xff08;安装python编辑器&#xff09; 新手村位于代码大陆的东北部&#xff0c;四面环山&#xff0c;高大的城墙外坐落着一条护城河。一位少年缓步走进城内&#xff0c;看到了城内集市热闹非凡。 你叫做“阿印” 是一位勇士 当前等级o Lv 最…

PHP二手车置换平台系统小程序源码

二手车置换平台系统 &#x1f697; 基于ThinkPHPUniapp的创新之作&#xff1a;我们倾尽心力&#xff0c;精心打造了一款基于ThinkPHPUniapp框架的二手车置换平台小程序系统&#xff0c;它犹如二手车交易领域的璀璨明珠&#xff0c;熠熠生辉。这个平台不仅为买家和卖家搭建了一…