什么样的场景下需要同时使用Redis和memcached redis

实时计算(storm、kafka、zookeeper、flume、mysql、redis、memcached、zookeeper锁)
课程介绍:
讲述实时计算的完整开发流程以及案例。
持续更新中。。。
课时相关:共 50 课时,更新至第 30 课时
付费服务:所有课时永久观看(不提供下载);专属课件下载。
1金币=1人民币
&&【免费观看】
讲解如何在windows环境下安装linux虚拟机以及管理工具VMware;注意视频中选择安装了简装版的linux,如果对linux命令不是太熟悉请安装服务器开发版本。
&&【免费观看】
讲述flume的基础知识包括flume的基本概念和核心组件。flume是一个分布式、可靠、高可用的海量日志聚合系统,支持在系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据的简单处理,并写到各种数据接收方的能力。
讲述flume安装与测试,主要包括flume单机安装与测试、flume集群安装与测试、Arvo环境的搭建以及安装过程中的一些异常的解决方案讲解。
讲述flume部署种类、流配置。其中详细讲解了单一代理、多代理、多路复用流的配置说明。
讲述flume source相关的配置和案例分析,包括了Avro Source配置、Thrift Source配置、Exec Source配置、JMS Source配置、NetCat Source配置、Spooling Directory Source配置、Sequence Generator Source配置、Syslog
TCP Source配置、Multiport
TCP Source配置、Syslog
UDP Source配置、Http Source配置、Custom Source配置。
讲述flume sink相关的配置以及flume channel配置和案例分析,包括了HDFS Sink配置、Logger Sink配置、Avro Sink配置、Thrift Sink配置、IRC Sink配置、File Roll Sink配置、Null Sink配置、Hbase Sink配置、AsyncHbase Sink配置、Custom Sink配置;Memory Channel配置、JDBC Channel配置、File Channel配置、Pseudo Transaction Channel配置、Custom Channel配置。
讲述 flume selector相关配置和案例分析,包括了Replicating Channel Selector配置、Multiplexing Channel Selector配置、Custom Channel Selector配置。
讲述 Flume Sink Processors相关配置和案例分析,包括了Default Sink Processor配置、Failover Sink Processor配置、Load balancing Sink Processor配置。
讲述 Flume Event Serializers、Flume Interceptors相关配置和案例分析,包括了Body Text Serializer配置、Avro Text Serializer配置、Timestamp Interceptor配置、Host Interceptor配置、Static Interceptor配置、Regex Filtering Interceptor配置。
讲述如何进行 flume RPC Client开发,这个是在通常应用中使用的较多的一种方式。
讲述如何进行 flume Sink、flume Source开发。
&&【免费观看】
讲述kafka基础知识,包括了kafka产生背景、设计理念、部署架构、基本概念、设计的关键技术。
讲解kafka的单机安装与测试、kafka集群安装与测试。
深入讲解kafka特性,包括Topic/logs、Kafka与JMS的差别、Consumer offset、Consumer与Producer、Partition、Distribution、Producers、Consumers、Guarantees、Use cases。
讲解kafka producer、consumer的开发。
&&【免费观看】
讲述Memcached是什么,Memcached有哪些特征,Memcached能做些什么,Memcached适合做些什么。
讲述Memcached集群安装和命令的使用。
详解Memcached的分布式算法、Memcached的删除机制。
讲解Memcached客户端开发。
&&【免费观看】
讲解zookeeper基本知识,包括zookeeper是什么、设计目标、数据模型、zookeeper server组成、常用方法、典型应用场景。
讲解zookeeper用户指令。
讲述zookeeper集群安装与测试。
深入讲解zookeeper配置、Zookeeper Stat结构、节点类型、通知的状态类型和事件类型、常用的四字命令。
01:13:30&&&&
讲解zookeeper开发,包括zookeeper基本操作、通知状态和事件类型验证、授权操作、使用总结。
&&【免费观看】
storm基础知识讲解,包括实时计算需要解决一些什么问题,怎么实现一个实时计算系统,storm的基本概念,storm应用场景,storm的分组机制。
详细讲述storm集群的安装,手把手教授安装流程并排除问题.
详细讲述storm集群的安装,手把手教授安装流程并排除问题.
讲述maven环境的搭建过程,以及常用命令。
详细讲解storm-starter打包部署运行的全过程,同时进行storm集群验证。
详细讲解storm配置文件对应的参数,以及用法。
第一章:1.1 flume教程&& &1、flume简介-基础知识&& &讲述flume的基础知识包括flume的基本概念和核心组件。flume是一个分布式、可靠、高可用的海量日志聚合系统,支持在系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据的简单处理,并写到各种数据接收方的能力。&& &2、flume安装与测试&& &讲述flume安装与测试,主要包括flume单机安装与测试、flume集群安装与测试、Arvo环境的搭建以及安装过程中的一些异常的解决方案讲解&& &3、flume部署方式&& &讲述flume部署种类、流配置。其中详细讲解了单一代理、多代理、多路复用流的配置说明。&& &4、flume source相关配置及测试&& &讲述flume source相关的配置和案例分析,包括了Avro Source配置、Thrift Source配置、Exec Source配置、JMS Source配置、NetCat Source配置、Spooling Directory Source配置、Sequence Generator Source配置、Syslog& TCP Source配置、Multiport& Syslog& TCP Source配置、Syslog& UDP Source配置、Http Source配置、Custom Source配置。&& &5、flume sink相关配置及测试&& &讲述flume sink相关的配置以及flume channel配置和案例分析,包括了HDFS Sink配置、Logger Sink配置、Avro Sink配置、Thrift Sink配置、IRC Sink配置、File Roll Sink配置、Null Sink配置、Hbase Sink配置、AsyncHbase Sink配置、Custom Sink配置;Memory Channel配置、JDBC Channel配置、File Channel配置、Pseudo Transaction Channel配置、Custom Channel配置。&& &6、flume selector 相关配置与案例分析&& &讲述 flume selector相关配置和案例分析,包括了Replicating Channel Selector配置、Multiplexing Channel Selector配置、Custom Channel Selector配置。&& &7、Flume Sink Processors相关配置和案例分析&& &讲述 Flume Sink Processors相关配置和案例分析,包括了Default Sink Processor配置、Failover Sink Processor配置、Load balancing Sink Processor配置。&& &8、Flume Interceptors相关配置和案例分析&& &讲述 Flume Event Serializers、Flume Interceptors相关配置和案例分析,包括了Body Text Serializer配置、Avro Text Serializer配置、Timestamp Interceptor配置、Host Interceptor配置、Static Interceptor配置、Regex Filtering Interceptor配置。&& &9、Flume RPC Client开发&& &讲述如何进行 flume RPC Client开发,这个是在通常应用中使用的较多的一种方式。&& &10、Flume Sink和Flume Source开发&& &讲述如何进行 flume Sink、flume Source开发。1.2 zookeeper教程&& &1、zookeeper基础知识&& &讲解zookeeper基本知识,包括zookeeper是什么、设计目标、数据模型、zookeeper server组成、常用方法、典型应用场景。&& &2、zookeeper用户指令&& &讲解zookeeper用户指令。&& &3、zookeeper集群安装与测试&& &讲述zookeeper集群安装与测试&& &4、zookeeper深入讲解&& &深入讲解zookeeper配置、Zookeeper Stat结构、节点类型、通知的状态类型和事件类型、常用的四字命令&& &5、zookeeper开发&& &讲解zookeeper开发,包括zookeeper基本操作、通知状态和事件类型验证、授权操作、使用总结1.3 kafka教程&& &1、kafka基础知识讲解&& &讲述kafka基础知识,包括了kafka产生背景、设计理念、部署架构、基本概念、设计的关键技术。&& &2、kafka安装与测试&& &讲解kafka的单机安装与测试、kafka集群安装与测试。&& &3、kafka深入剖析&& &深入讲解kafka特性,包括Topic/logs、Kafka与JMS的差别、Consumer offset、Consumer与Producer、Partition、Distribution、Producers、Consumers、Guarantees、Use cases。&& &4、kafka producer和consumer开发&& &讲解kafka producer、consumer的开发。1.4 memcached教程&& &1、memcached基础知识&& &讲述Memcached是什么,Memcached有哪些特征,Memcached能做些什么,Memcached适合做些什么&& &2、memcached集群安装和命令的使用&& &讲述Memcached集群安装和命令的使用&& &3、memcached深入解析&& &详解Memcached的分布式算法、Memcached的删除机制&& &4、memcached开发&& &讲解Memcached客户端开发。1.5 storm教程&& &1、storm基本概念和组件介绍&& &2、storm分组策略&& &3、storm安装&& &4、Storm 记录级容错原理 && &5、Storm 配置详解&& &6、Storm 数据模型(topology)&& &7、Storm ack和fail&& &8、BasicBolt&& &9、Storm 批处理&& &10、Storm TOPN&& &11、Storm 流程聚合&& &12、Storm DRPC&& &13、Storm executor、worker、task之间的关系和调优&& &14、Storm异常解决1.6 redis教程&& &1、redis简介&& &详细讲解redis是什么,有什么不同,redis优势和主要问题,redis和关系型数据库比较,redis的数据持久化以及适用场景。&& &2、redis安装&& &讲解redis单机安装、master/slave组安装以及测试&& &3、redis配置详解&&& 详细介绍redis的配置。&& &4、redis String类型操作&& &深入讲解string的每一条命令以及命令的应用场景。第二章:集群安装1、准备vm环境2、zookeeper集群安装与测试3、flume集群安装与测试4、kafka集群安装与测试5、flume和kafka整合与测试6、storm集群搭建7、memcached集群搭建8、redis集群搭建第三章:集群验证和项目分析1、验证storm处理能力,从file读取数据然后直接打印2、kafka和storm整合与测试,从kafka producer端发起数据,storm端打印出对应的数据(引入插件)3、整合flume、kafka、zookeeper、storm;storm集群验证,从flume读取文件,在storm local cluster模式下面打印出来(需要编写一个简单topology)4、需求分析,(活跃用户分析)当天用户统计、当天独立活跃用户、当天业务流量、按照年龄统计独立用户(非独立)、按照指定页面统计(非独立)、用户每天登录次数统计(redis incr)、用户每天登录统计(redis setbit、bitcount)&& &涉及:A、去重(memcached)&& &&&&&& B、锁(分布式环境,多线程对同一个表进行读写操作,zookeeper锁机制)&& &&&&&& C、业务拆分&& &a、数据检查&& &b、业务量统计并入库&& &c、用户统计&& &d、用户年龄统计&& &e、页面统计&& &f、用户每天登录次数统计(直接计入redis中,用户名+时间=key )&& &g、去重处理&& &h、独立用户入库(按照基本维度)&& &s、年龄统计(独立用户)&& &k、页面统计(独立用户)&& &i、用户每天登录统计5、数据准备,编写自动生成脚本,往flume监控的目录文件注入数据6、mysql表设计四、代码编写1、搭建topology2、按照需求分析编写对应的bolt3、完善topology4、打包测试topology
flume部署方式
storm基础知识
Storm 集群安装视频教程-1
zookeeper简介
zookeeper用户指令
memcached 1 简介
memcached集群安装和命令的使用
flume安装与测试
flume部署方式
storm集群搭建
Storm 集群安装视频教程-1
zookeeper安装与测试
zookeeper用户指令
memcached 2 集群安装与命令使用
memcached集群安装和命令的使用
storm深入学习-1
Storm 集群安装视频教程-1
zookeeper深入学习
zookeeper用户指令
flume配置深入
flume部署方式
memcached 3 深入分析
memcached集群安装和命令的使用
flume自定义开发
flume部署方式
storm深入学习-2
Storm 集群安装视频教程-1
zookeeper开发及总结
zookeeper用户指令
memcached 4 分布式集群开发案例
memcached集群安装和命令的使用
storm深入学习-3
Storm 集群安装视频教程-1
zookeeper开发案例
zookeeper用户指令
/flume配置案例
flume部署方式
flume自定义开发案例
flume部署方式
968 人观看
430 人观看
1567 人观看
1198 人观看
269 人观看
2628 人观看
506 人观看
428 人观看
369 人观看
319 人观看
227 人观看
2628 人观看
369 人观看
o Storm优势 ? 1. 简单的编程模型。类似于MapReduce降低了并行批处 理复杂性,Storm降低了进行实时处理的复杂性。 ? 2. 服务化,一个服务框架,支持热部署,即时上线或下线App. ? 3. 可以使用各种编程语言。你可以在Storm之上使用各种 编程语言。默认支持Clojure、Java、Ruby和Python。要 增加对其他语言的支持,只需实现一个简单的Storm通信 协议即可。 ? 4. 容错性。Storm会管理工作进程和节点的故障。 ? 5. 水平扩展。计算是在多个线程、进程和
一直以来都想接触Storm实时计算这块的东西,最近在群里看到上海一哥们罗宝写的Flume+Kafka+Storm的实时日志流系统的搭建文档,自己也跟着整了一遍,之前罗宝的文章中有一些要注意点没提到的,以后一些写错的点,在这边我会做修正;内容应该说绝大部分引用罗宝的文章的,这里要谢谢罗宝兄弟,还有写这篇文章@晨色星空J2EE也给了我很大帮助,这里也谢谢@晨色星空J2EE之前在弄这个的时候,跟群里的一些人讨论过,有的人说,直接用storm不就可以做实时处理了,用不着那么麻烦;其实不然,做软件开发的都知道模块化什么样的场景下需要同时使用Redis和Memcached_百度知道
什么样的场景下需要同时使用Redis和Memcached
提问者采纳
memcache只能存键值对,雷雪松的个人博客,存储的数据比较复杂的比如对象什么的,参考,memcache和redis都能满实现的选择memcache如果业务比较简单的首选memcahce,使用redis。希望可以帮助你:PHP程序员。memcache不能实现的使用redis
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁展开微博窗口
微信:biaodianfu
展开分类目录
标点符(钱魏 Way)
Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较:
Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。
内存使用效率对比:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。
性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。
具体为什么会出现上面的结论,以下为收集到的资料:
1、数据类型支持不同
与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多。最为常用的数据类型主要由五种:String、Hash、List、Set和Sorted Set。Redis内部使用一个redisObject对象来表示所有的key和value。redisObject最主要的信息如图所示:
type代表一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式,比如:type=string代表value存储的是一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际redis内部是按数值型类存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比如:+ 这样的字符串。只有打开了Redis的虚拟内存功能,vm字段字段才会真正的分配内存,该功能默认是关闭状态的。
常用命令:set/get/decr/incr/mget等;
应用场景:String是最常用的一种数据类型,普通的key/value存储都可以归为此类;
实现方式:String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr、decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。
常用命令:hget/hset/hgetall等
应用场景:我们要存储一个用户信息对象数据,其中包括用户ID、用户姓名、年龄和生日,通过用户ID我们希望获取该用户的姓名或者年龄或者生日;
实现方式:Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口。如图所示,Key是用户ID, value是一个Map。这个Map的key是成员的属性名,value是属性值。这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据。当前HashMap的实现有两种方式:当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
常用命令:lpush/rpush/lpop/rpop/lrange等;
应用场景:Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现;
实现方式:Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。
常用命令:sadd/spop/smembers/sunion等;
应用场景:Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的;
实现方式:set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
5)Sorted Set
常用命令:zadd/zrange/zrem/zcard等;
应用场景:Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
实现方式:Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
2、内存管理机制不同
在Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘。Redis只会缓存所有的key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,Redis根据“swappability = age*log(size_in_memory)”计算出哪些key对应的value需要swap到磁盘。然后再将这些key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得Redis可以保持超过其机器本身内存大小的数据。当然,机器本身的内存必须要能够保持所有的key,毕竟这些数据是不会进行swap操作的。同时由于Redis将内存中的数据swap到磁盘中的时候,提供服务的主线程和进行swap操作的子线程会共享这部分内存,所以如果更新需要swap的数据,Redis将阻塞这个操作,直到子线程完成swap操作后才可以进行修改。当从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就需要从swap文件中加载相应数据,然后再返回给请求方。 这里就存在一个I/O线程池的问题。在默认的情况下,Redis会出现阻塞,即完成所有的swap文件加载后才会相应。这种策略在客户端的数量较小,进行批量操作的时候比较合适。但是如果将Redis应用在一个大型的网站应用程序中,这显然是无法满足大并发的情况的。所以Redis运行我们设置I/O线程池的大小,对需要从swap文件中加载相应数据的读取请求进行并发操作,减少阻塞的时间。
对于像Redis和Memcached这种基于内存的数据库系统来说,内存管理的效率高低是影响系统性能的关键因素。传统C语言中的malloc/free函数是最常用的分配和释放内存的方法,但是这种方法存在着很大的缺陷:首先,对于开发人员来说不匹配的malloc和free容易造成内存泄露;其次频繁调用会造成大量内存碎片无法回收重新利用,降低内存利用率;最后作为系统调用,其系统开销远远大于一般函数调用。所以,为了提高内存的管理效率,高效的内存管理方案都不会直接使用malloc/free调用。Redis和Memcached均使用了自身设计的内存管理机制,但是实现方法存在很大的差异,下面将会对两者的内存管理机制分别进行介绍。
Memcached默认使用Slab Allocation机制管理内存,其主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。Slab Allocation机制只为存储外部数据而设计,也就是说所有的key-value数据都存储在Slab Allocation系统里,而Memcached的其它内存请求则通过普通的malloc/free来申请,因为这些请求的数量和频率决定了它们不会对整个系统的性能造成影响Slab Allocation的原理相当简单。 如图所示,它首先从操作系统申请一大块内存,并将其分割成各种尺寸的块Chunk,并把尺寸相同的块分成组Slab Class。其中,Chunk就是用来存储key-value数据的最小单位。每个Slab Class的大小,可以在Memcached启动的时候通过制定Growth Factor来控制。假定图中Growth Factor的取值为1.25,如果第一组Chunk的大小为88个字节,第二组Chunk的大小就为112个字节,依此类推。
当Memcached接收到客户端发送过来的数据时首先会根据收到数据的大小选择一个最合适的Slab Class,然后通过查询Memcached保存着的该Slab Class内空闲Chunk的列表就可以找到一个可用于存储数据的Chunk。当一条数据库过期或者丢弃时,该记录所占用的Chunk就可以回收,重新添加到空闲列表中。从以上过程我们可以看出Memcached的内存管理制效率高,而且不会造成内存碎片,但是它最大的缺点就是会导致空间浪费。因为每个Chunk都分配了特定长度的内存空间,所以变长数据无法充分利用这些空间。如图 所示,将100个字节的数据缓存到128个字节的Chunk中,剩余的28个字节就浪费掉了。
Redis的内存管理主要通过源码中zmalloc.h和zmalloc.c两个文件来实现的。Redis为了方便内存的管理,在分配一块内存之后,会将这块内存的大小存入内存块的头部。如图所示,real_ptr是redis调用malloc后返回的指针。redis将内存块的大小size存入头部,size所占据的内存大小是已知的,为size_t类型的长度,然后返回ret_ptr。当需要释放内存的时候,ret_ptr被传给内存管理程序。通过ret_ptr,程序可以很容易的算出real_ptr的值,然后将real_ptr传给free释放内存。
Redis通过定义一个数组来记录所有的内存分配情况,这个数组的长度为ZMALLOC_MAX_ALLOC_STAT。数组的每一个元素代表当前程序所分配的内存块的个数,且内存块的大小为该元素的下标。在源码中,这个数组为zmalloc_allocations。zmalloc_allocations[16]代表已经分配的长度为16bytes的内存块的个数。zmalloc.c中有一个静态变量used_memory用来记录当前分配的内存总大小。所以,总的来看,Redis采用的是包装的mallc/free,相较于Memcached的内存管理方法来说,要简单很多。
3、数据持久化支持
Redis虽然是基于内存的存储系统,但是它本身是支持内存数据的持久化的,而且提供两种主要的持久化策略:RDB快照和AOF日志。而memcached是不支持数据持久化操作的。
1)RDB快照
Redis支持将当前数据的快照存成一个数据文件的持久化机制,即RDB快照。但是一个持续写入的数据库如何生成快照呢?Redis借助了fork命令的copy on write机制。在生成快照时,将当前进程fork出一个子进程,然后在子进程中循环所有的数据,将数据写成为RDB文件。我们可以通过Redis的save指令来配置RDB快照生成的时机,比如配置10分钟就生成快照,也可以配置有1000次写入就生成快照,也可以多个规则一起实施。这些规则的定义就在Redis的配置文件中,你也可以通过Redis的CONFIG SET命令在Redis运行时设置规则,不需要重启Redis。
Redis的RDB文件不会坏掉,因为其写操作是在一个新进程中进行的,当生成一个新的RDB文件时,Redis生成的子进程会先将数据写到一个临时文件中,然后通过原子性rename系统调用将临时文件重命名为RDB文件,这样在任何时候出现故障,Redis的RDB文件都总是可用的。同时,Redis的RDB文件也是Redis主从同步内部实现中的一环。RDB有他的不足,就是一旦数据库出现问题,那么我们的RDB文件中保存的数据并不是全新的,从上次RDB文件生成到Redis停机这段时间的数据全部丢掉了。在某些业务下,这是可以忍受的。
2)AOF日志
AOF日志的全称是append only file,它是一个追加写入的日志文件。与一般数据库的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更偏向于在服务器端构建分布式存储。最新版本的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节点。
参考资料:
分享到: ()

我要回帖

更多关于 memcached redis 场景 的文章

 

随机推荐