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

Redis缓存的数据到底存在哪儿?它是怎么保存的,能不能直接看见那些数据文件?

(引用自知乎专栏“Redis深度探险”)Redis缓存的数据,是存在服务器的内存(RAM)里的,这才是它速度如此之快的根本原因,因为CPU直接从内存读取数据,比从硬盘(比如SSD或机械硬盘)读取要快成千上万倍,你可以把Redis想象成一个超级高效的、放在内存里的超级大字典,你给它一个键(Key),它瞬间就能把对应的值(Value)找出来还给你。

内存有一个致命的缺点:一旦服务器断电或者重启,里面存的所有数据就全部丢失了,为了解决这个问题,保证数据不会“灰飞烟灭”,Redis提供了两种主要的机制,把内存里的数据“备份”到硬盘上,这个过程叫做持久化,更完整的回答是:Redis的数据平时主要活跃在内存里,但同时会根据你的设置,在硬盘上存有一个或多个备份文件。

(引用自Redis官方文档)Redis的持久化方式主要有两种,这也是决定你最终能在硬盘上看到什么样数据文件的关键:

第一种叫RDB(快照),这种方式很像我们给系统拍一张全景照片,你可以设置一个时间规则,比如每隔5分钟,或者当有1000个键被修改时,Redis就会把当前内存中完整的数据集,生成一个压缩过的二进制文件,保存到硬盘上,这个文件默认名字叫dump.rdb,这个文件的特点是紧凑,体积相对较小,恢复数据时速度很快,但缺点是,如果Redis在两次快照之间突然崩溃,那么从上一次拍照到崩溃那一刻之间新增或修改的数据就会丢失。

Redis缓存的数据到底存在哪儿?它是怎么保存的,能不能直接看见那些数据文件?

第二种叫AOF(追加日志),这种方式不像拍照,而更像是一个人在不停地写日记,每当Redis执行一个会改变数据集的命令(比如增加一个键、修改一个值),它就会把这个命令本身追加到AOF文件的末尾,AOF文件是一个纯文本文件(虽然内容可能因为重写机制而被压缩优化过),你可以用文本编辑器打开它,默认文件名是appendonly.aof,当Redis重启时,它就会“回放”一遍这个日记文件里的所有命令,从而在内存中重建出完整的数据,AOF的优点是数据安全性高,通常最多只会丢失一秒的数据(你可以配置为每秒钟同步一次日记到硬盘),缺点是文件体积通常会比RDB文件大,而且恢复数据的速度相对慢一些。

能不能直接看见那些数据文件呢?答案是:能,但直接看文件内容可能没什么意义。

Redis缓存的数据到底存在哪儿?它是怎么保存的,能不能直接看见那些数据文件?

你当然可以找到Redis的工作目录(通过Redis配置文件里的dir参数指定),然后在里面找到dump.rdbappendonly.aof文件,用ls -l命令能看到它们的大小和修改时间。

想直接“看懂”它们的内容,尤其是RDB文件,几乎是不可能的,因为RDB是经过高度优化的二进制格式,对人类来说就是一堆乱码,AOF文件虽然是文本格式,你可以用catmore命令查看,但你看到的也是一条条Redis命令的历史记录,它们堆积在一起,数量可能极其庞大,没有经过整理,可读性非常差,这就像你直接去看数据库的事务日志,没有专门的工具,根本无法理解数据的全貌。

(引用自Stack Overflow上的相关讨论)我们通常不会直接去阅读这些数据文件,要想查看Redis里存了什么,正确的方式是使用Redis自带的客户端命令行工具redis-cli,连接上服务器后,使用像KEYS *(生产环境慎用,可能阻塞服务)、GET key_nameHGETALL hash_name这样的命令来查询具体的数据,这些数据文件真正的用途是给Redis自己看的,用于在启动时恢复数据,或者用于主从复制,如果你真的需要分析RDB文件的内容,有一些第三方工具(比如redis-rdb-tools)可以帮你把二进制的RDB文件解析成可读的格式,但这属于高级运维或调试的范畴了。

Redis的数据主要住在“内存”这个高速公寓里,为了怕断电忘事,它用RDB(拍快照)或AOF(写日记)两种方式把数据备份到“硬盘”这个仓库里,你虽然能看见仓库里的文件(dump.rdbappendonly.aof),但文件本身是给Redis机器看的,对人来说不直观,想查看数据,还得通过Redis自己的大门(redis-cli)进去问它。