该持久化方式实际是在Redis内部一个定时器事件,每隔固定时间去检查当前数据发生的改变次数与时间是否知足配置的持久化触发的条件,若是知足则经过操做系统fork调用来建立出一个子进程,这个子进程默认会与父进程共享相同的地址空间,这时就能够经过子进程来遍历整个内存来进行存储操做,而主进程则仍然能够提供服务,当有写入时由操做系统按照内存页(page)为单位来进行copy-on-write保证父子进程之间不会互相影响。mysql
该持久化的主要缺点是定时快照只是表明一段时间内的内存映像,因此系统重启会丢失上次快照与重启之间全部的数据。redis
aof方式实际相似mysql的基于语句的binlog方式,即每条会使Redis内存数据发生改变的命令都会追加到一个log文件中,也就是说这个log文件就是Redis的持久化数据。sql
aof的方式的主要缺点是追加log文件可能致使体积过大,当系统重启恢复数据时若是是aof的方式则加载数据会很是慢,几十G的数据可能须要几小 时才能加载完,固然这个耗时并非由于磁盘文件读取速度慢,而是因为读取的全部命令都要在内存中执行一遍。另外因为每条命令都要写log,因此使用aof 的方式,Redis的读写性能也会有所降低。数据库
虚拟内存方式是Redis来进行用户空间的数据换入换出的一个策略,此种方式在实现的效果上比较差,主要问题是代码复杂,重启慢,复制慢等等.编程
diskstore方式是做者放弃了虚拟内存方式后选择的一种新的实现方式,也就是传统的B-tree的方式,目前仍在实验阶段,后续是否可用咱们能够拭目以待。网络
当业务不须要数据持久化时,固然关闭全部的持久化方式能够得到最佳的性能以及最大内存的使用量;若是须要使用持久化,根据是否能够容忍重启丢失部分数据在快照方式与语句追加方式之间选择其一,不要使用虚拟内存以及diskstore方式。目前来讲,我的以为选择aof的方式是最佳的选择。编程语言
难以取舍的持久化机制主要是快照和aof方式。相比于aof快照的特色是速度快,恢复的速度也快。可是宕机的时候丢失的数据相对多一点。函数
当aof和快照同时开启的时候,数据恢复时会首先使用 aof的文件来恢复,恢复失败的时候再去考虑快照。性能
分区是分割数据到多个Redis实例的处理过程,所以每一个实例只保存key的一个子集。spa
1)分区的优点
经过利用多台计算机内存的和值,容许咱们构造更大的数据库。
经过多核和多台计算机,容许咱们扩展计算能力;经过多台计算机和网络适配器,容许咱们扩展网络带宽。
2) 分区的不足
redis的一些特性在分区方面表现的不是很好:
涉及多个key的操做一般是不被支持的。举例来讲,当两个set映射到不一样的redis实例上时,你就不能对这两个set执行交集操做。
涉及多个key的redis事务不能使用。
当使用分区时,数据处理较为复杂,好比你须要处理多个rdb/aof文件,而且从多个实例和主机备份持久化文件。
增长或删除容量也比较复杂。redis集群大多数支持在运行时增长、删除节点的透明数据平衡的能力,可是相似于客户端分区、代理等其余系统则不支持这项特性。然而,一种叫作presharding的技术对此是有帮助的。
3)分区类型
Redis 有两种类型分区。假设有4个Redis实例 R0,R1,R2,R3,和相似user:1,user:2这样的表示用户的多个key,对既定的key有多种不一样方式来选择这个key存放在哪一个实例中。也就是说,有不一样的系统来映射某个key到某个Redis服务。
1.范围分区
最简单的分区方式是按范围分区,就是映射必定范围的对象到特定的Redis实例。好比,ID从0到10000的用户会保存到实例R0,ID从10001到 20000的用户会保存到R1,以此类推。这种方式是可行的,而且在实际中使用,不足就是要有一个区间范围到实例的映射表。这个表要被管理,同时还须要各类对象的映射表,一般对Redis来讲并不是是好的方法。
2.哈希分区
另一种分区方法是hash分区。这对任何key都适用,也无需是object_name:这种形式,像这样:用一个hash函数将key转换为一个数字,好比使用crc32 hash函数。对key foobar执行crc32(foobar)会输出相似93024922的整数。 对这个整数取模,将其转化为0-3之间的数字,就能够将这个整数映射到4个Redis实例中的一个了。93024922 % 4 = 2,就是说key foobar应该被存到R2实例中。注意:取模操做是取除的余数,一般在多种编程语言中用%操做符实现。