论坛首页 Java企业应用论坛

帖子 博客等资源点击量缓存杀手级解决方案

浏览 21370 次
精华帖 (0) :: 良好帖 (9) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-21   最后修改:2009-07-21
lkjust08 写道
lz提供了一个很好的思路呀。但是当文件导入库的时候,若数据量过大,也会对数据库造成超重负荷呀?


这个我用10w的简单数据测试过 http://xuliangyong.iteye.com/blog/424921

cpu占用率基本不变,10w条数据耗时仅1172ms ,还是在数据库没有调优的情况下
可能在内存方面会消耗一些,但也是很小,  一条数据也就几十个字节 10w也就几M而已
0 请登录后投票
   发表时间:2009-07-21  
支持楼主,用代码和测试说话
0 请登录后投票
   发表时间:2009-07-21  
我做过点击统计,当时用的是双倍缓冲设计(Double Buffer)。
一条线记录点击量到内存中,另一条线写数据库。
如果觉得数据库提交时吃不消,还可以用三倍缓冲或多倍缓冲降低每次提交的数据量。

当然,这是单服务器的设计,稍微扩展一下就可以做成绩群服务了。
0 请登录后投票
   发表时间:2009-07-21  
是啊...可以用一个数据库连接慢慢提交..没必要非在同一时间执行所有的sql吧...一般半夜三点左右更新一次就ok...
0 请登录后投票
   发表时间:2009-07-21  
xly_971223 写道
lkjust08 写道
lz提供了一个很好的思路呀。但是当文件导入库的时候,若数据量过大,也会对数据库造成超重负荷呀?


这个我用10w的简单数据测试过 http://xuliangyong.iteye.com/blog/424921

cpu占用率基本不变,10w条数据耗时仅1172ms ,还是在数据库没有调优的情况下
可能在内存方面会消耗一些,但也是很小,  一条数据也就几十个字节 10w也就几M而已



文件导入是一个选项,但是只是可以用在数据量不是很大而且客户可以对数据质量不高的情况下。因为当你在导入数据的时候,数据库是不支持事务的,也就说可能有一半的数据在数据库了,一半的数据还在文件里。 出现这种情况其实在现实中是很多的,因为你要导入的文件可能包含错误。
我们过去的一个项目中的解决方案是,把数据导入到临时表中,全部成功后,再往主表转,这个过程事务是可以支持的。
如果数据导入不成功,就直接删除临时表。
0 请登录后投票
   发表时间:2009-07-21  
xly_971223 写道

麻烦仁兄帮测一下行不 


我的测试结果是相差6倍左右.(myisam 和 innodb 都是这样) 
不管是向空表中插还是向非空表中插入随即数据结果差不多都是这个数.

我是在一个虚拟机上测的..... 也许不太靠谱......

0 请登录后投票
   发表时间:2009-07-21   最后修改:2009-07-22
icefishc 写道
xly_971223 写道

麻烦仁兄帮测一下行不 


我的测试结果是相差6倍左右.(myisam 和 innodb 都是这样) 
不管是向空表中插还是向非空表中插入随即数据结果差不多都是这个数.

我是在一个虚拟机上测的..... 也许不太靠谱......


感谢 icefishc

我刚才又换了台机器测试了一下
表结构 innodb 无主键
CREATE TABLE `sns_hits` (
  `resource_id` int(11) default NULL,
  `resource_type` varchar(20) default NULL,
  `hits` int(11) default NULL,
  `create_time` datetime default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


批量插入java代码

long start = System.currentTimeMillis();
			conn.setAutoCommit(false);
			ps = conn.prepareStatement("insert into sns_hits values(?,?,?,?)");
			for(int i = 0; i < 100000; i++){
				ps.setInt(1, 1);
				ps.setString(2, "BLOG");
				ps.setInt(3, 34);
				ps.setString(4, "2009-07-23 18:23:20");
				ps.addBatch();//加入批处理
			}
			int[] results = ps.executeBatch();//执行批处理
			conn.commit();
			System.out.println(System.currentTimeMillis() - start);


数据文件 都是同样的数据
1	BLOG	34	2009-07-23 18:23:20
1	BLOG	34	2009-07-23 18:23:20
1	BLOG	34	2009-07-23 18:23:20
1	BLOG	34	2009-07-23 18:23:20
1	BLOG	34	2009-07-23 18:23:20


数据库没有调整任何参数,即使调整估计影响也不大
      1W   5W  10W
PreparedStatement        1828/1704   8172/7892       16125/15734(ms) 
load data local infile   219/234/156     1187/610/688    968/1141  (ms) 

斜杠'/'分割多次测试
                                                   
平均在10倍左右

看来这玩意受硬件的影响比较大 跟上次测试比较http://xuliangyong.iteye.com/blog/424921
分别插入 1W 5W 10W 结果如下
PreparedStatement        1953   9203  17641(ms) 
load data local infile   125    625   1172  (ms) 


0 请登录后投票
   发表时间:2009-07-22  
xly_971223 写道
icefishc 写道
xly_971223 写道

麻烦仁兄帮测一下行不 


我的测试结果是相差6倍左右.(myisam 和 innodb 都是这样) 
不管是向空表中插还是向非空表中插入随即数据结果差不多都是这个数.

我是在一个虚拟机上测的..... 也许不太靠谱......


感谢 icefishc

我刚才又换了台机器测试了一下
表结构 innodb 无主键
CREATE TABLE `sns_hits` (
  `resource_id` int(11) default NULL,
  `resource_type` varchar(20) default NULL,
  `hits` int(11) default NULL,
  `create_time` datetime default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


批量插入java代码

long start = System.currentTimeMillis();
			conn.setAutoCommit(false);
			ps = conn.prepareStatement("insert into sns_hits values(?,?,?,?)");
			for(int i = 0; i < 100000; i++){
				ps.setInt(1, 1);
				ps.setString(2, "BLOG");
				ps.setInt(3, 34);
				ps.setString(4, "2009-07-23 18:23:20");
				ps.addBatch();//加入批处理
			}
			int[] results = ps.executeBatch();//执行批处理
			conn.commit();
			System.out.println(System.currentTimeMillis() - start);


数据文件 都是同样的数据
1	BLOG	34	2009-07-23 18:23:20
1	BLOG	34	2009-07-23 18:23:20
1	BLOG	34	2009-07-23 18:23:20
1	BLOG	34	2009-07-23 18:23:20
1	BLOG	34	2009-07-23 18:23:20


数据库没有调整任何参数,即使调整估计影响也不大
      1W   5W  10W
PreparedStatement        1828/1704   8172/7892       16125/15734(ms) 
load data local infile   219/234/156     1187/610/688    968/1141  (ms) 

斜杠'/'分割多次测试
                                                   
平均在10倍左右

看来这玩意受硬件的影响比较大 跟上次测试比较http://xuliangyong.iteye.com/blog/424921
分别插入 1W 5W 10W 结果如下
PreparedStatement        1953   9203  17641(ms) 
load data local infile   125    625   1172  (ms) 



那是肯定和硬件相关度大的,数据库增删改最终还是要通过IO操作写到磁盘里的
0 请登录后投票
   发表时间:2009-07-22   最后修改:2009-07-22
根本没必要搞这么复杂,一个关键字/值数据库就足矣

一两行代码的问题

即使需要简单的查询操作也可以胜任

所有不需要要计入关系模型的,不需要进行复杂统计的,都可以这样做,包括用户的最后点击时间等等

持续每秒钟几万次的更新轻而易举

tokyotyrant,bdb都可以

0 请登录后投票
   发表时间:2009-07-22  
potian 写道
根本没必要搞这么复杂,一个关键字/值数据库就足矣

一两行代码的问题

即使需要简单的查询操作也可以胜任

所有不需要要计入关系模型的,不需要进行复杂统计的,都可以这样做,包括用户的最后点击时间等等

持续每秒钟几万次的更新轻而易举

tokyotyrant,bdb都可以



tokyotyrant中文文档貌似比较少
bdb倒是可以尝试一下
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics