非易失存储(Non-Volatile Memory,NVM) 器件具有容量大、性能快、能持久化保存数据的特性,这些刚好就是 Redis 追求的目标。同时,NVM 器件像 DRAM 一样,可以让软件以字节粒度进行寻址访问,所以,在实际应用中,NVM 可以作为内存来使用,称为 NVM 内存。
Redis 发展的下一步,就可以基于 NVM 内存来实现大容量实例,或者是实现快速持久化数据和恢复。
Redis 是基于 DRAM 内存的键值数据库,而跟传统的 DRAM 内存相比,NVM 有三个显著的特点:
Intel 在 2019 年 4 月份时推出的 Optane AEP 内存条(简称 AEP 内存)。AEP 内存给软件提供了两种使用模式,分别对应着使用了 NVM 的容量大和持久化保存数据两个特性。
当 AEP 内存使用 Memory 模式时,应用软件就可以利用它的大容量特性来保存大量数据,Redis 也就可以给上层业务应用提供大容量的实例。而且,在 Memory 模式下,Redis 可以像在 DRAM 内存上运行一样,直接在 AEP 内存上运行,不用修改代码。
在 Memory 模式下,AEP 内存的访问延迟会比 DRAM 高一点,Redis 实例读性能会有所降低,需要在保存大量数据和读性能较慢两者之间做个取舍。
Redis 在涉及持久化操作时的问题:
如果使用持久化内存,就可以充分利用 PM 快速持久化的特点,来避免 RDB 和 AOF 的操作。因为 PM 支持内存访问,而 Redis 的操作都是内存操作,可以把 Redis 直接运行在 PM 上。同时,数据本身就可以在 PM 上持久化保存,不再需要额外的 RDB 或 AOF 日志机制来保证数据可靠性。
PM 的使用方法:
/dev/pmem0
mkfs.ext4 /dev/pmem0
mount -o dax /dev/pmem0 /mnt/pmem0
此时,就可以在这个目录下创建文件。创建好了以后,再把这些文件通过内存映射(mmap)的方式映射到 Redis 的进程空间。这样就可以把 Redis 接收到的数据直接保存到映射的内存空间上,而这块内存空间是由 PM 提供的。所以,数据写入这块空间时,就可以直接被持久化保存。
因为 PM 的读写速度比 DRAM 慢,所以,如果使用 PM 来运行 Redis,需要评估下 PM 提供的访问延迟和访问带宽,是否能满足业务层的需求。