Redis

Redis

Redis是完全开源免费的一个高性能key-value数据库。

  • 支持数据的持久化。
  • Redis支持丰富的数据类型,list,set,hash等。
  • Redis性能极高。

持久化

Redis支持将内存中的数据持久化到硬盘中,方便数据的备份及数据的恢复。 Redis持久化分为RDB,AOF两种方式。

1. RDB:

  • RDB持久化的方式能够在指定的时间间隔对内存中的数据进行快照存储。所以又称为存量模式。RDB保存了某个时间点的数据集,形成了一个文件。
  • 当数据持久化时,实际上是fork一个子进程,先将数据集写入到临时文件中,写入成功后,再替换之前的文件,使用二进制压缩来进行存储。
  • RDB是Redis默认的持久化方式。会在相应的目录下生成一个dump.rdb文件,每当Redis重启时,读取此文件进行数据集的恢复。
  • 因为在持久化的时会fork一个子进程出来,主进程继续处理操作。所以能够IO最大化,主进程不做任何的IO操作,只需要子进程执行。
  • 当Redis服务失败后,RDB的持久化方式可能会丢失数据。因为RDB是隔一段时间来进行一次持久化,所以适合对于数据的要求不是特别严格的情况下。
  • 当Redis持久化时,会fork子进程将数据写入临时文件,此时子进程会复制主进程的内存数据,会增加服务器的开销。当内存高到使用虚拟内存时,子进程会阻塞运行,可能会造成秒级别的不可用状态,所以要保证服务器的空余内存足够使用。

2. AOF:

  • AOF持久化的方式记录了每次对于Redis的写,删操作。所以又称作为增量模式。是以文件的形式来进行记录,文件中可以看到详细的操作记录。
  • AOF是未了弥补RDB的不足(数据的不一致性),所以AOF采用日志记录的方式来记录每个操作,并追加到文件中。
    Redis重启会根据日志文件的内容来进行从前到后执行一次来完成数据的恢复。
  • AOF持久化方式可以提供更高的数据安全性,通过追加的方式来保证数据的一致性,即便中途服务失败,也可以解决数据的一致性。
  • AOF持久化方式在AOF文件过大时,会对命令进行合并并进行重写文件。
  • AOF文件相对于RDB文件更大,且服务失败后恢复速度更慢,数据集过大时,启动速度比RDB模式效率低。
  • 根据所使用的fsyns策略,AOF速度可能会慢于RDB。
  • AOF持久化方式可能会因为某些命令导致AOF文件在恢复数据时,无法将数据恢复到之前的状态。

速度

Redis是单线程,为什么它还这么快?

  • Redis完全基于内存,绝大部分请求时基于内存操作,当数据在内存中,类似于HashMap,此时查找和操作的时间复杂度都是O(1);
  • Redis采用单线程模式,避免了CPU的上下文切换及竞争。也不存在多线程考虑各种锁的问题,不存在死锁的情况导致的性能消耗。
  • Redis采用的是多路I/O复用模型,非阻塞IO。 20190506133507145
  • 这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.xiaofsu.com/archives/redis