STSdb數據庫的實現使用類

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

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章