首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 【原创】1亿动态pv/天的超级数据库缓存解决方案,开源了,还有测试代码。作者KK
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-07-24 09:34:59 楼主
    说是支持1亿pv/天,也许有点夸张,也是为了吸引您能点进来,如果您能认真看完相信也不会让您失望,当然,肯定有很多“高手”会对此会嗤之以鼻,没关系,有很多眼高手低的人总喜欢评论别人却从不会看清自己。

    如果大家真想支持我、支持中国人开源项目,请把该文贴到自己的博客中或者收藏本文,记得包含文档的下载地址!!!!!!!谢谢。

    我说的系统主要是构建在hibernate之上的高效数据库缓存系统,其中包含了分布式解决方案,该系统已经应用在舍得网上了,没有发现大问题,本人也相信该系统已经足够强大,应付数百万IP/天的应用都不是问题,我这么说肯定有人会对此表示怀疑,其实系统到底能撑多少IP/天不在于系统本身而是在于使用该系统的人。

    代码看上去很简单,其实却是两年经验的总结,整过过程也遇到了很多难点,最后一一解决了,所以也请各位珍惜他人的劳动成果。本系统非常简洁易用,主程序BaseManager.java不到1000行代码,用“精悍”来形容绝对不为过,1000行代码却包含了数据库对象的缓存、列表和长度的缓存、按字段散列缓存、update延时更新、自动清除列表缓存等功能,用它来实现像论坛、博客、校友录、交友社区等绝大部分应用网站都足够了。

    我在理想状态下做了压力测试,在没有数据库操作的jsp页面(舍得网新首页)里可以完成2000多requests每秒(正常情况可能有1/1000的request有数据库查询,其余999/1000都是直接从缓存里读取),物品详情页每秒可完成3000多requests,纯静态html页面也只能完成7000多requests/秒,我对首页进行了三个小时的压力测试,完成了24850800个requests,java一点事都没有,内存没有上涨。按照2000个requests/秒算,一天按15小时计算,那么每天能完成3600*15*2000=1亿零8百万requests,当然这是理想状态,实际状态就算打一折,还能完成1000万pv/天,要知道,这只是一个普通1万3千块钱买的服务器,内存4G,CPU2个,LinuxAS4系统,apache2.0.63/resin2.1.17/jdk6.0的环境。

    现在进入正题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    为什么要用缓存?如果问这个问题说明你还是新手,数据库吞吐量毕竟有限,每秒读写5000次了不起了,如果不用缓存,假设一个页面有100个数据库操作,50个用户并发数据库就歇菜,这样最多能支撑的pv也就50*3600*15=270万,而且数据库服务器累得半死,搞不好什么时候就累死了。我的这套缓存系统比单独用memcached做缓存还要强大,相当于在memcached上再做了两级缓存,大家都知道memcached很强了,但是吞吐量还是有限,每秒20000次get和put当遇到超大规模的应用时还是会歇菜,本地HashMap每秒可执行上百万次put和get,在这上面损耗的性能几乎可以忽略不记了。温馨提示:能不用分布式的时候就不要用分布式,非用分布式的时候再考虑用memcached,我的缓存系统在这方面都已经实现了,改个配置就可以了,有兴趣的可以仔细测试测试!

    一般数据库缓存在我看来包含四种。第一种:单个对象的缓存(一个对象就是数据库一行记录),对于单个对象的缓存,用HashMap就可以了,稍微复杂一点用LRU算法包装一个HashMap,再复杂一点的分布式用memcached即可,没什么太难的;第二种:列表缓存,就像论坛里帖子的列表;第三种:长度的缓存,比如一个论坛板块里有多少个帖子,这样才方便实现分页。第四种:复杂一点的group,sum,count查询,比如一个论坛里按点击数排名的最HOT的帖子列表。第一种比较好实现,后面三种比较困难,似乎没有通用的解决办法,我暂时以列表缓存(第二种)为例分析。

    mysql和hibernate的底层在做通用的列表缓存时都是根据查询条件把列表结果缓存起来,但是只要该表的记录有任何变化(增加/删除/修改),列表缓存要全部清除,这样只要一个表的记录经常变化(通常情况都会这样),列表缓存几乎失效,命中率太低了。

    本人想了一个办法改善了列表缓存,当表的记录有改变时,遍历所有列表缓存,只有那些被影响到的列表缓存才会被删除,而不是直接清除所有列表缓存,比如在一个论坛版(id=1)里增加了一个帖子,那么只要清除id=1这个版对应的列表缓存就可以了,版id=2就不用清除了。这样处理有个好处,可以缓存各种查询条件(如等于、大于、不等于、小于)的列表缓存,但也有个潜在的性能问题,由于需要遍历,CPU符合比较大,如果列表缓存最大长度设置成10000,两个4核的CPU每秒也只能遍历完300多次,这样如果每秒有超过300个insert/update/delete,系统就吃不消了。

    在前面两种解决办法都不完美的情况下,本人和同事经过几个星期的思索,总算得出了根据表的某几个字段做散列的缓存办法,这种办法无需大规模遍历,所以CPU符合非常小,由于这种列表缓存按照字段做了散列,所以命中率极高。思路如下:每个表有3个缓存Map(key=value键值对),第一个Map是对象缓存A,在A中,key是数据库的id,Value是数据库对象(也就是一行数据);第二个Map是通用列表缓存B,B的最大长度一般1000左右,在B中,key是查询条件拼出来的String(如start=0,length=15#active=0#state=0),Value是该条件查询下的所有id组成的List;第三个Map是散列缓存C,在C中,key是散列的字段(如根据userId散列的话,其中某个key就是userId=109这样的String)组成的String,value是一个和B类似的HashMap。其中只有B这个Map是需要遍历的,不知道说明白了没有,看完小面这个例子应该就明白了,就用论坛的回复表作说明,假设回复表T中假设有字段id,topicId,postUserId等字段(topicId就是帖子的id,postUserId是发布者id)。

    第一种情况,也是最常用的情况,就是获取一个帖子对应的回复,sql语句应该是象
    select id from T where topicId=2008 order by createTime desc limit 0,5
    select id from T where topicId=2008 order by createTime desc limit 5,5
    select id from T where topicId=2008 order by createTime desc limit 10,5
    的样子,那么这种列表很显然用topicId做散列是最好的,把上面三个列表缓存(可以是N个)都散列到key是topicId=2008这一个Map中,当id是2008的帖子有新的回复时,系统自动把key是topicId=2008的散列Map清除即可。由于这种散列不需要遍历,因此可以设置成很大,例如100000,这样10万个帖子对应的所有回复列表都可以缓存起来,当有一个帖子有新的回复时,其余99999个帖子对应的回复列表都不会动,缓存的命中率极高。

    第二种情况,就是后台需要显示最新的回复,sql语句应该是象
    select id from T order by createTime desc limit 0,50
    的样子,这种情况不需要散列,因为后台不可能有太多人访问,常用列表也不会太多,所以直接放到通用列表缓存B中即可。

    第三种情况,获取一个用户的回复,sql语句象
    select id from T where userId=2046 order by createTime desc limit 0,15
    select id from T where userId=2046 order by createTime desc limit 15,15
    select id from T where userId=2046 order by createTime desc limit 30,15
    的样子,那么这种列表和第一种情况类似,用userId做散列即可。

    第四种情况,获取一个用户对某个帖子的回复,sql语句象
    select id from T where topicId=2008 and userId=2046 order by createTime desc limit 0,15
    select id from T where topicId=2008 and userId=2046 order by createTime desc limit 15,15
    的样子,这种情况比较少见,一般以topicId=2008为准,也放到key是topicId=2008这个散列Map里即可。

    总结:这种缓存思路可以存储大规模的列表,缓存命中率极高,因此可以承受超大规模的应用,但是需要技术人员根据自身业务逻辑来配置需要做散列的字段,一般用一个表的索引键做散列(注意顺序,最散的字段放前面),假设以userId为例,可以存储N个用户的M种列表,如果某个用户的相关数据发生变化,其余N-1个用户的列表缓存纹丝不动。以上说明的都是如何缓存列表,缓存长度和缓存列表思路完全一样,如缓存象select count(*) from T where topicId=2008这样的长度,也是放到topicId=2008这个散列Map中。如果再配合好使用mysql的内存表和memcached,加上F5设备做分布式负载均衡,该系统对付像1000万IP/天这种规模级的应用都足够了,除搜索引擎外一般的应用网站到不了这种规模。

    再次申明:系统到底是不是强大不在系统本身而在于使用该系统的人!!!

    这个缓存系统是我和同事几年经验的总结,看似简单,其实也没那么简单,把它作为开源有下面几个目的:第一,真的希望有很多人能用它;第二:希望更多的人能够完善和改进它;第三:希望大家能聚到一起为通用高效数据库缓存构架作出贡献,毕竟,数据库操作是各种应用最常用的操作,也是最容易产生性能瓶颈的地方。

    Zip包中包含了配置方法和测试用的jsp,只要把它配置成一个web应用就可以快速调试并看到缓存的力量了,文档和下载地址是http://shedewang.com/akaladocs/api/com/akala/dbcache/core/BaseManager.html。群组的地址是http://groups.csdn.net/shedewang_db_cache

    配置说明文件在docs/开始配置.txt里有说明。

    最后啰嗦一句,如果大家真想支持我、支持中国人开源项目,请把该文贴到自己的博客中或者收藏本文,记得包含文档的下载地址!!!!!!!谢谢。thank you and Good luck。

    QQ群:24561583

    在CSDN里我就只管理这个帖子和群组里的帖子了,其余的地方就不发了。

    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 09:38:331楼 得分:0
    狂妄一下,还有比这更实用的原创帖子吗?这种帖子不支持是不是太不厚道了?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • comszsoft
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 12:21:582楼 得分:0
    帮顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kekeemx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 13:12:463楼 得分:0
    memcache感觉只有到了千万级别性能才会不怎么样吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Vanel
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 14:43:194楼 得分:0
    看不大懂,帮顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 14:46:165楼 得分:0
    不是memcached的问题,是网络get的问题,用java client对memcached做测试,每秒只能get几万次吧?它能get一百万次每秒吗?如果不行就比本地缓存慢。
    但是本地缓存如果做了分布式就有缓存同步的问题,如果只有memcached就没这个问题,各有千秋。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guoli0813
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 15:05:036楼 得分:0
    这篇帖子是为了网站造势的,为了造势,他们写了几种类型的帖子,分论坛分周期的投放,来换点击率,网站是不错,兄弟,你的推广我有点烦了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 15:06:567楼 得分:0
    今天遇到好几个跟我单挑缓存系统的事了,有个哥们说sohu的论坛缓存策略比较牛,维持链表什么的,最后发现它列表里存的都是Object,我不赞同这么做,维持链表更复杂而且不能应付除论坛外的应用;还有个哥们跟我说,写日志能把硬盘写死的,所以担心我的缓存IO可能会很大。系统要瘫痪也只能瘫在数据库承受不了(如每秒10000次insert)不会瘫痪在HashMap的get和set上,也不会瘫在日志上,除非程序员乱写代码。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 15:10:078楼 得分:0
    引用 6 楼 guoli0813 的回复:
    这篇帖子是为了网站造势的,为了造势,他们写了几种类型的帖子,分论坛分周期的投放,来换点击率,网站是不错,兄弟,你的推广我有点烦了。


    先生此言差矣,程序员不是我网站的目标用户,靠这么推广管个P用?如果非要说我的算盘,顶多让网站名字多在互联网出现几次,这样PR值会高。总有这些人,什么都不看,管你写的什么东西,上来就踩,也挺烦的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bluedoctor
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 16:06:559楼 得分:0
    思路不错.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dreamfly_888
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 16:58:4610楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wangzhanf
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 17:04:1711楼 得分:0
    好东西一定要顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wangzhanf
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 17:04:3112楼 得分:0
    好东西一定要顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • im2web
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 17:13:4013楼 得分:0
    请教先生了, 还没看代码但是想到的问题

      在使用本地hashmap的时候,应该是多线的吧。 那么是否使用了锁呢? 如果没有,在你修改
    列表缓 长度的缓存 复杂一点的group,sum,count查询,
    的时候,正好有人在读怎么处理。如果有了,势必大量的影响性能,又是怎么处理的?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zjf405
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 17:15:2214楼 得分:0
    see see
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • angelli09
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 17:32:1515楼 得分:0
    虽然看不懂,不过顶下咯,学习学习!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • songfuqiang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 17:35:1416楼 得分:0
    see see收藏...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zgf8866
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 17:45:4217楼 得分:0
    这么牛不喝水强按头,
    顶一下,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 18:02:0918楼 得分:0
    引用 13 楼 im2web 的回复:
    请教先生了, 还没看代码但是想到的问题

      在使用本地hashmap的时候,应该是多线的吧。 那么是否使用了锁呢? 如果没有,在你修改
    列表缓 长度的缓存 复杂一点的group,sum,count查询,
    的时候,正好有人在读怎么处理。如果有了,势必大量的影响性能,又是怎么处理的?

    HashMap的get和put如果加锁还不如不做缓存。你说的情况一般不会发生,你是假设N个线程同时get一个对象,此时刚好这个对象在缓存里没有,所以N个线程同事都去取数据库,一般这种事情在毫秒级的时间内就完成了,即使多线程同时去数据库select也不会错,HashMap的put会覆盖之前N-1个线程返回的结果。大规模的group sum还得看情况处理。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wptad
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 19:01:4219楼 得分:0
    UP
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • smartcatiboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 19:09:2520楼 得分:0
    不懂

    不过觉得缓存,hash表之类,应该是大型数据库体系内的一部分,特别是查询有严格的逻辑问题,对于体系结构设计以外的人DB用户不要插手,留给数据库厂商处理比较好.

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shuizhiyun
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 20:06:5621楼 得分:0
    厉害,领教了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • pgdoryoku
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 22:09:1222楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dhgdmw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 22:45:2223楼 得分:0
    先看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Guizhi
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-24 22:56:0024楼 得分:0
    学习啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zincy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 08:39:5225楼 得分:0
      好
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • anan1211
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 08:45:0326楼 得分:0
    好东西
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fengsky491
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 08:45:1327楼 得分:0
    引用 22 楼 pgdoryoku 的回复:
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fengsky491
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 08:47:4828楼 得分:0
    弱弱的问下limit是干什么用的?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • r_swordsman
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 08:56:1629楼 得分:0
    引用 28 楼 fengsky491 的回复:
    弱弱的问下limit是干什么用的?


    mysql 的语句
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • brucesea
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 09:22:3430楼 得分:0
    第一次接触数据库缓冲这个topic,楼主写的不错,学到很多东西。
    请教几个问题:

    1. 为什么影响到的列表缓存一定要删除?我认为没必要删除,只需做简单修改即可,这样下次cache还可以命中,无需再重新查询了。例如第一个例子中有新帖回复时,与之相关的三个查询的cache value只需做减一个id,加一个id的操作。当然这需要对查询语句做语义分析,复杂的查询语句可能有些麻烦,简单的还是可以的。

    2. 楼主觉得用某几个字段拼接起来的string做散列效率怎样?我的感觉是效率有点低,命中率可能不够高。举个简单的例子,对于userId,你的key可能是 userId=1, userId=2,userId=3,。。如果用个二级hash,先对userId进行hash,再对1,2,3…等进行hash,这样命中率可能更高些.

    其实字段条件和查询条件是个典型的树状结构,用树即可以把所有的字段条件和查询条件组织起来,叶子节点是查询所对应的结果。 我认为用树来组织一方面节省内存空间,另一方面效率也比hash要高。我们需要做的工作就是对树的查询、更新、插入、删除操作。 结合我说的第一点,对于叶子节点,尽量做更新操作,而不是删除操作。

    因为第一次接触这个topic,可能楼主的东西我还没有理解清楚,上面说的也可能都是错的,拿出来和楼主讨论讨论。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • im2web
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 09:42:5931楼 得分:0
    引用 18 楼 bruce_lau 的回复:
    引用 13 楼 im2web 的回复:
    请教先生了, 还没看代码但是想到的问题

    在使用本地hashmap的时候,应该是多线的吧。 那么是否使用了锁呢? 如果没有,在你修改
    列表缓 长度的缓存 复杂一点的group,sum,count查询,
    的时候,正好有人在读怎么处理。如果有了,势必大量的影响性能,又是怎么处理的?

    HashMap的get和put如果加锁还不如不做缓存。你说的情况一般不会发生,你是假设N个线程同时get一个对象,此时刚好这个对象在…


    我关心是是update 的情况, update, 造成了可能需要对你的hashmap的记录进行操作, 比如需要删除1条,插入1条,那么此时如果有线程正在里面读会被删除的那条,可能就会崩溃了。当然延后删除是一个方案,但是并不保险。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • igurong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 09:50:2932楼 得分:0
    有思想,敢想就成功一半!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hyjz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 10:08:3933楼 得分:0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hyjz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 10:09:0434楼 得分:0
    打个标记 慢慢看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gel_ink
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 10:13:0435楼 得分:0
    "普通1万3千块钱买的服务器,内存4G,CPU2个"

    问一下,服务器是2个4核cpu吗? 硬盘怎么配的?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 10:27:5536楼 得分:0
    引用 35 楼 gel_ink 的回复:
    "普通1万3千块钱买的服务器,内存4G,CPU2个"

    问一下,服务器是2个4核cpu吗? 硬盘怎么配的?

    70多G
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fuxiaoyang13
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 10:49:2337楼 得分:0
    厉害,顶!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 10:50:4138楼 得分:0
    引用 30 楼 brucesea 的回复:
    第一次接触数据库缓冲这个topic,楼主写的不错,学到很多东西。
    请教几个问题:

    1. 为什么影响到的列表缓存一定要删除?我认为没必要删除,只需做简单修改即可,这样下次cache还可以命中,无需再重新查询了。例如第一个例子中有新帖回复时,与之相关的三个查询的cache value只需做减一个id,加一个id的操作。当然这需要对查询语句做语义分析,复杂的查询语句可能有些麻烦,简单的还是可以的。 【这对于简单的论坛来说可以,比如就只有一种情况,可以自己维持一个链表,但如果有多种列表多种排序方式就不好办了。如果还想把数据库查询列表的操作也省了还有其他办法,如仿照lucene在内存里建立一个索引B+树,这样update/insert/delete一条数据库时,列表从这里读取,或者使用mysql内存表。这样处理得多大规模啊】

    2. 楼主觉得用某几个字段拼接起来的string做散列效率怎样?我的感觉是效率有点低,命中率可能不够高。举个简单的例子,对于userId,你的key可能是 userId=1, userId=2,userId=3,。。如果用个二级hash,先对userId进行hash,再对1,2,3…等进行hash,这样命中率可能更高些. 【HashMap中用Integer做key肯定比用String做key快,但这应该不是影响性能的关键问题了,完美】

    其实字段条件和查询条件是个典型的树状结构,用树即可以把所有的字段条件和查询条件组织起来,叶子节点是查询所对应的结果。 我认为用树来组织一方面节省内存空间,另一方面效率也比hash要高。我们需要做的工作就是对树的查询、更新、插入、删除操作。 结合我说的第一点,对于叶子节点,尽量做更新操作,而不是删除操作。【你这个树和我说的类似lucene的索引树或者mysql内存表差不多,就看真的有没有必要了】

    因为第一次接触这个topic,可能楼主的东西我还没有理解清楚,上面说的也可能都是错的,拿出来和楼主讨论讨论。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 10:56:3239楼 得分:0
    引用 31 楼 im2web 的回复:
    我关心是是update 的情况, update, 造成了可能需要对你的hashmap的记录进行操作, 比如需要删除1条,插入1条,那么此时如果有线程正在里面读会被删除的那条,可能就会崩溃了。当然延后删除是一个方案,但是并不保险。

    HashMap的get和put还要考虑这些问题吗?HashMap的get或remove都在1/1000000秒级别就完成了,这么短的时间内即使有并发也不会崩溃,这种情况很难发生,我是这么认为的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kuku12bing
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 11:06:1340楼 得分:0
    帖是一种美德!帖是一种美德!帖是一种美德!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhao_tk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 11:18:2041楼 得分:0
    Mark~`
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hhh518
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 11:40:3742楼 得分:0
    看得不是很明白.谢谢分享
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yythyb
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 11:58:3843楼 得分:0
    看不了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiao1zhao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 12:28:3244楼 得分:0
    不顶白不顶,顶了还想顶,顶过了才知道,不顶不行啊!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oldmht
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 13:43:4045楼 得分:0
    楼主的东西不错,我这里想问一个问题,类似舍得网这样的项目,从各方面来统计,他的数据库在什么操作上用的时间最多?select?前台对应的是模糊搜索么?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • brucesea
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 13:49:1346楼 得分:0
    引用 38 楼 bruce_lau 的回复:
    引用 30 楼 brucesea 的回复:
    第一次接触数据库缓冲这个topic,楼主写的不错,学到很多东西。
    请教几个问题:

    1. 为什么影响到的列表缓存一定要删除?我认为没必要删除,只需做简单修改即可,这样下次cache还可以命中,无需再重新查询了。例如第一个例子中有新帖回复时,与之相关的三个查询的cache value只需做减一个id,加一个id的操作。当然这需要对查询语句做语义分析,复杂的查询语句可能有些麻烦,简单的还是可以的。 …


    谢谢楼主的回复。不过没有很理解楼主所说的。

    我的理解,可以把缓冲看成两层:下面一层是对数据库对象的缓存,比如memcached等;上面一层是对查询和其结果的缓存(查询结果即是id组成的List)。

    楼主说的lucene的B+树,mysql的内存表好像是对数据库对象的缓存组织吧

    我这儿讨论的是对查询和其结果的缓存。我所说的树状结构是对查询的结构组织。这应该会比直接几个字段拼接起来的string做散列省空间,省时间。比如楼主的第一个例子,用string空间是 userId=2046#0,5,userId=2046#5,5, userId=2046#15,5。 userId会重复出现很多次。通过对查询的树状结构组织,userId只需出现一次即可,而且查找查询结果的效率也可以提高。

    另外我说的第一点是对简单查询的update,是否有必要做,就要看这种简单查询所占的比重了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • JYYCOM
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 14:29:1647楼 得分:0
    mark
    顶!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wwd252
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 14:50:4248楼 得分:0
    ding
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 14:52:1249楼 得分:0
    引用 45 楼 oldmht 的回复:
    楼主的东西不错,我这里想问一个问题,类似舍得网这样的项目,从各方面来统计,他的数据库在什么操作上用的时间最多?select?前台对应的是模糊搜索么?

    最多的自然是select,如果没有缓存,首页就有300次左右的select。
    没有模糊搜索,都是精确搜索。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 14:54:5250楼 得分:0
    引用 46 楼 brucesea 的回复:
    我的理解,可以把缓冲看成两层:下面一层是对数据库对象的缓存,比如memcached等;上面一层是对查询和其结果的缓存(查询结果即是id组成的List)。

    楼主说的lucene的B+树,mysql的内存表好像是对数据库对象的缓存组织吧

    我这儿讨论的是对查询和其结果的缓存。我所说的树状结构是对查询的结构组织。这应该会比直接几个字段拼接起来的string做散列省空间,省时间。比如楼主的第一个例子,用string空间是 userId=2046#0,5,userId=2046#5,5, userId=2046#15,5。 userId会重复出现很多次。通过对查询的树状结构组织,userId只需出现一次即可,而且查找查询结果的效率也可以提高。 【这点性能改善根本不是什么问题了,靠这点来节省内存和改善性能,有点太追求完美了,世界上没有完美的缓存】

    另外我说的第一点是对简单查询的update,是否有必要做,就要看这种简单查询所占的比重了。


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • brucesea
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 15:40:0751楼 得分:0
    引用 50 楼 bruce_lau 的回复:
    引用 46 楼 brucesea 的回复:
    我的理解,可以把缓冲看成两层:下面一层是对数据库对象的缓存,比如memcached等;上面一层是对查询和其结果的缓存(查询结果即是id组成的List)。

    楼主说的lucene的B+树,mysql的内存表好像是对数据库对象的缓存组织吧

    我这儿讨论的是对查询和其结果的缓存。我所说的树状结构是对查询的结构组织。这应该会比直接几个字段拼接起来的string做散列省空间,省时间。比如楼主的第一个例子,用str…


    我的理解是:
    和下层对数据库对象的缓存组织管理相比,上层对查询和其结果的缓存没有那么重要
    如果下层做好了,上层即使没有,再重新做查询,也都可以从下层cache中很快直接得到结果(类似于内存数据库了)。

    所以我同意楼主说的,上层即使优化很多,对整体性能可能也没有特别大的影响

    但看楼主的主要工作好像是对上层的处理,不知道对下层数据库对象的缓存组织管理有没有做什么工作
    或者有没有比较好的现成框架推荐?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Hatrim
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 15:51:2252楼 得分:0
    本地HashMap在超大规模缓存情况下。。。。。估计没戏,首先内存就不够用,大型网站提供一个服务一般都要用上几百台服务器,所以基本不会采用本地HashMap
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wind_rain
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 15:57:0253楼 得分:0
    mark first
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jlzan1314
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 16:07:2154楼 得分:0
    学习一下,我就不废话了.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lwp1493
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 16:35:3055楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chinagavin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 16:43:5356楼 得分:0
    没看,留着以后看.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kypfos
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-07-25 17:02:0957楼 得分:0
    认清一下:
    “有很多眼高手低的人总喜欢评论别人却从不会看清自己”
    不好对你评说什么
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ld2099
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 18:03:2258楼 得分:0
    厉害lihia
    学习了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • knifesky
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 19:21:0359楼 得分:0
    学习,虽然100PV/天对我来说已经足够了,但要把目光放长远.....................
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-25 19:25:1060楼 得分:0
    引用 52 楼 Hatrim 的回复:
    本地HashMap在超大规模缓存情况下。。。。。估计没戏,首先内存就不够用,大型网站提供一个服务一般都要用上几百台服务器,所以基本不会采用本地HashMap

    没错,不能有一种方案解决全部问题。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • suyiming
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-26 00:44:5661楼 得分:0
    passed
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-26 08:41:0962楼 得分:0
    有张图,看图说话比较好
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dandelionl
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-26 12:09:3863楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • langke93
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-26 14:57:0564楼 得分:0
    UP,先收藏慢慢看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xxzzpp123456
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-26 15:07:0765楼 得分:0
    顶一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wxq4100798
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-26 20:11:4366楼 得分:0
    从这篇文章中,没看明天楼猪想说明什么?如果单看图和内容,我觉得要不是我理解得有问题,要不就是楼猪表达的有问题,所正我没觉得这个有什么用
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wxq4100798
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-26 20:20:5167楼 得分:0
    理想化的东西,如果数据库关系比较复杂,楼主那个更新是要死人的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • leo10202
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-26 22:46:3468楼 得分:0
    good!我顶你

    回去试试
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • soldierluo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-27 09:35:4769楼 得分:0
    您好,有没在.net上应用的啊,会不会也做一个适用于.net的解决方案,谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • greenery
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-27 11:58:4570楼 得分:0
    好,顶上去。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • supercpu123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-27 18:00:4671楼 得分:0
    MARK下  最近可能要用到相关的知识
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jun_hongyue
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-27 18:36:2872楼 得分:0
    学习ing
    看不太懂
    以后慢慢看
    呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xjflyttp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-28 09:37:5273楼 得分:0
    还是老老实实静态html + ajax提取销量数据...二级静态ajax数据 这样需要的人力会更少吧...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • venus1120
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-28 10:38:3774楼 得分:0
    该回复于2008-09-21 09:15:28被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhongjinwen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-28 10:48:1775楼 得分:0
    引用 18 楼 bruce_lau 的回复:
    引用 13 楼 im2web 的回复:
    请教先生了, 还没看代码但是想到的问题

      在使用本地hashmap的时候,应该是多线的吧。 那么是否使用了锁呢? 如果没有,在你修改
    列表缓 长度的缓存 复杂一点的group,sum,count查询,
    的时候,正好有人在读怎么处理。如果有了,势必大量的影响性能,又是怎么处理的?

    HashMap的get和put如果加锁还不如不做缓存。你说的情况一般不会发生,你是假设N个线程同时get一个对象,此时刚好这…


    HashMap不是本来就是同步的吗?还要加锁?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zryStar
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-28 11:36:2076楼 得分:0
    引用 72 楼 jun_hongyue 的回复:
    学习ing
    看不太懂
    以后慢慢看
    呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Ilovesport
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-28 13:01:2177楼 得分:0
    引用 76 楼 zryStar 的回复:
    学习ing
    看不太懂
    以后慢慢看
    呵呵

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-28 14:44:4078楼 得分:0
    引用 66 楼 wxq4100798 的回复:
    从这篇文章中,没看明天楼猪想说明什么?如果单看图和内容,我觉得要不是我理解得有问题,要不就是楼猪表达的有问题,所正我没觉得这个有什么用

    这位仁兄还要努力啊。本人不是突发奇想搞这么个玩意,我是实战了N年觉得应该这样做,我用给你看看。:)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • proNovice
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-28 19:16:0779楼 得分:0
    先顶之,后学之...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gread3
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-28 23:40:2380楼 得分:0
    这贴收藏都感觉到有带点不解恨  先留个名吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qli
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-29 00:46:1581楼 得分:0
    是不是可以这么看,  带Hash Index 的内存数据库.
    在对于>100G 的持续更新的数据库,且用户对于主要数据没有多少重叠的应用, LZ 可不可以评价一下?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • grady0926
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-29 08:33:0782楼 得分:0
    不是很明白,但值得学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • flashboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-29 11:25:5483楼 得分:0
    回帖是一种美德!传说每天回帖即可获得 10 分可用分!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhangzunwei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-29 11:59:2384楼 得分:0
    我问下:你把数据库中的信息都缓存了,如果数据量很大的时候,内容是不是不够用呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lschou520
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-29 12:27:1985楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yellowoneone
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-29 13:18:5886楼 得分:0
    MARK
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • skycncomp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-30 08:49:1587楼 得分:0
    jf
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yanjinbin01
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-30 09:13:0788楼 得分:0
    makr
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-30 09:20:3389楼 得分:0
    引用 81 楼 qli 的回复:
    是不是可以这么看,  带Hash Index 的内存数据库.
    在对于>100G 的持续更新的数据库,且用户对于主要数据没有多少重叠的应用, LZ 可不可以评价一下?


    不用全部存到内存中,LRUMap可以设置最大长度,很久没用的对象会被逐渐挤出去。比如一个用户早上8:00开始登录一个网站,网站逐步把他用到的所有对象和列表都缓存起来,但8:30以后这个用户不再在网站上有任何动作,所以他的列表会被寄到最低端,随着用户越来越多,这个用户的列表会被挤出去,缓存里将没有他的列表缓存,如果该用户18:00又登录上来了,就再缓存一次。100G的数据,每秒中10000个用户这种情况目前还没有这么大的网站吧?这种数据是可以计算的,假设某个网站一天有1000万IP,每个用户贡献30个PV,那么一共是3亿pv,每天按12小时计算,平均每秒的pv是7000左右,不会说一秒中内突然过来1000万IP,要是这样,google也撑不住。

    某些网友说到的事务处理,本系统的确不支持,一般需要用到事务处理的也没必要做缓存了,系统当然有不足之处,但是简单实用,对安全级别要求不是特别高的(论坛、社区、博客、SNS等)都可以使用,银行系统就算了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wjlsmail
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-30 13:46:3890楼 得分:0
    Study
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cyh424
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-30 16:22:5891楼 得分:0
    Mark 学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-30 16:25:3192楼 得分:0
    不错的,帮顶,另学习。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • my22xo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-30 17:12:1593楼 得分:0
    顶,不顶不行

    支持原创!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • aiyaoo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-31 11:53:1794楼 得分:0
    引用 93 楼 my22xo 的回复:
    顶,不顶不行

    支持原创!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gzdiablo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-31 14:00:5995楼 得分:0
    顶 思路很好 简单而实用
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • c6285
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-31 14:45:2296楼 得分:0
    MARK,学习了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • opec
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-31 15:46:1997楼 得分:0

    mark
    收藏
    回复

    对于动手行动者
    我总是保持高度的敬意!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • noraml
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-31 17:30:0398楼 得分:0
    xuexi
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • daonidedie
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-01 09:24:3399楼 得分:0
    接分学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jack0511
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-01 10:46:23100楼 得分:0
    不顶不厚道!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • corsairoscar
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-01 11:30:20101楼 得分:0
    很好了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MADfox1983
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-01 13:53:02102楼 得分:0
    对数据库的了解还是比较肤浅的,先mark了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hbcfg
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-01 17:13:55103楼 得分:0
    收藏后再看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • okook
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-01 22:27:03104楼 得分:0
    不错不错,学习一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • daniaocaocao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-02 02:11:32105楼 得分:0
    先收藏有时间的时候再研究 :)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • findself
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-03 12:18:04106楼 得分:0
    copy,回去研究...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-04 11:22:22107楼 得分:0
    本人提供的是一种思路,系统还有点问题,如大规模并发的时候会有点问题,我加了一个锁Map,如果测试没有问题再发上来。我现在就是那舍得网在做测试,呵呵。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • peixiaopin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-05 16:04:11108楼 得分:0
    不支持说不过去啊。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • skyhits1921
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 14:59:50109楼 得分:0
    很好很强大.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gonxi
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 13:21:29110楼 得分:0
    你的压力能跑到多少?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhlin01
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 15:50:38111楼 得分:0
    看看,以后试试
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • z1z2z3z4
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-08 16:17:27112楼 得分:0
    map和hash_map不支持多线程,上面的系统在多线程并发情况下很容易崩溃。
    当然,不是说有并发就会崩溃,这也许是你的网站能够运行的原因吧。那么什么时候会崩溃?比如一个线程输入了key找到了元素位置(获得一个iterator),然后根据iterator读取元素的value。然而如果在读取元素的value时另一个线程修改了map或hash_map导致iterator失效,前面的线程继续用失效的iterator读取不存在的value,此时就发生崩溃。

    显然要使map和hash_map用于多线程环境,必然要引入锁。没有锁,只能说这个系统没有达到可用的程度。不过,引入锁后,性能会大幅降低。无论如何,还是要在引入锁后重新评估这个系统,并重新测量性能吧。

    另一方面,楼主用于把自己的技术心得共享出来,这个做法值得称许。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • z1z2z3z4
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-08 16:54:40113楼 得分:0
    另外,对象缓存A的有效性(命中率)恐怕也是问题。按照楼主定义,对象缓存A缓存常用行。那么,什么是常用行?如何保证列表缓存B、C、D等等能从A获得对象?

    就以论坛为例。论坛通常以主题的最新回复时间来排序。现在假设已经按一定定义选取了一批主题对象(记录行)缓存在A中。但是论坛时时有人发表新主题和回复不特定的主题,这些新发表和被回复定期的主题是否放入缓存A中?如果放入,则A会时时刻刻会被修改。不过,map和hash_map必须锁定才能修改。

    同时,列表缓存B、C、D等的arraylist的主题id的定义和A的定义是不一样的,这导致不少主题id出现在列表缓存B、C、D中,但这些id代表的对象不在A中。于是出现了这样的情况:当使用列表缓存B、C、D时会发现其id代表的对象在A中是残缺不全的,这样,必然导致对数据库的读。性能问题就在这里:当输出一页主题列表时,从A中获得90%的行,剩下10%要到数据库读取,此时读数据库使性能下降到和直接读取数据库差不多(一页主题一般在50行记录内,此时从数据库读取10%的行和全部从数据库读取行性能差不多,但使用了缓存系统则有许多性能损耗在缓存的处理出上)。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lf8289
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-09 15:30:49114楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mengweilil
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-09 15:50:58115楼 得分:0
    引用 113 楼 z1z2z3z4 的回复:
    另外,对象缓存A的有效性(命中率)恐怕也是问题。按照楼主定义,对象缓存A缓存常用行。那么,什么是常用行?如何保证列表缓存B、C、D等等能从A获得对象?

    就以论坛为例。论坛通常以主题的最新回复时间来排序。现在假设已经按一定定义选取了一批主题对象(记录行)缓存在A中。但是论坛时时有人发表新主题和回复不特定的主题,这些新发表和被回复定期的主题是否放入缓存A中?如果放入,则A会时时刻刻会被修改。不过,map和hash…

    我想,根据我访问论坛的经验,我通常只访问最近几天的帖子,所以,只要缓存最近几天的就可以了吧?

    当然这个量也不小啊,1页50个帖子,一个帖子通常十几到几十个回复,一个论坛通常几十个子论坛。
    50(条/页)×20(条回复)×20(个子论坛)=20000.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • z1z2z3z4
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-09 17:49:00116楼 得分:0
    “最近几天”对于大多数论坛一般是按回复时间先后排序,从而得出列表行。

    列表缓存B的KEY为start=0,length=15#active=0#state=0之类,表示有多种逻辑条件参与查询主题和排序,不仅仅是回复时间一种条件。当列表缓存B的逻辑条件与“最近几天”不一致时,缓存B中主题ID代表的对象就不会存在于对象缓存A中。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hj246
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-12 18:35:10117楼 得分:0
    go
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • real_jake
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-15 16:28:48118楼 得分:0
    对于读请求怎么做缓存都可以,但复杂之后,对数据同步会带来问题,想了解一下,楼主是怎么考虑的。
    例如删除了db中某一个id列,对象缓存同步删除,这时列表缓存的id序列不管是否同步,数据都不正确,因为假设原来limit 0,100,现在可能只剩下80条(20条被db update或del掉),查询时是根据这个80条+db的20条记录 merge为100条吗?
    另外,按时间排序的列表请求,新插入一条记录,会导致后面cache的limit 0,100, 100.200等id列表全部需要更新,因为id已经错位,不知道楼主是怎么解决?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • airermeng
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-23 17:12:40119楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zwc1999
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-24 10:20:57120楼 得分:0
    学习中!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • VirtualDesktop
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-27 13:43:59121楼 得分:0
    引用 39 楼 bruce_lau 的回复:
    引用 31 楼 im2web 的回复:
    我关心是是update 的情况, update, 造成了可能需要对你的hashmap的记录进行操作, 比如需要删除1条,插入1条,那么此时如果有线程正在里面读会被删除的那条,可能就会崩溃了。当然延后删除是一个方案,但是并不保险。

    HashMap的get和put还要考虑这些问题吗?HashMap的get或remove都在1/1000000秒级别就完成了,这么短的时间内即使有并发也不会崩溃,这种情况很难发生,我是这么认为的。

    ....如果你是这么认为...那只能说你对大规模并发系统的理解还不够深啊,如果你的网站真的达到了你的标题所说的那个数据库访问量,出现这个问题就是你这个数据系统上线后10秒以内的事情
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • VirtualDesktop
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-27 13:46:59122楼 得分:0
    你的缓存思路是很好
    但是你漏了考虑锁,锁才是这类系统设计的大问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liangqingzhi
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 3

      10

      7

    发表于:2008-09-27 20:43:17123楼 得分:0
    看看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tastelife
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-29 16:37:51124楼 得分:0
    引用 121 楼 VirtualDesktop 的回复:
    引用 39 楼 bruce_lau 的回复:
    引用 31 楼 im2web 的回复:
    我关心是是update 的情况, update, 造成了可能需要对你的hashmap的记录进行操作, 比如需要删除1条,插入1条,那么此时如果有线程正在里面读会被删除的那条,可能就会崩溃了。当然延后删除是一个方案,但是并不保险。

    HashMap的get和put还要考虑这些问题吗?HashMap的get或remove都在1/1000000秒级别就完成了,这么短的时间内即使有并发也不会崩溃,这种情况很难发…


    根据我的经验,问题很严重。
    楼主用了“认为”等词。
    不知道楼主是怎样做测试的?
    是没有出现问题,还是没有做?
    把作品拿出来是好事,但应该实事求是
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cooolchen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-06 16:08:39125楼 得分:0
    顶了,有空再看看!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ihualan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-07 17:14:52126楼 得分:0
    支持~ 

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kuangerzhai
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-08 19:22:43127楼 得分:0
    虽然不太懂,但还是来支持一下!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • diggywang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-13 11:16:08128楼 得分:0
    引用 39 楼 bruce_lau 的回复:
    引用 31 楼 im2web 的回复:
    我关心是是update 的情况, update, 造成了可能需要对你的hashmap的记录进行操作, 比如需要删除1条,插入1条,那么此时如果有线程正在里面读会被删除的那条,可能就会崩溃了。当然延后删除是一个方案,但是并不保险。

    HashMap的get和put还要考虑这些问题吗?HashMap的get或remove都在1/1000000秒级别就完成了,这么短的时间内即使有并发也不会崩溃,这种情况很难发生,我是这么认为的。



    除非你的“缓存系统”保证是单线程访问,否则如果HashMap不做线程安全处理,1/1000000秒足够有可能让系统崩溃,如果你的系统还没出问题,说明你的实际并发量很小,压力测试做的并不持久。解决方法有两个:synchronized HashMap,或者使用ConcurrentHashMap。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bruce_lau
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-16 14:17:17129楼 得分:0
    引用 31 楼 im2web 的回复:
    引用 18 楼 bruce_lau 的回复:
    引用 13 楼 im2web 的回复:
    请教先生了, 还没看代码但是想到的问题

    在使用本地hashmap的时候,应该是多线的吧。 那么是否使用了锁呢? 如果没有,在你修改
    列表缓 长度的缓存 复杂一点的group,sum,count查询,
    的时候,正好有人在读怎么处理。如果有了,势必大量的影响性能,又是怎么处理的?

    HashMap的get和put如果加锁还不如不做缓存。你说的情况一般不会发生,你是假设N个线程…



    本人错了,本人收回说过的话,HashMap需要考虑并发,不然会有大问题,用synchronizedMap包一下就可以了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • csrcom
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-19 19:43:44130楼 得分:0
    搂主干劲实在不错。我这儿几个问题,我想你以后绝对会遇到的
    1、当Map中存放过多对象比如100w以上,性能将下降

    2、java内存使用过多将导致GC频繁,jvm中的对象实例过多也将导致严重的性能下降,只所以目前java的cache 项目没有推广的那么广泛,这个是很大的因数。

    3、延迟Update不知道会是什么机制?

    3、A、B 服务器是平等的, A服务器更新了cache中 C 的对象,那么B服务器C对象什么时候需要更新或者被移除,B服务器难道要保持着脏数据?

    本地cache其实在使用场景中受到很大制约因数,比如数据基本保持不变的或者用户不太在意的更新。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wingfeng19800215
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-19 22:11:17131楼 得分:0
    怎么下载,不是开源的吗!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • AK_Fish
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-20 11:35:40132楼 得分:0
    写的很好。。。感觉不错。。。不过还没试过。。。。
    想把你这个放到我们的框子架里用。。。不知道行不行。。现在没时间试。。
    修改 删除 举报 引用 回复