当前位置:首页 > 问答 > 正文

聊聊redis那些年发展故事,还有怎么查看它的历史记录问题

聊聊Redis那些年发展故事,还有怎么查看它的历史记录问题

说到Redis的发展故事,这得从一个意大利小伙子说起,根据Redis创始人萨尔瓦托雷·桑菲利波(Salvatore Sanfilippo),大家更习惯叫他安特雷兹(antirez),在他自己的博客和一些访谈中的回忆,Redis的诞生其实有点偶然,大概在2009年的时候,安特雷兹当时正在经营一家创业公司,他们遇到了一个具体的技术问题:需要一个能够实时记录网站日志的系统,这个系统要能非常快地写入大量的小数据,他尝试了当时已有的数据库,比如MySQL,发现性能跟不上,达不到他想要的实时性。

这位喜欢自己动手解决问题的程序员,就决定自己写一个工具来搞定,他的想法很简单,就是做一个在内存中运行的数据存储,因为内存的读写速度比硬盘快太多了,他把这个项目当作一个副业来搞,最初的名字也很直白,叫“LMDB”,意思是“本地内存数据库”,但后来他发现已经有别的项目叫这个名字了,就改成了“Redis”,这个名字是“REmote DIctionary Server”(远程字典服务器)的缩写,点明了它的核心功能——像一个可以通过网络访问的字典(键值对)一样存储数据。

聊聊redis那些年发展故事,还有怎么查看它的历史记录问题

Redis的第一个版本非常简陋,只支持简单的字符串键值对,但安特雷兹做了一个很关键的决定:他选择将Redis开源了,他把代码放到了GitHub的前身——一个叫Git的代码托管平台上,没想到,这个小小的项目很快就吸引了其他开发者的注意,大家发现,这个内存数据库的速度真是快得惊人,而且API简单易用,于是开始用它来解决各种各样的问题,不仅仅是日志记录了。

随着用户越来越多,大家提出了很多新需求,安特雷兹是个非常注重实用性和简洁性的开发者,他根据社区的反馳,开始一步步地为Redis添加新功能,有人需要存储更复杂的数据结构,而不仅仅是字符串,于是Redis陆续加入了列表(List)、集合(Set)、有序集合(Sorted Set)和哈希(Hash)这几种核心数据结构,这使得Redis从一个简单的缓存工具,逐渐演变成了一个功能更丰富的“数据结构服务器”,这也是Redis和其他很多键值数据库不一样的地方,它的价值不仅仅在于快,更在于它提供了这些可以直接操作的复杂数据结构。

聊聊redis那些年发展故事,还有怎么查看它的历史记录问题

另一个重要的节点是关于数据持久化的问题,因为Redis的数据主要放在内存里,万一服务器重启或者断电了,内存里的数据不就全没了吗?这确实是个大问题,早期,安特兹雷提供了两种主要的持久化方式:RDB和AOF,RDB就像是给内存里的数据拍一张快照,然后存到硬盘上,恢复的时候直接加载整个快照,速度很快,AOF则是把每一次写操作命令都记录下来,像一个日记本,恢复数据的时候把命令重新执行一遍就行,数据更安全,这两种方式各有优劣,用户可以根据自己的需要选择,后来,Redis还支持了主从复制,让数据可以有多个副本,提高了可用性。

Redis的发展越来越快,社区也越来越庞大,到了后来,安特雷兹一个人有点维护不过来了,幸运的是,他在2015年受邀加入了Redis Labs公司(现在叫Redis Inc.),这样他就可以全职投入Redis的开发,并且有一个团队支持他,再后来,微软、亚马逊等大公司也纷纷推出基于Redis的云服务,可见其影响力之大,值得一提的是,在2020年,安特雷兹觉得自己需要休息一下,同时也希望Redis能由一个更广泛的社区来主导未来,于是他选择了“退休”,将项目的维护权交给了Redis的核心开发团队。

聊聊redis那些年发展故事,还有怎么查看它的历史记录问题

讲完了发展故事,我们再来说说“怎么查看Redis的历史记录”这个问题,这里需要澄清一下,你问的“历史记录”可能有两种理解:

第一种理解是:查看Redis自己运行的历史记录,比如谁在什么时候执行了什么命令。 这种记录Redis本身是不会自动保存的,它主要专注于处理当前的数据和命令,不像MySQL那样有详细的日志记录每一条查询,你可以通过配置Redis的“慢查询日志”来记录那些执行时间超过你设定阈值的命令,你可以在Redis的配置文件redis.conf里找到slowlog-log-slower-than这个参数(比如设为10000微秒,即10毫秒),和slowlog-max-len(决定最多保存多少条慢日志),配置好后,你就可以使用SLOWLOG GET这个命令来查看最近有哪些命令执行得比较慢,包括命令的具体内容、执行时间、耗时等信息,这对于性能优化和排查问题很有帮助。

第二种理解,也是更常见的理解是:查看存储在Redis里的数据的变化历史记录。 很遗憾,Redis本身没有内置的功能来记录某个键(key)的值在过去被如何修改的历史,它是一个内存数据库,设计初衷就是追求极致的当前数据读写性能,而不是记录历史版本,当你执行一个SET name "张三"命令后,又把值改成SET name "李四",张三”这个旧值就从内存中彻底消失了,Redis不会替你记住它。

如果你确实有追踪数据历史变更的需求,通常需要在应用层面自己想办法解决。

  1. 双写策略:在应用程序中,每当要修改Redis里的某个关键数据时,除了执行修改命令,同时把这个修改操作(键名、旧值、新值、修改时间”)记录到另一个专门用于存储历史的数据库中,比如MySQL、MongoDB或者Elasticsearch里。
  2. 使用AOF文件:Redis的AOF持久化文件确实记录了所有写操作命令,理论上,你可以解析这个文件来还原出数据变化的整个历史,但这个方法非常重,通常只用于数据恢复等极端场景,不适合做日常的、实时的历史查询。
  3. 使用其他工具:有些第三方工具或监控系统可以通过监听Redis的命令流来间接实现历史记录的功能,但这已经超出了Redis本身的能力范围。

Redis的故事是一个优秀的开源项目如何从一个解决个人需求的简单工具,在社区的推动下成长为一个世界级基础设施的典范,而关于查看历史记录,你需要明白Redis的设计哲学是“活在当下”,它擅长的是处理“的数据,如果你需要“回顾过去”,就得自己动手搭建相应的机制了。