ZBLOG

详细介绍一下redis的背景

好的,Redis 的背景故事和技术理念非常精彩,它完美地诠释了“一个特定需求催生一个伟大项目”的过程。

Redis 的诞生:一个意大利初创公司的性能困境

Redis 的创造者是 Salvatore Sanfilippo,一位来自意大利西西里岛的程序员,网名 antirez

时间回到 2009年,当时 antirez 正在为一家名为 LLOOGG 的初创公司工作。这家公司开发的是一个实时的网站流量分析工具(类似于早期的 Google Analytics)。

他们遇到了一个非常具体且棘手的性能瓶颈:

  1. 高写入负载:需要实时记录大量来自不同用户的页面访问日志。
  2. 低延迟查询:用户希望查询和分析数据时,系统必须极快地返回结果。
  3. 复杂的数据结构:数据不是简单的键值对,而是涉及列表、集合等操作(例如,“找出访问过页面A和页面B的唯一用户数”)。

现有解决方案的不足

当时他们尝试了多种主流数据库,但都不理想:

  • MySQL 等关系型数据库 (RDBMS)
    • 问题:写入速度太慢(因为要写磁盘、维护事务ACID特性、维护索引等),难以应对高并发写入。做复杂的集合运算也很吃力。
  • Memcached
    • 问题:它是一个纯内存的键值缓存,速度极快,但功能太单一。它只能存储简单的字符串,无法支持他们需要的列表、集合等复杂操作。而且数据不能持久化。

“AHA Moment”(顿悟时刻)

面对这个困境,antirez 萌生了一个想法:为什么不自己写一个工具呢?

这个新工具的核心设计理念非常明确:

  1. 基于内存 (In-Memory):所有数据主要存储在内存中,这使得读写速度可以达到微秒级别,彻底解决 I/O 瓶颈。
  2. 支持丰富的数据结构 (Data Structures):不仅仅是字符串,还要直接支持程序员最常用的数据结构,如列表(Lists)、集合(Sets)、有序集合(Sorted Sets)、哈希(Hashes)。这样就能在服务器端高效地执行交集、排序、排名等逻辑,而无需将数据传输到客户端处理。
  3. 持久化 (Persistence):虽然数据主要在内存中,但为了防止服务器重启或宕机导致数据丢失,它需要有一种机制将内存中的数据异步地保存到磁盘上。这就是后来 Redis 的 RDB(快照)和 AOF(追加日志)两种持久化方式的由来。
  4. 简单至上 (Simplicity):代码库要保持小巧和简洁,专注于解决核心问题。它的协议是人类可读的(RESP - Redis Serialization Protocol),API 直观易用。

名字的由来

最初,这个项目被 antirez 命名为 LMDB(Lightweight Memory Database),但这个名字已经被另一个数据库使用了。

于是他将其更名为 Redis,这是 Remote Dictionary Server(远程字典服务)的缩写。这个名字完美地概括了它的本质:

  • Dictionary: 其核心数据模型是键值对映射,就像一个编程语言中的字典或哈希表。
  • Server: 它是一个通过网络提供服务的守护进程。
  • Remote: 客户端可以通过网络远程访问它。

发展历程与影响

  1. 2009年:Redis 首次发布并开源。
  2. 2010年:VMware公司看中了 Redis 的潜力,聘请了 antirez 全职开发 Redis。这标志着 Redis 从一个业余项目转变为一个得到商业支持的重要开源项目。
  3. 2013年- : Redis Labs(现更名为 Redis Inc.)成立,成为管理和赞助 Redis开发的主要商业实体。antirez也加入了该公司。
  4. 至今:Redis已经成为世界上最流行的 NoSQL数据库之一,是事实上的标准内存数据结构存储解决方案。它在缓存、会话存储、消息队列、排行榜、实时分析等场景中无处不在。

Redis成功的核心原因总结

🔥
开发者友好
API极其直观,与其说是在用数据库,不如说是在用高级语言的内置数据结构进行操作,大大降低了开发难度和时间。
LPUSH mylist value, ZADD leaderboard100 user1, SINTER set1 set2

极致性能
<100us的单次操作延迟,轻松支持10万+ QPS,满足了互联网应用对实时性的苛刻要求。
单线程模型避免了上下文切换和竞态条件的开销。
基于非阻塞I/O多路复用(epoll/kqueue)处理并发连接。
纯内存访问。
优化的底层数据结构(如跳跃表、压缩列表)。
🧩
多功能性
String(字符串), Hash(哈希), List(列表), Set(集合), Sorted Set(有序集合), Bitmaps(位图)…
这些丰富的数据结构让它能优雅地解决各种各样的问题,而不仅仅是一个简单的缓存。
后续还增加了Streams(流)、Geo(地理空间)、JSON等模块。
通过Lua脚本实现服务器端原子操作。
Pub/Sub(发布/订阅)功能可用于简单的消息系统。

总而言之,Redis的背景是一个典型的“ scratching your own itch ”(挠自己的痒处)的故事。它并非为了颠覆而颠覆,而是为了解决一个真实、迫切且未被现有技术很好满足的业务需求而生。它的成功源于其精准的定位和对开发者体验与极致性能的不懈追求。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24133

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?