<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Redis on 冯威的博客</title><link>https://fwhyy.com/tags/redis/</link><description>Recent content in Redis on 冯威的博客</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 17 Jan 2025 20:29:00 +0800</lastBuildDate><atom:link href="https://fwhyy.com/tags/redis/atom.xml" rel="self" type="application/rss+xml"/><item><title>为什么单线程的Redis也能如此高效？</title><link>https://fwhyy.com/2025/01/why-can-single-threaded-redis-be-so-efficient/</link><pubDate>Fri, 17 Jan 2025 20:29:00 +0800</pubDate><guid>https://fwhyy.com/2025/01/why-can-single-threaded-redis-be-so-efficient/</guid><description>&lt;p&gt;提起 Redis，一个印象就是速度很快的开源内存数据库，而且还是单线程的。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;但印象有时会骗人：&lt;/p&gt;
&lt;p&gt;1、redis 6.0 后采用了多线程&lt;/p&gt;
&lt;p&gt;2、redis 7.4 之后修改了开源协议&lt;/p&gt;
&lt;h2 id="单线程为什么速度还很快"&gt;单线程为什么速度还很快？&lt;/h2&gt;
&lt;p&gt;1、Redis 的客户端调用服务器经过三个过程：发送命令、执行命令和返回结果。在命令执行阶段，由于 Redis 处理命令是单线程的，在服务器上到达的所有命令不会立即被执行。所有命令都进入队列并按顺序执行。多个客户端发送的命令执行顺序不确定。但是可以确定的是两个命令不会同时执行，避免了并发问题。这是 Redis 的基本单线程模型。&lt;/p&gt;
&lt;p&gt;2、Redis 完全基于内存，数据存储在内存中。大多数请求都是纯内存操作，所以速度非常快。与传统的磁盘文件数据存储相比，Redis 避免了通过磁盘 I/O 读取数据到内存的开销。&lt;/p&gt;
&lt;p&gt;3、使用单线程可以节省很多上下文切换和 CPU 消耗的时间，没有竞争条件，不需要考虑各种锁定问题，并且不会因为死锁而导致性能开销。此外，它还允许使用各种「线程不安全」的命令，例如 Lpush。&lt;/p&gt;
&lt;p&gt;4、需要注意的是，当我们强调单线程时，我们指的是使用一个线程来处理网络 I/O 和键值对读写。换句话说，一个线程处理所有网络请求。但 Redis 的其他功能，如持久性、异步删除和集群数据同步，实际上是由额外的线程执行。也就是说即便是在 6.0 之前的版本，也不是绝对的单线程。&lt;/p&gt;
&lt;p&gt;5、Redis 虽然是纯内存操作，但仍然会涉及到网络 I/O 和磁盘 I/O（持久化操作），Redis 使用非阻塞 I/O 和 I/O 多路复用技术（如 &lt;code&gt;select&lt;/code&gt;、&lt;code&gt;poll&lt;/code&gt;、&lt;code&gt;epoll&lt;/code&gt;）来处理大量的并发连接。这意味着一个线程可以同时监听多个客户端的连接请求，并在有数据可读或可写时进行处理。这种方式避免了线程在等待 I/O 操作完成时的阻塞，从而提高了系统的并发处理能力。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;非阻塞 I/O：允许程序在 I/O 操作未完成时继续执行其他任务。&lt;/li&gt;
&lt;li&gt;I/O 多路复用：通过单线程监控多个 I/O 操作，提升高并发下的效率。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;6、官方对单线程的解释是：因为 CPU 不是 Redis 的瓶颈，最有可能的是机器内存或网络带宽。由于单线程易于实现，并且 CPU 不会成为瓶颈，采用单线程解决方案是有意义的。&lt;/p&gt;
&lt;h2 id="为什么-60-又采用了多线程"&gt;为什么 6.0 又采用了多线程？&lt;/h2&gt;
&lt;p&gt;Redis 在 6.0 版本引入多线程支持，主要是为了应对现代硬件架构的变化和日益复杂的业务需求，同时解决单线程模型在高并发场景下的性能瓶颈。&lt;/p&gt;
&lt;h3 id="1提升网络-io-性能"&gt;1、提升网络 I/O 性能&lt;/h3&gt;
&lt;p&gt;Redis 的主要性能瓶颈在于网络 I/O，尤其是在高并发场景下，单线程模型难以高效处理大量的网络请求。虽然 Redis 使用了 I/O 多路复用技术（如 &lt;code&gt;epoll&lt;/code&gt;）来优化网络处理，但随着硬件性能的提升，单线程的网络 I/O 处理能力逐渐成为瓶颈。&lt;/p&gt;
&lt;p&gt;通过引入多线程，Redis 可以将网络 I/O 操作（如读取客户端请求和写回响应）分配到多个线程并行处理，从而显著提升网络吞吐量和降低延迟。&lt;/p&gt;
&lt;h3 id="2利用多核-cpu"&gt;2、利用多核 CPU&lt;/h3&gt;
&lt;p&gt;现在的服务器普遍配备多核 CPU，而 Redis 的单线程模型只能利用一个 CPU 核心，无法充分发挥硬件的性能潜力。通过引入多线程，Redis 可以将网络 I/O 任务分配到多个线程，充分利用多核 CPU 的计算能力，从而提高整体性能。&lt;/p&gt;
&lt;h3 id="3保持核心逻辑的简单性和一致性"&gt;3、保持核心逻辑的简单性和一致性&lt;/h3&gt;
&lt;p&gt;Redis 6.0 的多线程模型采用了混合设计：网络 I/O 操作由多个线程并行处理，而命令执行仍然由单线程顺序执行。这种设计既保留了单线程模型的简单性和一致性优势（如避免线程安全问题、保证命令的原子性），又通过多线程提升了网络 I/O 的性能。和之前的版本相比，只是将更多的事情由多线程来处理。&lt;/p&gt;
&lt;h3 id="4优化资源利用"&gt;4、优化资源利用&lt;/h3&gt;
&lt;p&gt;在高负载场景下，单线程模型可能导致 CPU 和内存资源的浪费。通过引入多线程，Redis 可以更高效地利用系统资源，减少请求的等待时间，从而提升整体性能。&lt;/p&gt;</description></item><item><title>.NET中操作哨兵模式的Redis（哨兵和Redis示例配置密码）</title><link>https://fwhyy.com/2023/12/redis-for-operating-sentinel-mode-in-net/</link><pubDate>Mon, 25 Dec 2023 17:03:06 +0800</pubDate><guid>https://fwhyy.com/2023/12/redis-for-operating-sentinel-mode-in-net/</guid><description>&lt;p&gt;Redis 的高可用有一种方式是部署成哨兵模式。在哨兵模式中哨兵和每个节点都可以设置密码，如果都设置密码了，在 .NET 中用 CSRedisCore 进行调用时会遇到点问题。&lt;/p&gt;
&lt;p&gt;本文就介绍怎样用 CSRedisCore 来调用设置了密码的哨兵模式 Redis。&lt;/p&gt;</description></item><item><title>12 个问题搞懂 Redis</title><link>https://fwhyy.com/2021/09/12-questions-to-understand-redis/</link><pubDate>Mon, 13 Sep 2021 08:05:00 +0800</pubDate><guid>https://fwhyy.com/2021/09/12-questions-to-understand-redis/</guid><description>&lt;p&gt;都说学习需要带着问题，带着思考进行学习，下面就以问题的形式来学习下 Redis 。&lt;/p&gt;</description></item><item><title>dotNetCore操作Redis（含CentOS7哨兵模式部署）</title><link>https://fwhyy.com/2020/01/dotnetcore-operation-redis/</link><pubDate>Wed, 08 Jan 2020 06:58:14 +0800</pubDate><guid>https://fwhyy.com/2020/01/dotnetcore-operation-redis/</guid><description>&lt;p&gt;现在说到使用缓存中间件基本就是 Redis 了，通常开发环境或测试环境部署一个单机版就可以运行了，但要上生产环境还需要进行高可用的方式来部署，本文说说在 CentOS7 中 Redis 高可用的部署以及在 dotNetCore 中怎样调用。&lt;/p&gt;</description></item><item><title>Docker学习-安装镜像</title><link>https://fwhyy.com/2017/08/docker-learning-installing-images/</link><pubDate>Thu, 31 Aug 2017 10:47:45 +0800</pubDate><guid>https://fwhyy.com/2017/08/docker-learning-installing-images/</guid><description>&lt;p&gt;Docker现在已不是什么新鲜事物了，Windows Server2016已经内置了Docker，对于我来说，我只想让Docker来帮我解决运行环境的问题。&lt;/p&gt;
&lt;p&gt;我们的产品部署起来会依赖很多的第三方产品：SqlServer、MongoDB、Redis、RabbitMQ等，各种软件等安装，数据库的还原，每次部署都会耗费大量的时间。为了能使部署更加的方便，我们的设想是这样的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在Docker中安装这些工具软件&lt;/li&gt;
&lt;li&gt;打包Docker，拷贝到客户环境中导入&lt;/li&gt;
&lt;li&gt;在Web界面中进行简单的向导配置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本文主要介绍在Docker中安装这些工具软件。&lt;/p&gt;</description></item></channel></rss>