Memcache & Redis & Tair

一、前言

非关系型数据库(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的分布式不支持多副本。

    原文作者:慕子昂
    原文地址: https://www.jianshu.com/p/ae6ab62146e1
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞