美文网首页http我爱编程
Memcache & Redis & Tair

Memcache & Redis & Tair

作者: 慕子昂 | 来源:发表于2017-04-13 11:44 被阅读0次

    一、前言

    非关系型数据库(NoSQL = Not Only SQL)的产品非常多,常见的有Memcached、Redis、MongoDB等优秀开源项目,相关概念和资料网上也非常丰富,不再重复描述.

    Memcache:

    1.  Memcache 只支持简单的k/v结构的数据。

    2.  Memcache不支持枚举,不支持持久化和复制等功能

    3.Memcache是多线程的,在多核上能线性扩展到每秒处理100,000个请求

    4.Memcache提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题

    5.    Memcache 的数据都存储 内存中 所以它根本不会有磁盘I/O操作。

    6.Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除

    新的数据也可能会被剔除,原因可以参考:http://timyang.NET/data/Memcached-lru-evictions/

    Redis:

    1.Redis支持多种类型数据 k/v  ,list,set,zset,hash等数据结构的存储 还提供了KEYS。

    2.   Redis支持数据的备份,即master-slave模式的数据备份

    3.   Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用

    4.   Redis并不是所有的数据都一直存储在内存中的,Redis只会缓存所有的 key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,Redis根据“swappability = age*log(size_in_memory)”计 算出哪些key对应的value需要swap到磁盘。然后再将这些key对应的value持久化到磁盘中,同时在内存中清除.

    5.   从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就需要从swap文件中加载相应数据,然后再返回给请求方。

    6.  Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断

    7.  Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache。

    8.  Redis除了作为存储之外还提供了一些其它方面的功能,比如聚合计算、pubsub(消息,发布者和监听者)、scripting等。

    总结:

    1.Redis使用最佳方式是全部数据in-memory。

    2.Redis更多场景是作为Memcached的替代者来使用。

    3.当需要除key/value之外的更多数据类型支持时,使用Redis更合适。

    4.当存储的数据不能被剔除时,使用Redis更合适。

    Tair :

    1.tair 基于redis

    2.一个Tair集群主要包括3个必选模块:configserver、dataserver和client,一个可选模块:invalidserver。通常情况下,一个集群中包含2台configserver及多台dataServer。

    两台configserver互为主备并通过维护和dataserver之间的心跳获知集群中存活可用的dataserver,构建数据在集群中的分布信息(对照表)。dataserver负责数据的存储,并按照configserver的指示完成数据的复制和迁移工作

    3.支持redis的内存存储结构。支持k/v,list,hash,set等数据结构

    ConfigServer的功能

    1) 通过维护和dataserver心跳来获知集群中存活节点的信息

    2) 根据存活节点的信息来构建数据在集群中的分布表。

    3) 提供数据分布表的查询服务。

    4) 调度dataserver之间的数据迁移、复制。

    1.1.2 DataServer的功能

    1) 提供存储引擎

    2) 接受client的put/get/remove等操作

    3) 执行数据迁移,复制等

    4) 插件:在接受请求的时候处理一些自定义功能

    5) 访问统计

    1.1.3 InvalidServer的功能

    1) 接收来自client的invalid/hide等请求后,对属于同一组的集群(双机房独立集群部署方式)做delete/hide操作,保证同一组集群的一致。

    2) 集群断网之后的,脏数据清理。

    3) 访问统计。

    1.1.4 client的功能

    1) 在应用端提供访问Tair集群的接口。

    2) 更新并缓存数据分布表和invalidserver地址等。

    3) LocalCache,避免过热数据访问影响tair集群服务。

    4) 流控

    2.1.1 Tair缓存使用的场景

    1. 数据可以以key/value的形式存储

    2. 数据可以接受丢失

    3. 访问速度要求很高

    4. 单个数据大小不是很大,一般在KB级别

    5. 数据量很大,并且有较大的增长可能性

    6. 数据更新不频繁

    2.1.2 Tair持久化适用的场景

    1. 数据可以以key/value的形式存储

    2. 数据需要持久化

    3. 数据量很大,并且有较大的增长可能性

    4. 单个数据大小不是很大,一般在KB级别

    5. 数据的读写比例较高

    2.2 不适Tair用的场景

    1.对数据有查询需求,比如对key的模糊查询,或者根据value反查询key等

    2.单条数据很大

    3.读写比例很低

    5.1 tair优势

    a.在分布式集群支持方面tair支持副本,支持多种集群结构,如:一机房一个集群、双     机房单集群单份、双机房独立集群、双机房单集群双份、双机房主备集群;

    b.对于读写性能根据结点添加对线性上升,原因是各个结点之间是没有关系,节点增多相应性能提升。

    c.高可用比较强,任何小于副本数结点挂掉,不会影响正常业务。

    e.淘宝在多个实际应用场景应用,满足不同业务需求。

    F.支持跨机房数据分布。

    5.2 tair弱势

    a.在单节点的性能比较方面,redis是性能比tair高大概1/5

    b.redis目前研究人员比较少,社区不是很活跃。

    5.3 redis优势

    a.在单节点的性能比较方面,redis是性能比tair高大概1/5

    b.redis目前研究人员比较多,社区比较活跃。

    c.在支持多种数据结构方面tair没有redis支持的全面。

    5.4 redis弱势

    a.目前发布版不支持分布式,测试版支持,测试版对分布式支持比较弱,是用主备支持高可能,没有副本。

    b.容灾性相比tair弱,原因是redis的分布式不支持多副本。

    相关文章

      网友评论

        本文标题:Memcache & Redis & Tair

        本文链接:https://www.haomeiwen.com/subject/vmkbattx.html