大量小数据的内存组织、检索的思路,一定给分!

feiyangf 2001-11-16 02:25:00
1:问题来源(背景):
数据库记录为百万级,同时在线使用的可能是几十万级。读写都比较频繁。
2:解决途径:
建立数据库中间件,在数据库前端建立一个缓存池,存储在线用户状态,最大容量也就百万级,通常可能就是几十万。每个用户可以通过用户ID和服务类型来唯一标识,每条记录的大小<1k。
3:基本指标:速度一定要足够快,当然最好是o(1)操作,呵呵。
我的问题:
用什么样的数据结构和算法组织这些记录,其查询、增加、删除的效率比较好?
用c++进行大内存块控制有什么难度,要注意些什么?
4:我的给分标准(符合下面之一的)
提供详细的说明和解答的,(如果嫌分太少,可以另外补!)
提供思路
提供可努力方向
介绍可以提供方案或思路的人或公司
...全文
215 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
feiyangf 2001-12-07
  • 打赏
  • 举报
回复
我怎么总是加不上分阿
feiyangf 2001-11-26
  • 打赏
  • 举报
回复
好有什么建议没?
feiyangf 2001-11-24
  • 打赏
  • 举报
回复
加分
ariso 2001-11-22
  • 打赏
  • 举报
回复
好问题,这个和QQ的数据库设计很像的。
cnss你用链表,不合这里的情况,我建议用堆排序的结构,采用2叉平衡数。
1000万用户不过是2^24左右,3个bytes的节点就够了。不过,一般用4个bytes就是long形(32bits)

我想,用数组是比较好的办法。同时,XX万数据修改的disk i/o考虑是很关键的,因为这样需要
每秒写入,读出几十兆的数据。

据我看来,必须用多台linux机器完成这个任务。一台为主控机。
...

ariso@263.net is my email.



mashansj 2001-11-22
  • 打赏
  • 举报
回复
同意ariso(yangxz)
feiyangf 2001-11-22
  • 打赏
  • 举报
回复
不能怪我阿,怎么都加不上。。
是不是服务器响应不了我得负载??^_^
feiyangf 2001-11-22
  • 打赏
  • 举报
回复
谢谢大家,给分先。
大家如果还有什么建议,说阿。。。还可以再加分。。。。
supine 2001-11-21
  • 打赏
  • 举报
回复
增删查改当然链表比较好,但同时有百万数据在使用,不可能用一台服务器吧,可以根据关键字分配一定的记录给每台服务器,并且并行处理,最好是能等成批处理记录。像这么大而且又是实时的,可以试试数据仓库!
cnss 2001-11-21
  • 打赏
  • 举报
回复
干脆用数组!不过是1G内存,却能满足o(1)
cnss 2001-11-21
  • 打赏
  • 举报
回复
一次NEW大量内存,比如能容纳100万个小结构
然后做两个链表,一个是已用内存,另一个是未用内存
NEW完后,马上就构造未用内存链表,当然这要执行100万次
然后,每当添加一个用户时,把未用内存链表的HEAD指向的加入已用内存
同时从未用链表中删除
反之,删除用户时亦然
如果用户增长到100万以上,再NEW100万的空间,然后把它们都加入到未用内存表
这样的优点是增长.删除用户时特别快(比每次都NEW.DELETE快)
缺点是一旦增长到n*100万以上,再返回到(n-1)*100万时,一般不会回收内存
如果要靠ID号索引,可以用一个跳表索引,同时把小结构做成双链表就可以索引了
cnss 2001-11-21
  • 打赏
  • 举报
回复
FAINT!!写了一大堆,一按ESC全没了!!

等我回家再给打一遍
tanghuan 2001-11-21
  • 打赏
  • 举报
回复
如果企业级的数据库优化内存和索引在一台机器上都没有办法解决,
用常规方法肯定不行,只能使用并行机制来完成了。

如果你使用普通机器是没有办法承受,因为,如果同时有百万数据在使用,那你的
进程是多少,也是百万级?,如果那样,你只有使用MIMD的大型机器了,如果你使用
的进程不是很多,你只需要加大你的内存,比如上到8G-256G,多个CPU,采用企业级的
数据库,比如DB2 UDBEE,在运行中把数据全部Cache在内存中,这也比你自己写交换
代码快,因为数据库引擎的优化和开销预测策略都是别人应用成功的专利,不是那么容易
就可以写好的。

再就是分布存储和存取,数据分区,可以使用分布数据库,或使用分布和并行算法完成。
jasmine 2001-11-21
  • 打赏
  • 举报
回复
MTS指的是MS Transaction Server ,COM+1.0实际上包含了MTS 3.0 ,MTS对你问题的解决是几乎是没有帮助的。这个问题实在太可怕,我不敢相信一个可能到100万级的实时响应,在提高效率上,中间件可能会有帮助,比如说你可以用ADO这样的连接数据库的线程池,能保证你可数据库的Connection不会减少,你可以利用COM+的对象池来使你的大量用户使用可服用的对象,你也可以建立CacheManager的机制(保证你要Cahe的东西有相同的接口),不过我说的大都是基于web的机制,对你的电信级客户服务恐怕是不和用了。
KingSunSha 2001-11-21
  • 打赏
  • 举报
回复
即使一个城市同时有10万用户使用电话,那也是用的电话网络(程控交换机),不会登陆到同一个数据库吧? 说实话,能同时支持这么多用户的系统决不可能是采用常规方案来解决的,就象一个城市的程控电话网络也是由多个局交换机组成的,而不是一个集中式的超大型交换机.

所以可能你要换一个思路,看看相类似的解决方案有没有采用什么特殊的设备和技术. 就象当年我做一个文档系统的时候,客户的要求是要每天扫描上万张的文档资料,每张资料必须在几秒钟之内完成扫描/存档工作,开始我觉得根本不可能解决(事实上采用常规方法是无法解决的),后来采用了施乐的专用文档扫描设备,很轻松的完成了.
uje 2001-11-21
  • 打赏
  • 举报
回复
这种情况下用tuxedo 这个中间件的比较多。你可以去看看相关的资料。
jsy9922 2001-11-20
  • 打赏
  • 举报
回复
传统的树不错,只是算法要考虑,特别是在数据分支的时候。
C++的跨段的数据链,链头和链尾的数据位数
再之,如此之大的数据量,自己考虑组织确实不容易,如从安全角度考虑,可参考中计所的《数据仓库》一书。
KingSunSha 2001-11-20
  • 打赏
  • 举报
回复
什么?你有10万到100万个用户同时在线?太恐怖了吧?
feiyangf 2001-11-20
  • 打赏
  • 举报
回复
to: Haiwer(海阔天空)
如果不这样,面对10万到100万的在线用户状态管理、面对相对慢的要死的数据库系统,我该怎么办?
MTS能不能介绍一下,有什么效果?
feiyangf 2001-11-20
  • 打赏
  • 举报
回复
to KingSunSha(弱水三千)
谢先。应用背景是电信级客户服务。
一个城市同时有10万用户使用电话(固定和移动)网络也很正常。
100万倒是夸张了一点,不过我前面提到这是上限,也就是区域客户上限。
to:jsy9922(小老头),谢。
大家还有没有什么建议。。。
feiyangf 2001-11-19
  • 打赏
  • 举报
回复
我想。。。我想。。。怎么简化这个问题呢?
看看下面这个说法可不可以?

谁能够告诉我,在数据库管理系统(DBMS)中其引擎模块的工作原理?
也就是说:
一个数据库管理系统为了提高数据库性能,都在数据库接口处放置了一个Cache。他的作用是将使用频繁的一些数据放在内存中以加快对客户端请求的响应速度。我这个好像也是出于这个考虑,所以考虑把所有热门数据(调用频繁)都拉到一个我自己开辟的数据Cache中。
现在我想知道:数据库Cache的实现机理?
加载更多回复(6)

34,592

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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