ttserver是一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley DB 等 DBM 的几倍。利用Tokyo Tyrant构建兼容Memcached协议、支持故障转移、高并发的分布式key-value持久存储系统。key-value分布式存储系统查询速度快、存放数据量大、支持高并发,非常适合通过主键进行查询,但不能进行复杂的条件查询。
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.io.ClassPathResource;
import tokyotyrant.MRDB;
import tokyotyrant.networking.NodeAddress;
import tokyotyrant.transcoder.StringTranscoder;
/**
* 和ttServer服务端连接的工具类
* 使用jar包:tokyotyrant-0.11.jar
* @author 7q
*/
public class TokyoTyrantDB {
private static TokyoTyrantDB db = new TokyoTyrantDB();
//默认值
private String IP = "127.0.0.1";
private String PORT = "8888";
MRDB rdb = null;
private Log logger = LogFactory.getLog(TokyoTyrantDB.class);
/**
* 创建对象的时候,加载配置文件,创建和ttServer服务器的连接
*/
private TokyoTyrantDB() {
try {
/*
* 读取配置文件(配置文件放在src下,或者放在src下的META-INF文件夹下,没有这个文件夹可以创建一个)
* ip=192.168.0.100
* port=99
*/
ClassPathResource resource = new ClassPathResource("tt.properties");
Properties properties = new Properties();
properties.load(resource.getInputStream());
if (properties.getProperty("ip") != null) {
IP = properties.getProperty("ip");
}
//System.out.println(IP);
if (properties.getProperty("port") != null) {
PORT = properties.getProperty("port");
}
//System.out.println(PORT);
rdb = new MRDB();
//创建连接
rdb.open(NodeAddress.addresses("tcp://" + IP + ":" + PORT));
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
public static TokyoTyrantDB getInstance() {
return db;
}
/**
* 保存数据到ttServer
* @param key
* @param value
* @return 保存成功,返回true,保存失败,返回false
*/
public boolean save(String key, String value) {
try {
if (rdb.put(key, value).get()) {
return true;
} else {
return false;
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
//如果保存数据出异常,重试再连接一次
try {
if (rdb == null) {
rdb = new MRDB();
rdb.open(NodeAddress.addresses("tcp://" + IP + ":" + PORT));
}
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
return false;
}
}
/**
* 通过key获取value
* @param key
* @return 通过key获取value
*/
public String getValueByKey(String key) {
try {
Object object = rdb.get(key, new StringTranscoder()).get();
if (object != null) {
return object.toString();
}
return null;
} catch (Exception e) {
logger.error(e.getMessage(), e);
try {
if (rdb == null) {
rdb = new MRDB();
rdb.open(NodeAddress.addresses("tcp://" + IP + ":" + PORT));
}
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
return null;
}
}
}
使用方式:
public static void main(String[] args) {
TokyoTyrantDB.getInstance().save(key, value);
TokyoTyrantDB.getInstance().getValueByKey(key);
}