我是靠谱客的博主 英勇魔镜,最近开发中收集的这篇文章主要介绍Tair存储引擎简单介绍以及常见API操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、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
}
  1. Tair实现乐观锁
    trylock(获取版本)–> transaction –> unlock(版本检查) — 正常—> version+1 commit— 异常—> rollback
  • 只要能获取版本,就认为trylock成功
  • 版本检查则更新version,一般是加1;否则,异常处理,version不变,并开启回滚
  • 多事务同时获得乐观锁时,unlock只能有一个成功,其余的都应该失败

version 初始化要大于1

  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操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部