Redis和Memcached的区别( 四 )


AOF是一个写文件操作,其目的是将操作日志写到磁盘上,所以它也同样会遇到我们上面说的写操作的流程 。在Redis中对AOF调用write写入后,通过appendfsync选项来控制调用fsync将其写到磁盘上的时间,下面appendfsync的三个设置项,安全强度逐渐变强 。
appendfsync no 当设置appendfsync为no的时候,Redis不会主动调用fsync去将AOF日志内容同步到磁盘,所以这一切就完全依赖于操作系统的调试了 。对大多数Linux操作系统,是每30秒进行一次fsync,将缓冲区中的数据写到磁盘上 。
appendfsync everysec 当设置appendfsync为everysec的时候,Redis会默认每隔一秒进行一次fsync调用,将缓冲区中的数据写到磁盘 。但是当这一次的fsync调用时长超过1秒时 。Redis会采取延迟fsync的策略,再等一秒钟 。也就是在两秒后再进行fsync,这一次的fsync就不管会执行多长时间都会进行 。这时候由于在fsync时文件描述符会被阻塞,所以当前的写操作就会阻塞 。所以结论就是,在绝大多数情况下,Redis会每隔一秒进行一次fsync 。在最坏的情况下,两秒钟会进行一次fsync操作 。这一操作在大多数数据库系统中被称为group commit,就是组合多次写操作的数据,一次性将日志写到磁盘 。
appednfsync always 当设置appendfsync为always时,每一次写操作都会调用一次fsync,这时数据是最安全的,当然,由于每次都会执行fsync,所以其性能也会受到影响 。
对于一般性的业务需求,建议使用RDB的方式进行持久化,原因是RDB的开销并相比AOF日志要低很多,对于那些无法忍数据丢失的应用,建议使用AOF日志 。
4、集群管理的不同
Memcached是全内存的数据缓冲系统,Redis虽然支持数据的持久化,但是全内存毕竟才是其高性能的本质 。作为基于内存的存储系统来说,机器物理内存的大小就是系统能够容纳的最大数据量 。如果需要处理的数据量超过了单台机器的物理内存大小,就需要构建分布式集群来扩展存储能力 。
Memcached本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储 。下图给出了Memcached的分布式存储实现架构 。当客户端向Memcached集群发送数据之前,首先会通过内置的分布式算法计算出该条数据的目标节点,然后数据会直接发送到该节点上存储 。但客户端查询数据时,同样要计算出查询数据所在的节点,然后直接向该节点发送查询请求以获取数据 。
请点击输入图片描述
相较于Memcached只能采用客户端实现分布式存储,Redis更偏向于在服务器端构建分布式存储 。最新版本的Redis已经支持了分布式存储功能 。Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本,它没有中心节点,具有线性可伸缩的功能 。下图给出Redis Cluster的分布式存储架构,其中节点与节点之间通过二进制协议进行通信,节点与客户端之间通过ascii协议进行通信 。在数据的放置策略上,Redis Cluster将整个key的数值域分成4096个哈希槽,每个节点上可以存储一个或多个哈希槽,也就是说当前Redis Cluster支持的最大节点数就是4096 。Redis Cluster使用的分布式算法也很简单:crc16( key ) % HASH_SLOTS_NUMBER 。
请点击输入图片描述
为了保证单点故障下的数据可用性,Redis Cluster引入了Master节点和Slave节点 。在Redis Cluster中,每个Master节点都会有对应的两个用于冗余的Slave节点 。这样在整个集群中,任意两个节点的宕机都不会导致数据的不可用 。当Master节点退出后,集群会自动选择一个Slave节点成为新的Master节点 。
请点击输入图片描述
【Redis和Memcached的区别】

推荐阅读