命令使用

这里主要涉及到一些时间复杂度比较高的查询或者聚合计算,要根据实际情况,使用合适的命令。可以通过查看 Redis 的响应延迟,来判断Redis是否真的变慢。

文件系统AOF

Redis虽然是内存数据库,但为了保证数据不丢失,需要把数据写入到磁盘当中。而AOF的刷盘策略有以下三种:

image-20231229113951578

当使用evertsec时,允许丢失一秒的数据。这时候,使用后台子线程来进行fsync,并且是异步执行。这种情况下对主进程的影响并不会很大。

但是当写回策略配置为always时,情况就不一样了。为了确保每条数据都写入磁盘,Redis就不能使用后台子线程来进行fsync,因为这样无法知道是否写入完成。所以只能由主进程来执行,这大概率会影响性能。

另一方面,随着AOF文件的增大,还需要执行AOF重写,AOF重写采用的是后台子线程来进行,但是需要注意的是:

AOF 重写会对磁盘进行大量 IO 操作,同时,fsync 又需要等到数据写到磁盘后才能返回,所以,当 AOF 重写的压力比较大时,就会导致 fsync 被阻塞。虽然 fsync 是由后台子线程负责执行的,但是,主线程会监控 fsync 的执行进度。

当主线程使用后台子线程执行了一次 fsync,需要再次把新接收的操作记录写回磁盘时,如果主线程发现上一次的 fsync 还没有执行完,那么它就会阻塞。

也就是说,当需要执行fsync时,并且此时正好在执行AOF重写,磁盘压力比较大,就会导致子线程的fsync操作被阻塞,这将会影响到下一次的主线程的写入。

操作系统Swap

内存 swap 是操作系统里将内存数据在内存和磁盘间来回换入和换出的机制。

这里就需要注意,如果物理机的内存不够时,就有可能将Redis中的数据换出,放入磁盘当中。这是出现查找命令,发现内存中没有,就需要从磁盘中加载到内存当中,这会严重影响性能。

操作系统:内存大页

内存大页是linux新支持的一种机制。该机制支持2MB的大页,而通常的内存页分配是4KB。

内存大页一定程度上可以给Redis内存分配带来优势,但是需要注意的是,Redis 为了提供数据可靠性保证,需要将数据做持久化保存。这个写入过程由额外的线程执行,所以,此时,Redis 主线程仍然可以接收客户端写请求。

客户端的写请求可能会修改正在进行持久化的数据。在这一过程中,Redis 就会采用写时复制机制,也就是说,一旦有数据要被修改,Redis 并不会直接修改内存中的数据,而是将这些数据拷贝一份,然后再进行修改。

如果采用了内存大页,那么,即使客户端请求只修改 100B 的数据,Redis 也需要拷贝 2MB 的大页。解决方法就是关闭内存大页。