Redis 成为 "in memory" 数据库意味着什么?

What does it mean for Redis to be an "in memory" database?

Wikipedia says说Redis是内存数据库,但是也说可以持久化"data to the disk at least every 2 seconds"。我觉得这两件事是相互排斥的。它怎么能被认为是内存中的(它可以)将数据存储在磁盘上?我假设内存中的定义意味着 它不会 存储到磁盘。


这是一个类似的问题:Redis concept: In memory or DB?不同的是他问的是持久化实现。我的问题是关于内存中与持久性的概念。

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

Redis is an in-memory but persistent on disk database, so it represents a different trade off where very high write and read speed is achieved with the limitation of data sets that can't be larger than memory. Another advantage of in memory databases is that the memory representation of complex data structures is much simpler to manipulate compared to the same data structure on disk, so Redis can do a lot, with little internal complexity. At the same time the two on-disk storage formats (RDB and AOF) don't need to be suitable for random access, so they are compact and always generated in an append-only fashion (Even the AOF log rotation is an append-only operation, since the new version is generated from the copy of data in memory).

http://redis.io/topics/faq

在redis中,所有数据都必须在内存中。这是与其他NoSQL完全不同的一点。通常当你访问和读取数据库中的一些数据时,你不知道数据是否在内存(缓存)中,但是对于Redis,它保证所有数据都在内存中。写入磁盘是可选的,您可以将其视为内存上的主干和磁盘上的一种备份。如果您突然关闭服务器,您可能会丢失上次保存到磁盘后保存的数据。

当然,它的优势在于性能。由于所有数据都在 RAM 中,因此速度非常快。

内存数据库位于Web客户端和后端数据库之间(例如,MySQL,或DynamoDB、Hbase等)。当客户端向网络服务器发送查询时,通常,网络服务器需要查询 MySQL 以获得结果。 Redis(或 Memcached)为此类查询结果提供了一个缓冲区。因此,web服务器只需要遍历存储在Redis/Memcached(存储在内存中)的键值对就可以得到结果。 key通常是具体查询的hash码,value是查询的结果。

可能还有其他使用Redis的方法。但基本思想是相同的:比磁盘数据库更快的查找。

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

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