Tair(1):Tair介绍
1 介绍
在Tair出现之前的很长一段时间里,像redis、memcache这些知名NoSql数据库是不支持分布式的,在这样的背景下,由淘宝网自主开发并在2010.6开源的一个高性能、高扩展、高可靠分布式缓存,类似map的key/value结构,在淘宝、天猫等各个应用中广泛应用。
Tair官网:https://www.oschina.net/p/tair
gitee地址:https://gitee.com/mirrors/Tair
github wiki地址:https://github.com/alibaba/tair/wiki
2 概念
- configID:一个Tair集群的唯一标识
- namespace:应用的一个内存或者持久化存储区域,0到65535之间的一个数字
- quta:配额,对应了每个 namespace 储存区的大小限制,超过配额后将使用LRU(最少使用)策略淘汰
- expireTime:数据的过期时间。当超过过期时间之后,数据将对应用不可见,不同的存储引擎有不同的策略清理掉过期的数据
- prefix:前缀处理,保证了拥有相同前缀的key根据哈希算法后,分散在同一个dataserver上,提高了处理速度。
3 特性
Tair实现了集群部署,特性都是一些集群的特性,容错、解决单点故障、跨机房管理、多集群管理、支持副本等。Tair的特性有:
- Namespace
- Expire
- Prefix
- List,zset,hash,set
- LocalCache
- FlowControl
抽象存储层,内部采用MDB、RDB、LDB三中存储引擎满足了各种存储需求。
MDB是内存型,K/V结构,底层是memcache ,由于是内存型性能最高但是不支持持久化。
RDB底层是redis引擎,支持List、Set、Zset、Map、String等多种数据结构,性能略低于MDB。
LDB是持久化型引擎,底层是google的levelDB,K/V结构,性能最低,但是可靠性最高。
4 应用场景
由于Tair底层的MDB、RDB、LDB三种引擎支持,既能作为缓存使用又可以作为持久化存储数据库,命令除了put、get、delete以及批量接口外,还有一些附加的实用功能比如version支持、原子计数器、item支持,可以用于实现分布式锁,队列等。
5 Tair与其他缓存对比
Tair | Redis | Memcache | Ehcache | |
---|---|---|---|---|
是否开源 | 开源 | 开源 | 开源 | 开源 |
使用语言 | 服务器端C++;客户端支持C、JAVA、PHP等 | ANSI C语言编写 ,提供多种语言(C/C++/JAVA/PHP等)的API | 服务端C,客户端支持c、php、java、python等 | java |
集群 | 支持 | 3.0以后支持 | 服务端不支持,客户端使用一致性hash算法将数据分布式存储 | 支持,默认是异步同步 |
容灾 | 支持 | 3.0以后支持 | 可通过客户端实现 | 支持 |
高可用 | 支持 | 3.0以后支持 | 不支持,可通过第三方应用比如magent实现 | 支持 |
动态扩展 | 支持 | 3.0以后支持 | 可通过客户端实现 | 支持,本地存储在.data和.index文件 |
效率 | LDB < RDB < MDB | 高 | 高于redis | 高于memcache |
持久化 | LDB、RDB引擎支持 | 支持(AOF、默认RDB) | 不支持,可通过第三方应用实现 | 支持 |
缓存过期失效策略 | 支持 | 支持 | 支持,lru算法 | 支持,LRU(默认),FIFO,LFU |
数据结构 | K/V、list、hash、set、sortedsort等 | K/V、list、hash、set、sortedsort五种数据结构 | 支持简单的K/V结构 | 支持简单的K/V结构 |
分布式 | 支持 | 3.0以后支持 | 客户端使用一致性hash做分布式 | 支持 |
跨机房管理 | 支持 | 不支持 | 不支持 | 不支持 |
多集群管理 | 支持 | 不支持 | 不支持 | 不支持 |
使用状况 | 只有阿里内部大规模使用 | 普遍使用 | 使用情况较多 | 多用于hibernate的缓存实现 |
缺点 | 文档不全,社区不活跃,单节点上性能没有redis高,不能对key实现模糊查询,单条数据不能太大key建议1k以下,value不能超过1M,建议10k以下 | 3.0以前不支持集群,单线程无法充分利用多核服务器CPU,事务支持较弱,rdb每次都是写全量数据,成本高,aof追加导致log特别大 | 结构单一,数据在内存重启会丢失,数据大小受内存限制 | 结构单一、只适用于java体系,只能用java编写客户端,且使用磁盘做cache时占空间 |
优点 | 采用分布式集群架构,具备自动容灾及故障迁移能力,对存储层做了抽象,底层方便切换不同的存储引擎,采用一致性哈希算法将key分散在Q个桶中,并将桶放到不同的dataserver上,保证数据平衡,tair高可用比较强,容灾性比redis强,支持多种集群结构,支持跨机房数据分布 | 非常丰富的数据结构而且都是原子性操作、高速读写、支持事务,支持aof、rdb两种持久化机制,拥有丰富特性,订阅发布 Pub / Sub 功能、Key 过期策略、事务、支持多个 DB、计数、支持集群和数据备份 | 简洁,灵活,多线程非阻塞io效率高,所有支持多种语言api,且在并发下用cas保证一致性 | 效率高,功能强大,版本迭代特别快、缓存策略支持多种,可以通过rmi可插入api实现分布式缓存、具备缓存监听、支持多缓存实例、提供hibernate的缓存实现、支持非持久化和持久化缓存数据 |