STSdb 3.5是一個開源的key-value存儲形式的數據庫,它是用微軟.net框架C#語言編寫的。STSdb 3.5尤其使用於緊急任務或實時系統,如:股市交易,電子通信,實驗室數據等,它的主要功能是能夠處理大量數據流。
下面用C#對stsdb3.5進行簡單封裝,使之可以實現數據的簡單CURD功能。
需要用到的依賴包:
stsdb3.5 http://stssoft.com/downloads/
Newtonsoft.JSON https://www.newtonsoft.com/json
先實現一個數據保存類對象, 該對象可以有判斷數據是否超時的功能,在必要的時候可以用到:
/// <summary> /// STSdb3的數據對象 /// </summary> /// <typeparam name="T"></typeparam> class Stsdb3Data<T> { /// <summary> /// 唯一標識,不能爲空 /// </summary> public string Key { get; set; } /// <summary> /// 數據值 /// </summary> public T Value { get; set; } private DateTime _dtc = DateTime.Now; /// <summary> /// 構造時間 /// </summary> public DateTime dtc { get{return _dtc;} set{_dtc =value;} } private int _expiry = 0; /// <summary> /// 超時時間(秒), 默認0永不超時 /// </summary> public int expiry{ get {return _expiry;} set {_expiry = value;} } /// <summary> /// 構造函數 /// </summary> public Stsdb3Data() { } /// <summary> /// 構造函數,提供默認值 /// </summary> /// <param name="Value"></param> public Stsdb3Data(T Value) { this.Value = Value; } /// <summary> /// 判斷是否已經超時 /// </summary> /// <returns></returns> public bool IsExpired() { if ( this.expiry<=0 ) { return false; } return (DateTime.Now - this.dtc).Seconds > this.expiry; } }
操作服務類Service:
/// <summary> /// STSdb3本地NoSQL數據庫實現類 /// <para>author: lcs [email protected]</para> /// </summary> public class Stsdb3Service { public static string dbpath { get; set; } public Stsdb3Service() { if (string.IsNullOrEmpty(dbpath)) { dbpath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + @"\vs2008\stsdb3.dat"; } } /// <summary> /// 保存數據對象 /// </summary> /// <typeparam name="T">數據對象包含的數據</typeparam> /// <param name="key"></param> /// <param name="data">數據對象</param> /// <param name="tabname">保存表名</param> /// <param name="expiry">超時時長(秒)</param> public void Put<T>(string key, T t, string tabname, int expiry) { using (StorageEngine engine = StorageEngine.FromFile(dbpath)) { var locator = new Locator(tabname); var table = engine.Scheme.CreateOrOpenXTable<string, string>(locator); var data = new Stsdb3Data<T>() { Key=key,Value=t,expiry=expiry}; table[key] = JsonConvert.SerializeObject(data); table.Commit(); engine.Scheme.Commit(); table.Close(); engine.Dispose(); } } /// <summary> /// 保存數據對象 /// </summary> /// <typeparam name="T">數據對象包含的數據</typeparam> /// <param name="key"></param> /// <param name="t">數據對象</param> /// <param name="tabname">保存表名</param> public void Put<T>(string key, T t, string tabname) { Put<T>(key, t, tabname, 0); } /// <summary> /// 獲取數據 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="tabname"></param> /// <returns></returns> public T Get<T>(string key, string tabname) { string json = string.Empty; T rest = default(T); using (StorageEngine engine = StorageEngine.FromFile(dbpath)) { var locator = new Locator(tabname); var table = engine.Scheme.CreateOrOpenXTable<string, string>(locator); try { var item = table.FirstOrDefault(x => x.Key == key); json = item.Record != null ? item.Record : json; var data = JsonConvert.DeserializeObject<Stsdb3Data<T>>(json); if (data.IsExpired()) { Delete(key, tabname); //刪除無效的歷史數據 } else { rest = data.Value; } } catch { // } table.Close(); engine.Dispose(); } return rest; } /// <summary> /// 刪除數據 /// </summary> /// <param name="key"></param> /// <param name="tabname"></param> public void Delete(string key, string tabname) { using (StorageEngine engine = StorageEngine.FromFile(dbpath)) { var locator = new Locator(tabname); var table = engine.Scheme.CreateOrOpenXTable<string, string>(locator); if (table != null) { table.Delete(key); table.Commit(); table.Close(); } engine.Dispose(); } } }
在以上兩個類都實現後,就可以進行測試了.
測試字符串代碼如下:
// 初始化 Stsdb3Service service = new Stsdb3Service(); // 保存字符串 string key = "vs2008:k001"; string val = "我的數據 vs2008"; string tabname = "vs2008"; service.Put<string>(key, val, tabname); // 讀取保存的字符串 string rest = service.Get<string>(key, tabname); MessageBox.Show("" + rest); //Delete service.Delete(key, tabname); //再次讀取 rest = service.Get<string>(key, tabname); if (rest != null) { MessageBox.Show("" + rest); } else { MessageBox.Show("not any value"); }
測試自定義對象:
Stsdb3Service service = new Stsdb3Service(); //測試對象 string bar = "6912345"; Book book = new Book() { bar = bar, name = "書本名", dtc = DateTime.Now }; string bookTabname = "books"; //保存對象 service.Put<Book>(book.bar, book, bookTabname); // 讀取對象 Book rest = service.Get<Book>(bar, bookTabname); if (rest == null) { MessageBox.Show("rest: no book ..."); } else { MessageBox.Show("rest: book: " + JsonConvert.SerializeObject(rest)); }
補充Book類對象:
public class Book { public string bar { get; set; } public string name { get; set; } public DateTime dtc { get; set; } }