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