Redis简介:它是什么以及为何如此快速

发布: (2026年2月3日 GMT+8 00:09)
7 min read
原文: Dev.to

Source: Dev.to

什么是 Redis?

Redis(Remote DIctionary Server)是一个开源的内存数据结构存储,也是最流行的 NoSQL 数据库之一。它由 Salvatore Sanfilippo 于 2009 年创建,常被称为“数据结构服务器”,因为它支持的功能远超简单的键值存储。

  • 内存数据库 – 所有数据驻留在 RAM 中,提供极快的读写操作。
  • 持久化选项 – 虽然基于内存,Redis 仍可将数据持久化到磁盘。
  • 现代服务器拥有数百 GB 的 RAM,使 Redis 在许多实际工作负载中变得实用。

核心数据类型

Redis 支持一套丰富的优化数据结构:

  • Strings – 文本、二进制数据或数字
  • Lists – 有序的字符串集合
  • Sets – 无序的唯一字符串集合
  • Hashes – 字段‑值映射(类似对象)
  • Sorted Sets – 带分数的有序集合
  • Bitmaps – 空间高效的位级操作
  • HyperLogLogs – 概率基数估计
  • Streams – 仅追加的日志,用于消息传递和事件溯源

持久化

Redis 可以通过两种机制(单独使用或组合使用)实现数据的持久存储:

机制描述
RDB(Redis Database File)定期的时间点快照
AOF(Append‑Only File)记录每一次写操作,以获得更高的持久性

复制与高可用性

  • 读取可扩展性
  • 高可用性
  • 数据冗余

事务

Redis 事务原子地执行一组命令,确保所有命令作为单个单元进行处理。

发布/订阅

Redis 包含一个 Pub/Sub 消息系统,能够实现对多个订阅者的实时消息广播。

服务器端 Lua 脚本

Lua 脚本可以在服务器上运行,允许在单个脚本中原子且高效地执行多个操作。

性能特征

Redis 在单核上可以处理 100,000+ 次操作每秒。导致这种速度的关键原因包括:

  • 没有磁盘 I/O 瓶颈——数据驻留在 RAM 中
  • 通过指针直接访问内存,避免昂贵的序列化
  • 单线程、非阻塞 I/O 模型
    • 没有上下文切换开销
    • 没有竞争条件或锁的复杂性
    • 延迟可预测、稳定

要利用多个 CPU 核心,可在同一机器上运行多个 Redis 实例。

优化的内部数据结构

  • 哈希表,支持增量 rehash
  • ZipLists 用于内存高效的小集合
  • IntSets 用于仅整数的集合
  • Skip Lists 用于有序集合(O(log N) 性能)

实现细节

  • 使用 ANSI C 编写 → 手动内存管理,最小抽象,直接的系统级优化
  • 根据平台使用高性能系统调用(epollkqueueselect
  • RESP(Redis Serialization Protocol)——解析简单且快速
  • 管道(Pipelining)——发送多个命令而无需等待响应

异步后台任务

  • 后台 RDB 保存
  • AOF 重写
  • Fork 子进程

这些保持主事件循环的响应性。

常见使用场景

用例Redis 适用原因
缓存子毫秒读取,过期策略,无模式存储
会话存储为分布式应用的用户会话提供快速、集中式存储
计数器与限流原子递增 (INCR) 支持页面浏览量跟踪、在线用户计数
排行榜 / 排名有序集合提供高效排名
消息队列与后台任务列表和 Streams 实现轻量级队列
地理空间索引内置地理空间命令用于基于位置的数据
实时分析Pub/Sub + streams 支持事件溯源和实时仪表盘

安装

Ubuntu / Debian

sudo apt-get update
sudo apt-get install redis-server

macOS (Homebrew)

brew install redis

Docker

docker run --name redis -d -p 6379:6379 redis

基本命令(Redis CLI)

SET user:1001 "John Doe"
GET user:1001

SET session:abc123 "data" EX 10   # expires after 10 seconds
INCR page_views
LPUSH tasks "send_email"
SADD tags "redis" "database" "cache"

Advantages

  • 与基于磁盘的数据库相比,读取和写入速度更快
  • 没有 JOIN 或复杂查询 —— 简单的基于键的访问
  • 无模式且数据结构灵活
  • 内置持久化、Pub/Sub、事务和 Lua 脚本

Limitations

  • Memory cost – RAM比磁盘存储更昂贵
  • Dataset size – 数据必须适配可用内存
  • Single‑threaded model – CPU密集型操作可能阻塞其他请求
  • Persistence trade‑offs – RDB 与 AOF 需要仔细配置

摘要

  1. 内存存储 消除磁盘 I/O。
  2. 单线程事件循环 避免并发开销。
  3. 高度优化的基于 C 的数据结构 确保效率。

虽然 Redis 不是传统关系型数据库的替代品,但它在缓存、会话存储、实时分析引擎、消息中间件以及快速数据处理方面表现出色。它的简洁性、性能和灵活性使其成为现代系统架构的核心组件,已被 Twitter、GitHub、Stack Overflow 和 Snapchat 等公司广泛使用。

无论是构建小型应用还是扩展高流量平台,Redis 都能提供亚毫秒级的响应时间和无与伦比的性能,适用于快速变化的数据。

Back to Blog

相关文章

阅读更多 »