none
vb.net的使用缓存来完成数据库的高速数据存储的例子 RRS feed

  • 问题

  • 各位老师:

    我正在写个小应用。碰到了高速数据存储的问题。由于数据库存储速度比较慢,高速变化的数据不能及时的存入数据库。有人告诉我,应该使用缓存,但是我不知道如何使用缓存,这应该是个什么思路。又或者看看哪些书籍。还望各位老师指点一二。谢谢先。

    2015年9月29日 11:26

答案

全部回复

  • 比如数据库的数据有十万条,每页显示40条。

    如果你在界面上有上一页、下一页、首页和末页按钮,那么除了当前页的数据之外,你还可以把这些页的数据也读出来放到数组里面。这样翻页的时候你可以直接把数组拿来用,不用再跑一趟数据库。

    缓存通常都是有大小限制的,如果剩余空间不足,需要把缓存命中率较少的内容置换出去。缓存置换算法很多,有FIFO、LRU等等,具体使用什么算法得看你对用户行为的统计。



    Visual C++ MVP

    • 已建议为答案 Xavier Xie-MSFT 2015年10月2日 5:44
    • 取消建议作为答案 Yu Du 2015年10月4日 14:03
    2015年9月29日 19:02
    版主
  • 蒋老师,可能我的问题没有描述清楚。现在是有几个数据源,每大约100ms这些数据源就有可能发生一次的数据变化(存在并发现象),这个数据变化我需要及时存储进数据库,不能丢掉。看了一些网文,有点像生产者和消费者的事例。我觉得解决问题的基本思想应该是:把这些少量的高发的数据,按某种规则放进缓存,同时判断缓存的大小,当数据库上次存储执行完毕后,判断缓存的大小,如果大于某个阈值,就一次性存入数据库,且释放资源。我做了测试程序,使用事务,我的数据量数据库存储150ms可以完成,但我不知道如何利用缓存。例如如何开辟一块内存做缓存,缓存可以有多大,如何使用,如何释放。这些都没有例子,单单是生产者和消费者还不能套用,我这里的话生产者的数据是不可以丢弃的。苦恼啊。
    2015年10月4日 14:03
  • 内存不够可以用硬盘和U盘做多级缓存。具体缓存大小和替换策略取决于你对缓存命中率的要求和硬件配置。但是缓存是可以丢掉的,不能用来替代原始数据。你的问题是应该找个靠谱的位置存获得的原始数据,还要支持事务,这个在本地装个数据库引擎来做比较好。



    Visual C++ MVP


    2015年10月4日 14:42
    版主
  • 試試看 SqlCacheDependency

    https://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

    或查看一下 SCADA

    http://stackoverflow.com/questions/727551/design-ideas-for-serving-up-high-frequency-data


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    2015年10月5日 8:45
  • 我做的这个小应用就是个SCADA.做练习来学习一下。
    2015年10月5日 11:00
  • 蒋老师,

    我用的本地数据库是sqlite。并且也使用了内存数据库,无奈它还是赶不上高频率数据的更新。我现在打算动手做了,基本思想是这样的,由于我每次的数据变化并不多,也就100~200条记录,字段名不超过5个。所以我打算做一个类,利用LIST(T),先不考虑内存容量的问题,把多个高频发的数据add进list_A里,每10~20次数据更新后,程序把高频发的数据add进list_B里,同时开线程list_A存入本地数据库,数据库存储完成,list_A清空。再过10~20次数据更新,B存入数据库,高频数据转存到listA里。如此反复。您看这样可以吗?或者有更清晰正确的思路,还请解惑。

    2015年10月5日 11:14
  • 如果你数据放内存里机器掉电怎么办?

    可以去http://www.opcconnect.com/dotnet.php看看现成类库的性能。



    Visual C++ MVP

    • 已标记为答案 Yu Du 2015年10月6日 0:23
    2015年10月5日 15:20
    版主
  • 谢谢蒋老师。
    2015年10月6日 0:23