kvdb

g類型kv.set("lon g)kv.set("in t(kv.get("in

簡介

KVDB是 新浪SAE開發的分散式key-value數據存儲服務,用來支持公有 雲計算平台上的海量key-value存儲。KV DB支持的存儲容量很大,對每個用戶支持100G的存儲空間,可支持1,000,000,000條記錄,用戶可以用KV DB存放簡單數據,如好友關係等。
因為傳統關係型資料庫在分散式環境下表現的擴展性不足等缺點,近年來 NoSQL的概念漸漸成為業界關注的焦點,越來越多的技術人員也習慣於使用NoSQL資料庫進行日常開發,SAE為了應對這種新需求,也進行了NoSQL方向的研發。
KVDB是高性能高可靠存儲,根據我們內部測試,讀寫都可以達到10w qps。KV DB採用一主多從的分散式架構,SAE提供熱備和定期冷備,發生宕機時,會自動切換到健康的DB上。
KVDB的使用非常方便,用戶在使用時,只需要先調用init()函式,就可以調用KV的各種讀寫函式,值得一提的是,因為KV DB的實際存儲選擇用B+樹實現,所以KV DB還支持前綴查找。

計費說明

數據存儲:5雲豆/GB·天,即0.05元/GB·天
請求數:0.5雲豆/萬次,及0.005元/萬次

服務限制

key的最大長度:200位元組
value的最大長度:4M (默認啟用壓縮)
mget獲取的最大KEY個數:32
pkrget獲取的最大KEY個數:100

PHP調用方式

開啟

開發者在登錄SAE後,在右上角我的套用中選中指定套用後,點擊開啟服務即可

關閉

開發者在登錄SAE後,選中套用後,點擊禁用服務即可,特別注意,禁用後會清除所有數據,請謹慎操作

使用

KV DB的使用和MemcacheX的使用方式幾乎一樣,先init()後即可操作KV函式,示例:
$kv = new SaeKV();
// 初始化KV對象
$ret = $kv->init();
if($ret==true)
{
for($i=0;$iset($i, 'aaaaaa');
var_dump($ret);
}
}
KV DB現支持以下操作:
get 按key讀取
mget 按key批量讀取
pkrget 按key前綴查找
set 更新
delete 刪除

注意事項

目前默認使用urlencode來編碼key,之前採用其他編碼方式以中文作為key的用戶,可以通過SaeKV::get_options/SaeKV::set_options來獲取和設定是否編碼key,以禁用key編碼的方式來解決無法get中文key的問題。
代碼示例:
$flags = $kv->get_options();
$kv->set_options($flags & ~SaeKV::OPT_ENCODEKEY);

Java調用方式

如何啟用服務

套用使用KVDB服務需要在套用的KVDB管理界面中開啟服務,之後再代碼中參照API接口文檔調用即可。如果你需要關閉KVDB服務,在面板中點擊禁用服務即可,你需要特別注意的是禁用後會清空KVDB中的所有數據,請謹慎操作。

本地環境使用

本地開發環境的KVDB服務採用JavaDB進行模擬,你僅需將derby.jar(在下載中心可下載)放入工程的classpath中即可使用。另外由於本地環境只是模擬環境,所以效率達不到線上環境真實服務速度。

支持數據類型

KVDB支持boolean,long,double,byte[]四種基本類型直接存取操作,當然你也可以存取其他數據類型(short、float、int)或是對象(String和自定義對象等),但是你需要將數據類型做適當的轉換。API中提供了SaeKVUtil工具類,可以幫你簡化數據類型轉換的操作,詳情請看下文的使用範例。

使用範例

對KVDB所有操作都封裝在SaeKV類中,當然存儲對象等類型時你可以使用SaeKVUtil進行類型轉換。在調用KVDB操作前你需要先初始化服務,即需先調用SaeKV的init()方法,需要注意的是你必須基於請求來執行初始化操作。
SaeKV kv=new SaeKV();
//初始化服務
kv.init();
基本數據類型存存取
//存取long類型
kv.set("longValue", 65535L);
kv.get("longValue");
//存取boolean類型
kv.set("boolean", true);
kv.get("boolean");
//存取double類型
kv.set("doubleValue",1.24);
kv.get("doubleValue");
//存取byte[]類型
kv.set("bytes",new byte[]{1,2});
byte [] b = kv.get("bytes");
//存取int類型(需轉換成long)
kv.set("intValue", SaeKVUtil.intToLong(123));
SaeKVUtil.longToInt(kv.get("intValue"));
//存取float類型
kv.set("floatValue",1.24f);
kv.get("floatValue");
//存取short類型
kv.set("shortValue",(short)1);
SaeKVUtil.longToShort(kv.get("shortValue"))

String類型存取

存取String有兩種方法,一種是使用SaeKVUtil的StringToByte方法將String轉換成byte[]進行存儲,再用SaeKVUtil的byteToString方法取出byte[]進行轉換。第二種方法是將String看做是可序列化的對象,和普通對象一樣存取。
//存取String類型 注意這裡StringToByte返回的是String的getBytes()值,並非序列化後的byte[]
kv.set("string", SaeKVUtil.StringToByte("abc"));
SaeKVUtil.byteToString((byte[])kv.get("string"));
//第二種存儲方式 把String當做可序列化對象來存儲區
kv.set("string1", SaeKVUtil.serializable("abc"));
SaeKVUtil.deserializable((byte[])kv.get("string1"));

對象類型存取

這裡需要特別注意的是,只有可序列化的對象(實現Serializable接口)才能存儲到kvdb中
//存取對象類型 Person實現Serializable接口
kv.set("person", SaeKVUtil.serializable(new Person(1,"ward")));
SaeKVUtil.deserializable(kv.get("person"));
範圍查找
範圍查找是根據key的範圍來查找對應的值,返回值類型為Map
/*
* startKey - 範圍查找起始的key
* endKey - 範圍查找結束的key
* isContainStartVlaue - 是否包含第一個查到的key
* isContainEndValue - 是否包含最後一個查到的key
* queryCount 查詢的數量
*/
kv.rget("a","d",true,true,5)
//當然你也可以用簡化的方法
kv.rget("a","d");
前綴查找
前綴查找可根據key值的前綴來過濾查找數據,返回值類型為Map
/**
* key前綴
* 查詢數量,最多支持100個,如果超過100個只按100個查詢
* 是否包含查找的值,如果設定此值為false,則返回的map中所有的value都為null
* 需要比較的key,如果存儲的key為test1,test2,test3,test4,輸入test2,則返回的test3和test4
*/
kv.pkrget("test",100,true,"test1");
//簡化方法
kv.pkrget("test","test1");
查找多個key的值
可獲取多個key值(String數組)的Value對應關係,返回值類型為Map
//key值數量必須小於32
kv.getMulti(new String[]{"test1","test2"});
範圍刪除
根據key值範圍範圍刪除,和範圍查找相視
/**
* startKey 起始的key
* endKey 結束的key
* isContainStartVlaue 是否包含第一個查到的key
* isContainEndValue 是否包含最後一個查到的key
* deleteCount 刪除的數量
* @return 刪除操作是否成功
*/
kv.rdel("a","d",true,true,3);
//同樣也可以使用簡便的方法
kv.rdel("a","d");

Python調用方式

KVDB服務使用前需要在 管理面板 中啟用,不再使用時可以在面板中禁用,禁用會刪除所有數據。
class sae.kvdb.Error
通用錯誤
class sae.kvdb.RouterError
路由meta信息錯誤
class sae.kvdb.StatusError
kvdb狀態不為OK
class sae.kvdb.KVClient(debug=0)
KVDB客戶端基於python-memcached,大多數method使用方法相同。 如果不能成功創建KVClient,則拋出 sae.kvdb.Error 異常。
debug 是否輸出詳細調試、錯誤信息到日誌,默認關閉
set(key, val, time=0, min_compress_len=0)
設定key的值為val,成功則返回True
time 該key的逾時時間,請參閱memcached協定Storage 。
min_compress_len 啟用zlib.compress壓縮val的最小長度,如果val的長度大於此值 則啟用壓縮,0表示不壓縮。
add(key, val, time=0, min_compress_len=0)
同set,但只在key不存在時起作用
replace(key, val, time=0, min_compress_len=0)
同set,但只在key存在時起作用
delete(key, time=0)
刪除key,成功返回1,失敗返回0。
time 為後續多少秒內set/update操作會失敗。
get(key)
從kvdb中獲取一個key的值。成功返回key的值,失敗則返回None
get_multi(keys, key_prefix="")
從kvdb中一次獲取多個key的值。返回一個key/value的dict。
keys: key的列表,類型必須為list。
key_prefix: 所有key的前綴。請求時會在所有的key前面加上該前綴,返回值里所有的key都會去掉該前綴。
get_by_prefix(prefix, max_count=100, start_key=None)
從kvdb中查找指定前綴的 key/value pair。返回一個list,該list中每個item為一個(key, value)的tuple。
prefix: 需要查找的key的前綴。
max_count: 最多返回的item個數,默認為100。
start_key: 指定返回的第一個item的key,該key不包含在返回中。
getkeys_by_prefix(prefix, max_count=100, start_key=None)
從kvdb中查找指定前綴的key。返回符合條件的key的list。
prefix: 需要查找的key的前綴。
max_count: 最多返回的key的個數,默認為100。
start_key: 指定返回的第一個key,該key不包含在返回中。
get_info()
獲取本套用kvdb統計數據,返回一個字典:
{
'outbytes': 126,
'total_size': 3,
'inbytes': 180,
'set_count': 60,
'delete_count': 21,
'total_count': 1,
'get_count': 42
}
disconnect_all()

關閉kvdb連線

示例代碼:
import sae.kvdb
kv = sae.kvdb.KVClient()
k = 'foo'
kv.set(k, 2)
kv.delete(k)
kv.add(k, 3)
kv.get(k)
kv.replace(k, 4)
kv.get(k)
print kv.get_info()

服務限制

存儲空間:100G
最大記錄條數:1,000,000,000
key的最大長度:200 Bytes
value的最大長度:4M
get_multi獲取的最大KEY個數:32

相關詞條

熱門詞條

聯絡我們