概述
一、Tair存储引擎
Tair的存储引擎有一个抽象层(storage_manager),只要实现存储引擎接口,便可以替换Tair的底层存储引擎。
可插拔存储引擎—类似MySQL
Tair默认包含四种存储引擎:mdb、fdb、kdb和ldb
1、mdb
数据存储:Memcached
高效缓存存储
使用share memory ,重启不会数据丢失
支持K-V存储、prefix操作
适用于:String缓存使用 (json)、大访问少量的临时数据存储、Session分离
2、fdb
数据存储:FireBird
高效的持久化SQL存储
索引文件和数据文件分离------>mysql MyISam
使用Tree的方式根据key的hash值索引数据 B tree
索引文件在内存中
适用于:快速访问较小的数据
3、kdb
数据存储:Kyoto Cabinet
Cabinet开发的KV的持久化存储
简单的包含记录的数据文件
存储形式为hash表或B+Tree
适用于:简单临时存储
4、ldb
数据存储:LevelDB
是Google开发的高性能持久化KV存储
可内嵌mdb缓存 mdb+ldb
支持kv、prefix
支持批量操作
适用于:大数据量的存取(交易快照)、高频度的更新(库存)、离线大批量数据导入
5、rdb
数据存储:Redis
高效缓存存储
多种数据结构和计算
适用于:复杂数据结构存储、商品属性、粉丝列表、商品评论、消息队列
阿里使用:mdb、rdb、ldb
mdb的存储结构(Memcached)
- mem_pool
用于共享内存管理,将内存分为若干个page
page个数根据slab_mem_size设置,单位为MB
单个DataServer最多使用64G内存 - mem_cache
用于管理slab,存放slab_manager列表
slab_manager管理item(数据块)
slab个数为100,一个slab可存储800kb - cache_hash_map
用于存储hash表,根据key进行hash对应item数据
hash冲突,产生链表 - mdb_area_stat
用于维护area(namespace)状态,记录了该area的数据链表和数据量限制(tablespace)
二、Tair相应API
1、key/value常见操作API
2、version
Tair中的每个数据都包含版本号,版本号在每次更新后都会递增。这个特性有助于防止由于数据的并发更新导致的问题,类似于乐观锁
比如,系统有一个value为“a”,A和B同时get到这个value。
A执行操作改为"b"
B执行操作改为"c"
如果不控制,无论A和B谁先更新成功,它的更新都会被后到的更新覆盖。
使用version解决
第一次put version为1
get version为1
A修改成功后 version增加1
B修改时本身version为1,小于服务器版本2
所以B修改不成功
在put时,version传0 可强制修改
struct mdb_item{
uint64_t item_id;
.....
uint16_t version
}
- Tair实现乐观锁
trylock(获取版本)–> transaction –> unlock(版本检查) — 正常—> version+1 commit— 异常—> rollback
- 只要能获取版本,就认为trylock成功
- 版本检查则更新version,一般是加1;否则,异常处理,version不变,并开启回滚
- 多事务同时获得乐观锁时,unlock只能有一个成功,其余的都应该失败
version 初始化要大于1
- Tair实现分布式锁
利用 Tair 的 version 特性可以实现分布式锁,由于 LDB 具有持久化功能,当服务有出现宕机的情况,也不会因此出现锁丢失或者锁不可释放的情况。
如果KEY不存在的话,传入一个固定的初始化VERSION(需要大于1),Tair会在保存这个缓存的同时设置这个缓存的VERSION为你传入的 VERSION+1
KEY如果已经存在,Tair会校验你传入的VERSION是否等于现在这个缓存的VERSION,如果相等则允许修改,否则将失败。
//获得锁
public boolean lock(String lockKey) {
//10 :version expiretime : 过期时间 秒
ResultCode code = defaultTairManager.put(lockKey, defaultVlaue, 5,
expiretime);
if (ResultCode.SUCCESS.equals(code))
return true;
else
return false;
}
//释放锁
public Boolean unlock(String lockKey){
ResultCode code = defaultTairManager.delete(lockKey);
return ResultCode.SUCCESS.equals(code);
}
3、Java Client
pom.xml
<!-- https://mvnrepository.com/artifact/com.taobao.tair/tair-client -->
<dependency>
<groupId>com.taobao.tair</groupId>
<artifactId>tair-client</artifactId>
<version>2.3.5</version>
</dependency>
demo
DefaultTairManager defaultTairManager = new DefaultTairManager();
List<String> cs = new ArrayList<String>();
cs.add("192.168.127.132:5198");
defaultTairManager.setConfigServerList(cs);
defaultTairManager.setGroupName("group_1");
defaultTairManager.init();
defaultTairManager.put(0,"name:001","zhangfei");
Result<DataEntry> value= defaultTairManager.get(0,"name:001");
System.out.println(value);
//设置版本0 强制更新 过期时间2秒
defaultTairManager.put(0,"name:002","zhaoy",0,2);
Result<DataEntry> value2= defaultTairManager.get(0,"name:002");
System.out.println(value2);
Tair
机房、负载均衡、数据迁移、不停止服务
更好的可用性和负载均衡
Redis
多数据结构处理、计算
Tair+Redis
最后
以上就是英勇魔镜为你收集整理的Tair存储引擎简单介绍以及常见API操作的全部内容,希望文章能够帮你解决Tair存储引擎简单介绍以及常见API操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复