同时,Redis的RDB文件也是Redis主从同步内部实现中的一环 。RDB有他的不足,就是一旦数据库出现问题,那么我们的RDB文件中保存的数据并不是全新的,从上次RDB文件生成到Redis停机这段时间的数据全部丢掉了 。在某些业务下,这是可以忍受的 。2)AOF日志AOF日志的全称是append only file,它是一个追加写入的日志文件 。
【Memcached,memcache】与一般数据库的binlog不同的是,AOF文件是可识别的纯文本,它的内容就是一个个的Redis标准命令 。只有那些会导致数据发生修改的命令才会追加到AOF文件 。每一条修改数据的命令都生成一条日志,AOF文件会越来越大,所以Redis又提供了一个功能,叫做AOF rewrite 。其功能就是重新生成一份AOF文件,新的AOF文件中一条记录的操作只会有一次,而不像一份老文件那样,可能记录了对同一个值的多次操作 。
其生成过程和RDB类似,也是fork一个进程,直接遍历数据,写入新的AOF临时文件 。在写入新文件的过程中,所有的写操作日志还是会写到原来老的AOF文件中,同时还会记录在内存缓冲区中 。当重完操作完成后,会将所有缓冲区中的日志一次性写入到临时文件中 。然后调用原子性的rename命令用新的AOF文件取代老的AOF文件 。
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更偏向于在服务器端构建分布式存储 。
推荐阅读
- 有没有人给t2贴过钢化膜啊
- 关于T2如何禁止软件后台自启动
- 什么挂pk牛逼,挂哥PK无敌战神
- 贪玩蓝月答题怎么领元宝,蓝月至尊版如何得到元宝
- 皮卡堂怎么快速得金币,4399游戏吧客服中心
- 安卓平板怎么样,安卓平板和ipad如何选择
- 怎么化妆品加盟,如何化妆品加盟
- 怎样快速提升酒店服务质量,酒店如何创造服务质量优势
- 提高小学数学成绩,小学数学如何培养能力
- 如何控制采购成本,为什么要控制采购成本
