Redis的无关紧要的话题
在使用Redis的过程中,我发现了一些无关紧要的事情。
光盘使用量不得超过50%。
Redis的设计规范是每分钟将所有数据写入磁盘。具体方法是创建一个新的数据文件,与现有数据分离,然后将内存内容的快照一次性写入该文件,并在写入完成后用新数据覆盖旧数据。因此,在完成新内容的写入瞬间,旧数据和新数据会同时存在于磁盘上,也就是说瞬间会消耗当前持有数据量的两倍。当Redis单独运行在服务器上且磁盘消耗量超过50%时,容量不足以保存数据,保存过程将失败。保存失败后,Redis将拒绝写入,直到再次成功,实质上服务将停止。实际上,我认为很少会触发这个限制的情况。
内存使用量不能超过50%。
为了进行数据保存,需要在某一瞬间获取内存的快照。为此,Redis会fork出一个子进程,并在该子进程的内容不再被更改后将该子进程的数据保存到磁盘上。
此时,由于“写时复制(copy on write)”的好处,fork之后不需要为子进程额外分配内存。但是,如果在父进程中进行数据写入,那么该部分就会变为脏数据,并且会发生复制。
嗯,但是由于我的发帖并不是非常频繁,所以你可能认为只会产生百分之几的拷贝吧。但实际上并不是这样。首先,脏页判定是按页面为单位进行的。在Linux中,页面的默认大小为4KB,所以即使你只写入了1个字节,也会产生4KB大小的拷贝。此外,Redis的数据结构类似于一个巨大的哈希表,数据是分散保存的。所以即使你认为只写入了整体的1%的键值,根据页面大小的组合,大部分内存可能仍然会被标记为脏页。此外,随着数据量的增加,保存所需的时间会变长。这意味着在保存期间,脏页的比例与数据量成比例地增加。换句话说,内存消耗量将以数据量乘以写入数据的比例的速度递增。我想很多人都有过在服务开始后变得紧张的经历。
因此,如果内存消耗超过50%,在保存处理时可能会导致内存不足。内存不足将导致保存失败,并且 Redis 将拒绝写入直到再次成功保存为止。建议监控内存在正常情况下是否超过50%,或者监视 Redis 的日志可能会更好。
如果Redis的数据变得相当大,就不应该与其他服务共存。
Redis在数据量较少时感觉就像一个没有任何额外负担的小服务,所以可以轻松地与其他服务共存。但是,随着数据量的增加,对服务器的写入负载将呈线性增长。
因为特别是每分钟保存一次所有数据的规格,所以如果消耗了10GB级别的内存,最好认识到会发生大量向磁盘写入的情况。虽然是内存数据库,但我认为它可能是比其他任何数据库都有更多写入量的数据库。原因是即使只有很少的数据发生更改,也需要将所有数据写出。
这个留言通常是通过顺序访问来完成的,因此速度很快。但是如果其他进程(例如其他类型的数据库)频繁地进行写入操作,那么访问就会变成实际上的随机访问,并且会增加 Redis 本身的存储处理时间。如果花费的时间增加,那么写入复制的数量也会增加,这是令人不开心的。
总结
因此,让我们意识到,在数据量较小的 Redis 和数据量较大的 Redis 之间差距如同小猫和巨兽一样。