Redis作为“内存”数据库是什么意思?

34

维基百科称Redis是一种内存数据库,但它也可以“至少每2秒将数据持久化到磁盘”。我觉得这两件事是互相排斥的。既然Redis被认为是内存中的,那怎么可能(能够)将数据存储在磁盘上呢?我原以为内存中的定义意味着它不会存储到磁盘。


这是一个类似的问题:Redis概念:内存或数据库? 不同之处在于他询问持久性实现。我的问题是关于内存与持久性的概念。

5个回答

32
Redis是一种在内存中但持久化到磁盘上的数据库,因此它代表了一种不同的权衡,在保证非常高的写入和读取速度的同时又有一个数据集大小不能超过内存的限制。内存数据库的另一个优点是,相比于磁盘上相同的数据结构,复杂数据结构的内存表示要简单得多,因此Redis可以用很少的内部复杂性来完成很多工作。同时,两种磁盘存储格式(RDB和AOF)不需要适合随机访问,因此它们是紧凑的,并且始终以追加方式生成(即使AOF日志轮换也是追加操作,因为新版本是从内存中的数据副本生成的)。

http://redis.io/topics/faq

在Redis中,所有的数据都必须在内存中。这是与其他NoSQL完全不同的地方。通常情况下,当你访问和读取数据库中的某些数据时,你不知道数据是否在内存(缓存)中,但在Redis的情况下,可以保证所有数据都在内存中。写入磁盘是可选的,你可以将其视为内存中有主要数据,而磁盘上有一种备份。如果突然关闭服务器,则可能会丢失在最后一次保存到磁盘之后保存的数据。
当然,它的优点是性能。由于所有数据都在RAM中,因此非常快。

10
如果我有10GB的RAM,但我想在Redis中存储20GB,会发生什么? - Daniel Kaplan
7
我看了一下那个常见问题解答,我的理解是这样的:"整个数据集必须适应内存,并且持久性用作在紧急情况下的备份。但是,在 Redis 中您永远不能存储超过 RAM 大小的数据。" 这个理解准确吗? - Daniel Kaplan
3
关于之前的评论,虚拟内存已经被弃用了——2.4版本是最后一个支持此功能的版本(2011年)。 - Yury Kozlov
1
@DanielKaplan 在10GB之后(虽然你实际上无法使用所有的RAM,还有其他需要运行的东西),任何需要更多内存的操作都会抛出错误。读取将成功。刷新到磁盘是为了在崩溃/重启后恢复redis。复制仍然进入RAM,因此没有磁盘。分片进入RAM,因此没有磁盘。持久性只是为了恢复。您无法从该持久性中读取。 - piepi

7

它们并不是相互排斥的。In-memory 意味着所有数据都存储在内存中以供访问。这并不意味着也不应该偶尔将其存储到磁盘上,但绝对不应该从磁盘访问,除非发生一些异常事件。 读取数据时,可以从磁盘或内存中读取。在 Redis 的情况下,它总是从内存中检索(因此- 内存数据库)。 每两秒将数据写入磁盘有助于在停机情况下备份数据。一方面,访问数据库的用户访问存储在内存中的数据,另一方面,备份机制从内存中访问数据并将其写入磁盘。 发生系统故障时,存储在内存中的数据会丢失。但是在启动时,数据(最多最近 2 秒的数据)会从磁盘检索并再次存储到内存中供应用程序使用。


3

Redis是一种基于内存的数据库(IMDB),它依赖计算机的主内存来存储数据,而其他数据库则使用磁盘存储机制。这就是为什么Redis比优化磁盘的数据库更快,因为磁盘访问比内存访问慢。


1
在内存数据库中,它位于Web客户端和后端数据库之间(例如MySQL、DynamoDB、Hbase等)。当客户端向Web服务器发送查询时,通常情况下,Web服务器需要查询MySQL以获取结果。Redis(或Memcached)为这些查询结果提供了缓冲区。因此,Web服务器只需要浏览存储在Redis/Memcached中的键值对(存储在内存中)即可获得结果。键通常是特定查询的哈希码,值是查询结果。
可能还有其他使用Redis的方法。但基本思想是相同的:比磁盘数据库更快的查找。

1
为了提高性能,Redis将数据存储在内存中。但由于Redis是基于键值对的NoSQL数据库,它也提供了将数据持久化到磁盘的选项。

1
这并没有为我澄清任何事情。为什么这不是一个“NoSQL数据库”?相反,它是一个“NoSQL内存数据库”,我不明白为什么。 - Daniel Kaplan
1
将数据持久化到磁盘上对于一个 NoSQL 数据库是必需的吗?我不这么认为。请提供一些参考资料来证明我错了。 - Dexter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接