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的緩存實現、支持非持久化和持久化緩存數據 |