200分,用DataSet实现内存数据库的设想,发帖探讨

超级大笨狼 2010-12-31 11:46:02
微软没有成熟的内存数据库可用,当游戏或者大型应用。
频繁修改对象访问(可以对应到数据表)状态时,IO性能将成为系统瓶颈。
MemeCached不能解决全部问题,尤其是级联查询非主键字段的情况。
因此需要有个内存数据库的架构,加大内存,缓解IO。

我思考,是否可以用DataSet实现内存数据库?

1,有一个全局的静态的DataSet名叫DS,结构和物理数据库完全一致,可以在项目启动时,映射到内存里,数据是空的。
2,大量并发访问时,查询时发现内存中没有的数据,再从物理数据库灌进来,同时进缓存MemeCached
3,有主键的数据从集群缓存MemeCached里取。
3,插入和修改先进DS,延迟一段时间再进物理库。
4,DS的大小自动维护,不超过系统内存可用量。

以上只是思路,想看看大家思考后会有什么结果,预料到什么问题?

...全文
773 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengyun14 2013-03-15
  • 打赏
  • 举报
回复
版主的想法,我也正有此意,您的帖子是我在google上用:dataset 内存数据库,搜到的。 我想,起码对于只插入,不修改的情况,会有较大改善的,我顶你!! 也希望如果您有成果的话,请与我联系,我期待您的好消息。 我这几天研究oracle的timesten,我觉得这个timesten 就可以用dataset来实现嘛!不用很痛苦的配置了
超级大笨狼 2011-01-04
  • 打赏
  • 举报
回复
将Mysql改成:分布式内存数据库
http://hi.baidu.com/free_specter/blog/item/a69279f46328d168dcc474e9.html

memcache_engine
QQ7300 2011-01-02
  • 打赏
  • 举报
回复
用文档数据库吧,如MongDB
ggw128 2011-01-02
  • 打赏
  • 举报
回复
想法很好。只是控制点太多,不容易做得全面哦。
boringame 2011-01-02
  • 打赏
  • 举报
回复
DataSet+linq我感觉还不错。

MySql有提供内存数据库功能。

问题的保姆,帖子的管家——《Csdn收音机》!
  • 打赏
  • 举报
回复
有个用c#写的内存数据库sharphsql
超级大笨狼 2010-12-31
  • 打赏
  • 举报
回复
恩,工作量肯定很大。
Dictionnary<T,Dictionnary<T,T>>这样的结构也会非常多,而且是自动生成的。
为了加快查询速度,用这个东西做索引。

而且,这个DS是专门一台机器,跑在WCF状态机程序里的。
(或者其他更快的通讯机制MSMQ,RabitMQ之类的)
莫名其 2010-12-31
  • 打赏
  • 举报
回复
想法很不错!
这方面我也不太懂,不过按照“3,插入和修改先进DS,延迟一段时间再进物理库。”这一条来说是不是需要维护一个很大的消息队列来控制DS数据-->物理数据库的操作?
lgz_asp_net 2010-12-31
  • 打赏
  • 举报
回复
这方面不太懂,只是想了解高手的思路
超级大笨狼 2010-12-31
  • 打赏
  • 举报
回复
DS在一个机器上,MemeCached在其他很多机器上。
lgz_asp_net 2010-12-31
  • 打赏
  • 举报
回复
数据进入DS后,还是可以手动改数据的,俗称外挂
一只熊猫 2010-12-31
  • 打赏
  • 举报
回复
数据量巨大加上操作频繁,我个人觉得实现此算法所需的投入将远远超过获得的性能提升。
不知道楼主是什么应用场景会要求如此高的性能。
我还是建议从硬件、架构入手提升系统性能。

不过还是期待有牛人真能搞出牛B的算法来。。。
lbq0801 2010-12-31
  • 打赏
  • 举报
回复
ioasegajfgoafoadsiofjoisafadspofoj
taolinsen 2010-12-31
  • 打赏
  • 举报
回复
学习。等待 牛B的解决方案
Adensky 2010-12-31
  • 打赏
  • 举报
回复
个人觉得不现实
1,数据大、业务复杂的情况下没有DB管理系统对数据进行优化,操作速度估计不会多快
2,数据向物理存储同步问题、断电、服务器当机等情况怎么处理
你的选择H 2010-12-31
  • 打赏
  • 举报
回复
DataSet 本事就是一个数据缓冲区,它从本质上说,就是数据库中的表在内存中的映射,实现的也是对速度瓶颈的缓解,应该没有什么问题的吧
datahandler 2010-12-31
  • 打赏
  • 举报
回复
3。您对数据库方面很厉害的,以前我曾有看过您的某些表关系设计的确很牛B,个人感觉,有时为了后续项目性能和开发难度考虑,其实表设计偶尔可以不那么严.格-遵循 -数据库三.范.式,规范是死的,但定的太.死,有时的确很耗费开发效能和性能优化要求。
4。 个人感觉居于DataSet公用缓存,还不如居于内存映射文件方式进行架构处理-I-O问题。
datahandler 2010-12-31
  • 打赏
  • 举报
回复
2。Dictionnary模式只能单个列快速检索,多层嵌套反增加字典代码的阅读可读性和可维护性,我觉得如果在只检索查询下确实性能不错,但字典内部机制会出现一个版本检查异常问题,刚好您的项目又是字典做公用然后又需要修改这个公用字典,如果还加入多线程环境去操作那控制比较麻烦(可能你会用锁机制或实现IClone接口)所以个人感觉就不是很理想。反而我依据是否频繁修改来决定要不要使用字典,否则我更喜欢泛型。
datahandler 2010-12-31
  • 打赏
  • 举报
回复
我提提自己的小观点小见解,说错了。别介意:
1。Dataset的内存更新数据后再延迟执行到物理数据库更新,这段时间,要适当均衡下 你系统会不会挂掉
或特殊情况下的数据丢失问题,此时就真的不好在要求强事务环境下维护使用,另外DataSet的数据如果很大批量更新性能速度,个人曾有小尝试过,不是很理想.(泛型的循环插入再由事务最终提交的批量更新方式性能还可以)
gongsun 2010-12-31
  • 打赏
  • 举报
回复
想法很好。。。

做好数据备份应该就可以了。

把及时数据与常规数据分开,及时数据直接放在ds中,每隔一定的时间导入数据库。

用户操作直接读写ds应该是很快的。
加载更多回复(12)

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧