数据安全:使用数据持久化和复制来预防和应对系统故障

性能保障:防止数据出错、使用流水线来提升性能和诊断潜在性能问题。


  1. 将数据持久化至硬盘
  2. 将数据复制到其他机器
  3. 处理系统故障
  4. Redis事务
  5. 非事务型流水线(non-transactional pipeline)


诊断性能问题 


数据持久化的2种方式

  •   快照,适用于丢失小部分数据也没关系的情况

save会阻塞进程,但是不会创建子进程 
bgsave会创建子进程导致redis停顿

  •  AOF持久化

save会阻塞进程,但是不会创建子进程

bgsave会创建子进程导致redis停顿

file.flush() 将缓冲区数据写入硬盘,但何时写入由操作系统决定

snyc同步操作会阻塞到指定文件被写入到硬盘为止

推荐appendfsync everysec选项,即时系统奔溃也能保证


乐观锁 & 悲观锁

关系数据库会在写入数据的时候加锁,但是这样做的缺点是其他想要访问的进程会被阻塞,这叫悲观锁。

Redis会在数据被抢先修改的情况下通知执行watch的客户端,不需要花时间等待,只需要在自己的事物执行失败的时候进行重试,这叫乐观锁。


总结

  1. 当一个进程创建子进程的时候,底层的操作系统会创建该进程的个副本。在Unix和类Unix系统上面,创建子进程的操作会进行如下优化:在刚开始的时候,父子进程共享相同的内存,直到父进程或者子进程对内存进行了写入之后,对被写入内存的共享才会结束。
  2. ACID是指原子性 (atomicity)、一致性 (consistency)、隔离性(isolation)和耐久性 (durability),如果一个数据库想要实现可靠的数据事务,那么它就必须保证ACID性质。
  3. 因为机器B原本就是一个从服务器,所以我们的客户端不能对它进行写入,并且在机器B执行快照操作之后,我们的客户端也不会与其他试图对机器B进行写入的客户端产生竞争条件。