最近我们的主数据库当前连接数超过 400, 客户端连接经常超时 ,Cpu 波动较大,四台MemCached (每台32G) 已经不够用,命中率也较低。该数据库服务器是每天4亿PV的核心。我们优化数据库后。开发了文件缓存系统。
某个页面第一次接受用户访问时将数据库中获取到的内容转化成字符串文件的形式,并且存储在服务器硬盘当中,当后面的人再来访问时先读取本地 Cache, 如果获取不到只需要直接读取物理文件的内容即可,从而达到减少数据库操作的目的 .
先看一下流程图 :
使用文件缓存肯定一个读 / 写冲突,并发的问题 , 特别像我们这么大访问的频道
1.
解决读写冲突方法
Get 获取物理时
1 à 判断文件锁 .Lock 是否存在 à 如果存在表示该文件正在被写中 . 不获取 . 否则就获取
2 à 读取时中间已加上 HttpCache. 防止不停地在读 . 造成 I/O 过高 .
Set 写入物理文件
1 à 使用读取锁 ReaderWriterLock _locker = new ReaderWriterLock (); // 读取锁
2 à _locker.AcquireWriterLock(TimeSpan .FromSeconds(3));
// 写锁定(写入时间最大允许在3 秒内完成,超时立即退出)
3 à 创建一个.lock 的物理文件, 表示该文件正在被创建
4 à 创建缓存物理文件
5 à 删除.lock 物理文件
6 à _locker.ReleaseWriterLock(); // 释放写锁定
源代码:
FileCache.cs
HttpCache.cs
demo.aspx
另外需要Newtonsoft.Json.Net20.dll 类库。这时上传不了。如果需要,请发邮件联系我:duanxiaoyong@3g.net.cn
或Msn:web718@hotmail.com