NVM全称Non-Volatile Memory非易失的存储,NVM的特点就是容量大、速度快、支持持久化数据,这个特性和Redis追求的目标不谋而合,所以在实际使用Redis时可以将NVM当作内存DRAM使用。
NVM内存和传统的DRAM内存相比有哪些优势呢?
NVM内存可以直接持久化保存数据,数据保存在NVM内存后,即使发生断电或者宕机,数据依然会保存在NVM内存中,而传统的DRAM内存遇到断电或者宕机就会导致DRAM内存数据丢失。
NVM内存的访问速度接近DRAM的速度,记住这里是接近而不是超过,NVM内存的读延迟大概200~300ns,写延迟大概100ns。
NVM内存的容量很大,NVM器件密度很大,单根NVM内存条能达到128G的容量最大甚至可以达到512G,所以我们可以采用NVM内存轻松构建TB级别的内存。
现在业界就有NVM内存产品,Intel在2019年4月推出Optane AEP 内存条(简称 AEP 内存),AEP内存给软件提供了两种使用模式,这两种模式的偏重点分别在NVM容量大,持久化保存数据上。
Memory模式,这种模式就是将NVM当作大容量的内存使用,这个模式并不会开启持久化的功能,那是不是说采用了Memory模式就不需要DRAM传统内存了呢?并不是服务器仍然需要配置DRAM内存,但是DRAM内存会被当作AEP内存的缓存使用,DRAM的内存空间对于应用软件不可见,应用软件使用的将会是AEP的内存空间。
APP Direct模式,这种模式将NVM当作了一个持久化的内存使用,也就是说应用软件将数据写到AEP内存上时,数据就直接被持久化保存下来了,这也叫做持久化内存(Persistent Memory简称PM)。
Redis如果采用AEP内存作为存储,那么需要分模式考虑
Redis采用Memory模式那么就是利用其容量大的特性来保存大量数据,Redis也可以给业务提供大容量的存储,Redis可以像在DRAM内存运行一样不需要修改代码。
但需要注意的是AEP内存的访问延迟肯定会比传统DRAM内存高,因为AEP本来就是NVM的一个实现,NVM存在访问和读写延迟,所以我们需要在读写延迟以及大容量上做一个取舍。
Redis去应用APP Direct模式后,那么写入AEP内存的数据将会自动持久化保存,这时候就不需要Redis的一些持久化机制了,因为不论是AOF还是RDB持久化方式,都会有丢失数据的风险,而且持久化操作时还可能引发一些问题
RDB持久化时,fork子进程会阻塞主线程。
AOF文件记录日志时,需要在可靠性和写性能之间做取舍,一般建议折中选择everysec。
AOF和RDB文件恢复数据时,恢复速度受RDB文件和AOF文件的大小限制。
所以在APP Direct模式下就可以充分利用PM持久化内存的特点,避免Redis自身持久化产生的一些问题。