使用文件缓存减少对数据库的操作

来源:互联网 发布:java定义一个方法 编辑:程序博客网 时间:2024/05/04 21:17

最近我们的主数据库当前连接数超过400,客户端连接经常超时,Cpu波动较大,四台MemCached (每台32G) 已经不够用,命中率也较低。该数据库服务器是每天4亿PV的核心。我们优化数据库后。开发了文件缓存系统。

某个页面第一次接受用户访问时将数据库中获取到的内容转化成字符串文件的形式,并且存储在服务器硬盘当中,当后面的人再来访问时先读取本地Cache,如果获取不到只需要直接读取物理文件的内容即可,从而达到减少数据库操作的目的.

 

先看一下流程图:

 

 

 

使用文件缓存肯定一个读/写冲突,并发的问题,特别像我们这么大访问的频道

 

1.      解决读写冲突方法 
Get
获取物理时
1
à判断文件锁.Lock是否存在à如果存在表示该文件正在被写中.不获取.否则就获取
2
à读取时中间已加上HttpCache.防止不停地在读.造成I/O过高.

 

Set 写入物理文件

1à使用读取锁ReaderWriterLock _locker = newReaderWriterLock(); //读取锁
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