衡量缓存一个很重要的指标 —— 命中率,如果命中率很低,还不如不用缓存。
苦恼极了,我们数据库 服务器 16GB 内存,好像是固态硬盘
就这样的配置,竟然支撑不起来日访问量 20 万的 网站,我很纳闷
@foxidea: 建议优化数据查询与索引,用SQL Server Profiler找出执行时间长的查询,然后分析执行计划,优化索引。先查一下,是不是有where中用到的列没有建立索引。
Cache 占用的是内存,如果Cache过大的话内存会比较紧张,这时Cache回收会很快,并不能提高效率,这跟用Cache的初衷就相违背了,所以最好还是控制一下
那怎么缓解数据库的压力呢?
到底该怎么做呢?
如果我把几张表( Datatable)缓存到 Cache 里面,这样整个站点 只有几个 被缓存了
不过表的数据量比较大,40 万条记录,而且每天增加中,访问数据库 肯定不行啊
或者我把 数据库里的表,按照ID 缓存
如:
ID为 1——100000 我用一个Cache 缓存起来,
ID为 100001-200000 用一个Cache 缓存
这样你觉得可行不?这样整个站点也就一两百个Cache
不过Cache 要定时从数据库里面去更新数据
@foxidea:
缓解数据库压力的方法很多,用缓存,索引优化,分表,优化查询语句,用一定的冗余段来用空间换时间等等
@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];
}
}
}
根据缓存速度、命中率,设计缓存一级、二级缓存。当然还有算法(程序和数据库设计等),还有前端js和css 对浏览器的顺序加载、代码质量等
说的太对了,我之前把每个页面(大概4万个页面)的 评论都用一个cache 缓存起来,以为可以提高性能,发现评论的速度慢的一笔,写入要十几秒(我写入之后重新从数据库里面读取一下数据到 缓存里面)
刚才更改为 直接访问数据库 速度快多了
分享个想法: 有一个大小受限的缓存池, 里面缓存的生存周期是:只有在指定间隔内还有人访问, 就持续缓存。 然后过滤掉超过指定间隔外的缓存。 这样虽然无法将你的数据全部缓存,但是也一定程度上减轻了服务器的压力。
但是在这样做之前,要统计下数据的访问率, 看是不是有那么一批是被经常访问的? 还有些只是零散访问的?
还有,数据更新后,要同步更新缓存。
-----------------------------------------------
还有一个想法: 你的数据重点是查询,还是做更新等操作? 如果是重点在于查询。 那就直接维护一个静态页面集。 将生成的页面写成静态 html 文件。 每个html文件都应该有一个标记,标记它的生成时间。 然后有个程序在不停的扫描这个文件集, 发现有数据库中的数据比之更新的,就重新生成它。
。。。
学习了。。。