ITPub博客

首页 > 数据库 > > STSdb数据库的实现使用类

STSdb数据库的实现使用类

作者:LCR_ 时间:2022-04-14 10:57:23 0 删除 编辑

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

 

先实现一个数据保存类对象, 该对象可以有判断数据是否超时的功能,在必要的时候可以用到:

  1. /// <summary>
  2. /// STSdb3的数据对象
  3. /// </summary>
  4. /// <typeparam name="T"></typeparam>
  5. class Stsdb3Data<T>
  6. {
  7. /// <summary>
  8. /// 唯一标识,不能为空
  9. /// </summary>
  10. public string Key { get; set; }
  11. /// <summary>
  12. /// 数据值
  13. /// </summary>
  14. public T Value { get; set; }
  15. private DateTime _dtc = DateTime.Now;
  16. /// <summary>
  17. /// 构造时间
  18. /// </summary>
  19. public DateTime dtc {
  20. get{return _dtc;}
  21. set{_dtc =value;}
  22. }
  23. private int _expiry = ;
  24. /// <summary>
  25. /// 超时时间(秒), 默认0永不超时
  26. /// </summary>
  27. public int expiry{
  28. get {return _expiry;}
  29. set {_expiry = value;}
  30. }
  31. /// <summary>
  32. /// 构造函数
  33. /// </summary>
  34. public Stsdb3Data()
  35. {
  36. }
  37. /// <summary>
  38. /// 构造函数,提供默认值
  39. /// </summary>
  40. /// <param name="Value"></param>
  41. public Stsdb3Data(T Value)
  42. {
  43. this.Value = Value;
  44. }
  45. /// <summary>
  46. /// 判断是否已经超时
  47. /// </summary>
  48. /// <returns></returns>
  49. public bool IsExpired()
  50. {
  51. if ( this.expiry<= )
  52. {
  53. return false;
  54. }
  55. return (DateTime.Now - this.dtc).Seconds > this.expiry;
  56. }
  57. }

  

操作服务类Service:

  1. /// <summary>
  2. /// STSdb3本地NoSQL数据库实现类
  3. /// <para>author: lcs 1125271180@qq.com</para>
  4. /// </summary>
  5. public class Stsdb3Service
  6. {
  7. public static string dbpath { get; set; }
  8. public Stsdb3Service()
  9. {
  10. if (string.IsNullOrEmpty(dbpath))
  11. {
  12. dbpath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + @"\vs2008\stsdb3.dat";
  13. }
  14. }
  15. /// <summary>
  16. /// 保存数据对象
  17. /// </summary>
  18. /// <typeparam name="T">数据对象包含的数据</typeparam>
  19. /// <param name="key"></param>
  20. /// <param name="data">数据对象</param>
  21. /// <param name="tabname">保存表名</param>
  22. /// <param name="expiry">超时时长(秒)</param>
  23. public void Put<T>(string key, T t, string tabname, int expiry)
  24. {
  25. using (StorageEngine engine = StorageEngine.FromFile(dbpath))
  26. {
  27. var locator = new Locator(tabname);
  28. var table = engine.Scheme.CreateOrOpenXTable<string, string>(locator);
  29. var data = new Stsdb3Data<T>() { Key=key,Value=t,expiry=expiry};
  30. table[key] = JsonConvert.SerializeObject(data);
  31. table.Commit();
  32. engine.Scheme.Commit();
  33. table.Close();
  34. engine.Dispose();
  35. }
  36. }
  37. /// <summary>
  38. /// 保存数据对象
  39. /// </summary>
  40. /// <typeparam name="T">数据对象包含的数据</typeparam>
  41. /// <param name="key"></param>
  42. /// <param name="t">数据对象</param>
  43. /// <param name="tabname">保存表名</param>
  44. public void Put<T>(string key, T t, string tabname)
  45. {
  46. Put<T>(key, t, tabname, );
  47. }
  48. /// <summary>
  49. /// 获取数据
  50. /// </summary>
  51. /// <typeparam name="T"></typeparam>
  52. /// <param name="key"></param>
  53. /// <param name="tabname"></param>
  54. /// <returns></returns>
  55. public T Get<T>(string key, string tabname)
  56. {
  57. string json = string.Empty;
  58. T rest = default(T);
  59. using (StorageEngine engine = StorageEngine.FromFile(dbpath))
  60. {
  61. var locator = new Locator(tabname);
  62. var table = engine.Scheme.CreateOrOpenXTable<string, string>(locator);
  63. try
  64. {
  65. var item = table.FirstOrDefault(x => x.Key == key);
  66. json = item.Record != null ? item.Record : json;
  67. var data = JsonConvert.DeserializeObject<Stsdb3Data<T>>(json);
  68. if (data.IsExpired())
  69. {
  70. Delete(key, tabname); //删除无效的历史数据
  71. }
  72. else
  73. {
  74. rest = data.Value;
  75. }
  76. }
  77. catch
  78. {
  79. //
  80. }
  81. table.Close();
  82. engine.Dispose();
  83. }
  84. return rest;
  85. }
  86. /// <summary>
  87. /// 删除数据
  88. /// </summary>
  89. /// <param name="key"></param>
  90. /// <param name="tabname"></param>
  91. public void Delete(string key, string tabname)
  92. {
  93. using (StorageEngine engine = StorageEngine.FromFile(dbpath))
  94. {
  95. var locator = new Locator(tabname);
  96. var table = engine.Scheme.CreateOrOpenXTable<string, string>(locator);
  97. if (table != null)
  98. {
  99. table.Delete(key);
  100. table.Commit();
  101. table.Close();
  102. }
  103. engine.Dispose();
  104. }
  105. }
  106. }

  

在以上两个类都实现后,就可以进行测试了.

测试字符串代码如下:

  1. // 初始化
  2. Stsdb3Service service = new Stsdb3Service();
  3. // 保存字符串
  4. string key = "vs2008:k001";
  5. string val = "我的数据 vs2008";
  6. string tabname = "vs2008";
  7. service.Put<string>(key, val, tabname);
  8. // 读取保存的字符串
  9. string rest = service.Get<string>(key, tabname);
  10. MessageBox.Show("" + rest);
  11. //Delete
  12. service.Delete(key, tabname);
  13. //再次读取
  14. rest = service.Get<string>(key, tabname);
  15. if (rest != null)
  16. {
  17. MessageBox.Show("" + rest);
  18. }
  19. else
  20. {
  21. MessageBox.Show("not any value");
  22. }

  

测试自定义对象:

  1. Stsdb3Service service = new Stsdb3Service();
  2. //测试对象
  3. string bar = "6912345";
  4. Book book = new Book() { bar = bar, name = "书本名", dtc = DateTime.Now };
  5. string bookTabname = "books";
  6. //保存对象
  7. service.Put<Book>(book.bar, book, bookTabname);
  8. // 读取对象
  9. Book rest = service.Get<Book>(bar, bookTabname);
  10. if (rest == null)
  11. {
  12. MessageBox.Show("rest: no book ...");
  13. }
  14. else
  15. {
  16. MessageBox.Show("rest: book: " + JsonConvert.SerializeObject(rest));
  17. }

  

 补充Book类对象:

  1. public class Book
  2. {
  3. public string bar { get; set; }
  4. public string name { get; set; }
  5. public DateTime dtc { get; set; }
  6. }

  

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70000523/viewspace-3144820/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2022-02-22

  • 博文量
    1402
  • 访问量
    14989