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);
}