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

【Redis】了解Redis

1.什么是Redis?

Redis(Remote Dictionary Server)是一个开源的、基于内存的数据存储系统。它通常被用作数据库、缓存和消息中间件。Redis是一个键值对存储系统,支持丰富的数据结构,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)、位图(Bitmap)、超日志(HyperLogLog)。

2.特点

(1)高性能:Redis是内存数据库,所有数据操作都在内存中完成,避免了磁盘I/O的瓶颈。它的读写速度非常快,通常可以每秒处理数十万甚至上百万的请求。

(2)持久化:虽然Redis是内存数据库,但它支持数据持久化,确保系统重启后不会丢失数据。Redis有两种持久化方式:RDB(Redis DataBase):生成数据快照,定期将内存数据写入磁盘。AOF(Append Only File):将每次写操作记录到日志文件,保证数据不会丢失

(3)支持多种数据结构

  • 字符串(String):可以是普通的文本,也可以是二进制数据(例如图片)。
  • 哈希(Hash):键值对集合,非常适合存储对象。
  • 列表(List):支持push、pop、shift、unshift等操作。
  • 集合(Set):无序集合,支持交、并、差等操作。
  • 有序集合(Sorted Set):每个元素关联一个分数值,按分数值进行排序。
  • 位图(Bitmap)HyperLogLog、**地理位置(Geo)**等特殊数据结构。

(4)原子性操作:Redis的所有操作都是原子的,要么完全执行,要么完全不执行。

(5)内存数据库:虽然Redis可以将数据持久化到硬盘,但它是一个基于内存的数据库,这使得它具有很高的性能。

(6)支持主从复制:Redis支持主从复制,可以通过设置从节点进行数据复制和容灾。

(7)分布式支持:Redis支持分布式集群,能把数据分布在多个节点上。

3.为什么 Redis 使用单线程?

Redis 是单线程的设计,这是它能够实现高性能的一个关键因素。

  • 避免上下文切换的开销: 操作系统中的多线程会带来一定的上下文切换开销,也就是线程在 CPU 之间切换时需要保存和加载不同线程的状态。Redis 通过使用单线程模型,完全避免了这个问题。
  • CPU 密集型操作和高效的 I/O 多路复用: Redis 的大部分操作都是内存中的快速读写,极少涉及到磁盘 I/O(除非进行持久化)。因此,单线程在这种场景下能够高效地执行命令。对于 I/O 密集型操作,Redis 使用 事件驱动模型(通过 I/O 多路复用技术,如 selectepoll 等),在单线程中处理大量并发连接,而不会阻塞其他请求。
  • 数据一致性: 使用单线程意味着 Redis 不需要考虑多线程的锁和并发控制,避免了数据同步、竞态条件等问题,因此 Redis 在处理数据时能保证原子性和一致性。每次只有一个命令在执行,避免了多线程系统中的并发问题。
  • 极简的设计: Redis 的核心设计非常简洁。使用单线程能够简化代码,使得 Redis 能够在保证高性能的同时,避免了并发带来的复杂性。

虽然 Redis 是单线程的,但它可以处理 大量并发连接。这是因为:Redis 通过 非阻塞的 I/O 多路复用 来同时处理大量的客户端请求。即使它只有一个线程,它也能通过事件循环(event loop)高效地处理多个连接请求。当一个请求在等待 I/O 操作时,Redis 可以切换到其他准备好的请求,从而避免了线程阻塞。Redis 操作非常简单且高效,通常每个命令的执行时间都非常短。因此,即使是单线程,也能在极短的时间内处理大量请求。

虽然 Redis 是单线程的,但还可以利用多核 CPU:

  • 分布式部署:Redis 可以在多个机器上部署,通过 Redis ClusterRedis Sentinel 来实现分布式环境下的负载均衡和高可用性。每个 Redis 实例仍然是单线程的,但可以通过多个 Redis 实例在不同的机器上并行处理请求。
  • 客户端多线程:应用程序的客户端可以通过多线程来发出多个并发请求,这些请求可以由不同的 Redis 实例并行处理,充分利用多核 CPU 的优势。

相关文章:

  • Java Web项目(一)
  • Java29:Spring MVC
  • 积木报表查询出现jdbc.SQLServerException: 对象名 ‘user_tab_comment 的解决方法
  • Federated Weakly Supervised Video Anomaly Detection with Multimodal Prompt
  • SpringBoot集成Kafka详解
  • 【锂电池SOH估计】SVM支持向量机锂电池健康状态估计,锂电池SOH估计(Matlab完整源码和数据)
  • 零点、驻点、拐点、极值点、最值点的定义、几何意义、求解方法
  • 2025年4月19日-得物算法岗春招笔试题-第二题
  • 项目预期管理:超越甘特图,实现客户价值交付
  • The_Planets_Earth靶场笔记(VulnHub)
  • 996引擎-拓展变量:物品变量
  • python:循环语句 while循环,for遍历循环,break,continue,else,嵌套循环(打印矩形、三角形,九九乘法表)
  • AI与思维模型【68】——排列组合
  • ASP.NET 0~1学习
  • 物联网技术赋能:复杂环境下的能源数据零丢失
  • 文件管理详解(曼波脑图版)
  • 爆肝整理!Stable Diffusion的完全使用手册(二)
  • 相控阵列天线:原理、优势和类型
  • strings.ToLower 使用详解
  • 健身房管理系统设计与实现(springboot+ssm+vue+mysql)含万字详细文档
  • 马上评|遭强奸之后私刑报复,不属正当防卫
  • 商务部24日下午将举行发布会,介绍近期商务领域重点工作情况
  • 30小时已过,俄罗斯复活节停火不再延长
  • “棉花糖爸爸”陈生梨:女儿将落户到贵州纳雍
  • 语言天才、魔方大师,击败王楚钦前他豪言:我能比中国球员强
  • 人民日报:各地扎实开展学习教育,一体推进学查改