首页 新闻 会员 周边 捐助

大量使用 Cache 有什么 坏处?怎么最优化的去使用Cache?

0
[已解决问题] 解决于 2012-04-28 09:53

因为直接访问数据库,数据库压力很大

所以我用了.net 的Cache 大量的使用这个东西

每一个页面都用了 10 个左右的缓存

大概有几万个页面,不知道怎么样??

fun5的主页 fun5 | 初学一级 | 园豆:4
提问于:2012-03-05 11:58
< >
分享
最佳答案
1

衡量缓存一个很重要的指标 —— 命中率,如果命中率很低,还不如不用缓存。

奖励园豆:5
dudu | 高人七级 |园豆:29618 | 2012-03-05 13:40

苦恼极了,我们数据库 服务器 16GB 内存,好像是固态硬盘

就这样的配置,竟然支撑不起来日访问量 20 万的 网站,我很纳闷

fun5 | 园豆:4 (初学一级) | 2012-03-05 13:49

@foxidea: 建议优化数据查询与索引,用SQL Server Profiler找出执行时间长的查询,然后分析执行计划,优化索引。先查一下,是不是有where中用到的列没有建立索引。

dudu | 园豆:29618 (高人七级) | 2012-03-05 13:57
其他回答(6)
0

Cache 占用的是内存,如果Cache过大的话内存会比较紧张,这时Cache回收会很快,并不能提高效率,这跟用Cache的初衷就相违背了,所以最好还是控制一下

artwl | 园豆:16736 (专家六级) | 2012-03-05 12:53

那怎么缓解数据库的压力呢?

到底该怎么做呢?

如果我把几张表( Datatable)缓存到 Cache  里面,这样整个站点 只有几个 被缓存了

不过表的数据量比较大,40 万条记录,而且每天增加中,访问数据库 肯定不行啊

 

或者我把 数据库里的表,按照ID 缓存

如:

ID为 1——100000 我用一个Cache 缓存起来,

ID为 100001-200000 用一个Cache 缓存

这样你觉得可行不?这样整个站点也就一两百个Cache

不过Cache 要定时从数据库里面去更新数据

支持(0) 反对(0) fun5 | 园豆:4 (初学一级) | 2012-03-05 13:00

@foxidea: 

缓解数据库压力的方法很多,用缓存,索引优化,分表,优化查询语句,用一定的冗余段来用空间换时间等等

支持(0) 反对(0) artwl | 园豆:16736 (专家六级) | 2012-03-05 13:04

@artwl: 

这样应该会好很多了???

 

        public void xx()
{
CacheHelper c = new CacheHelper("使命召唤专题");

string key = "articleTop10";
object cacheTable = c.Get(key);
DataTable Dt;
if (cacheTable == null)
{
SQLHelper h = new SQLHelper();
Dt = h.Select("select top 10 ID,Title from Article order by id desc");
c.Add(key, Dt);
}
else
{
Dt = (DataTable)cacheTable;
}
}



 

    public class CacheHelper
{

Hashtable _hashtable;
///<summary>
/// 定义一个缓存
///</summary>
///<param name="mKey">主Key</param>
public CacheHelper(string mKey)
{
object cacheObj = HttpRuntime.Cache.Get(mKey);
if (cacheObj == null || cacheObj == DBNull.Value)
{
_hashtable = new Hashtable();
HttpRuntime.Cache.Insert(mKey, _hashtable, null, DateTime.Now.AddHours(2), TimeSpan.Zero);
}
else
{
_hashtable = (Hashtable)cacheObj;
}


}

public void Add(string key, object value)
{
_hashtable.Add(key, value);
}

public object Get(string key)
{
if (_hashtable[key] == null)
{
return null;
}
else
{
return _hashtable[key];
}
}
}
支持(0) 反对(0) fun5 | 园豆:4 (初学一级) | 2012-03-05 16:19
0

根据缓存速度、命中率,设计缓存一级、二级缓存。当然还有算法(程序和数据库设计等),还有前端js和css 对浏览器的顺序加载、代码质量等

慧☆星 | 园豆:5722 (大侠五级) | 2012-03-05 14:21

说的太对了,我之前把每个页面(大概4万个页面)的 评论都用一个cache 缓存起来,以为可以提高性能,发现评论的速度慢的一笔,写入要十几秒(我写入之后重新从数据库里面读取一下数据到 缓存里面)

刚才更改为 直接访问数据库 速度快多了

支持(0) 反对(0) fun5 | 园豆:4 (初学一级) | 2012-03-05 15:35
0

分享个想法: 有一个大小受限的缓存池, 里面缓存的生存周期是:只有在指定间隔内还有人访问, 就持续缓存。 然后过滤掉超过指定间隔外的缓存。  这样虽然无法将你的数据全部缓存,但是也一定程度上减轻了服务器的压力。

但是在这样做之前,要统计下数据的访问率, 看是不是有那么一批是被经常访问的? 还有些只是零散访问的?

还有,数据更新后,要同步更新缓存。

-----------------------------------------------

还有一个想法: 你的数据重点是查询,还是做更新等操作? 如果是重点在于查询。 那就直接维护一个静态页面集。 将生成的页面写成静态 html 文件。   每个html文件都应该有一个标记,标记它的生成时间。  然后有个程序在不停的扫描这个文件集, 发现有数据库中的数据比之更新的,就重新生成它。

sunshaozong | 园豆:325 (菜鸟二级) | 2012-03-05 14:36
0

Cache虽好,但不能乱用——要有选择和针对性的去用,而且要结合自己网站目前的情况及服务器硬件配置等做权衡考虑,可参考博文:高性能web开发经验分享

know-more | 园豆:106 (初学一级) | 2012-03-05 15:21
0

。。。

顾晓北 | 园豆:10898 (专家六级) | 2012-03-05 17:19
0

学习了。。。

KivenRo | 园豆:1734 (小虾三级) | 2012-03-05 20:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册