现在有一个项目,按照不同的城市,数据保存在三个结构相同,但是数据内容不同的数据库里面。由于每个库里面都有一个表(暂时叫 A1,A2,A3)被访问查询非常频繁,所以现在考虑做一个缓存服务器。
开始的时候我也考虑过memcache等。。不过由于看到这些缓存方法都是按照key-->value方式存储,且不能支持sql查询。所以放弃。
最后考虑自己使用简单方法搭建一个缓存服务器,方法为:
1、专门购买一台服务器作为缓存服务器。
2、缓存服务器上设计一个站点,比如cache.abc.com这样的
3、站点内建立一个名为cache的webservice
4、每次站点启动的时候在gloabl.asax里面直接启动缓存初始化服务--具体的就是把三个库内的A1,A2,A3缓存到该服务器内存中。
5、当用户对表A1,A2,A3更新的时候,同时通过webservice更新缓存的table
6、用户对表查询的时候只通过webservice在缓存中查找。
7、查询的时候,webservice通过获取相应的缓存数据,使用DataTable的筛选功能去完成查询,并且返回数据。
请问我这样的设计算不算是一个缓存服务器?或者说如果要实现我这样的功能有什么免费的软件之类的,非常感谢!
希望大家能给点具体的意见。
开始的时候我也考虑过memcache等。。不过由于看到这些缓存方法都是按照key-->value方式存储,且不能支持sql查询。所以放弃。
最后考虑自己使用简单方法搭建一个缓存服务器,方法为:
1、专门购买一台服务器作为缓存服务器。
2、缓存服务器上设计一个站点,比如cache.abc.com这样的
3、站点内建立一个名为cache的webservice
4、每次站点启动的时候在gloabl.asax里面直接启动缓存初始化服务--具体的就是把三个库内的A1,A2,A3缓存到该服务器内存中。
5、当用户对表A1,A2,A3更新的时候,同时通过webservice更新缓存的table
6、用户对表查询的时候只通过webservice在缓存中查找。
7、查询的时候,webservice通过获取相应的缓存数据,使用DataTable的筛选功能去完成查询,并且返回数据。
请问我这样的设计算不算是一个缓存服务器?或者说如果要实现我这样的功能有什么免费的软件之类的,非常感谢!
希望大家能给点具体的意见。
解决方案 »
- datagride用法
- 关于HTML里触发事件隐藏td
- GridView中的Template与其他页面控件比较,找不到控件?
- 关于页面刷新,控件存值的问题,急呀
- 请问在web里怎么判断一个客户端的机子有没有注册一个动态库文件???????
- 紧急求助,datagrid分页后过滤报错!!!,高手帮忙看看
- 急急急!!!怎样下面的JS静态分页显示数据库中的数据,怎么写?
- 迷茫!我是考研还是继续工作......
- webmatrixhost.net还可以申请嘛????
- 请各位救急:如何让一个Web窗体启动完毕之后使它的一个文本框获得焦点?
- Gridview控件绑定dropdownList问题 急啊
- 关于ASP.NET 伪静态
不是很懂,算学习了.
Cache放那里?还不是存在内存里.
A1,A2,A3数据量大吗
你这样设计架构的话,就是一个问题了。一般而言,分层设计的原则就是将业务和数据分离,相互的操作通过统一的接口进行。比如,UI层要查询,都是通过调用Web Service来获得数据,那么,你返回给UI的是缓存还是数据库拿回来的表,就由Web Service来决定了。我的意思是,缓存机制就可以在Web Service里面切入。而按照你的描述,我的理解是,你的UI有多种途径来获得数据,你的想法是当UI更改了数据以后,再通知Web Service修改缓存。。我觉得这样的逻辑是比较混乱的。
说到缓存机制,基于你的架构,我看到的解决方法有2个:
1)如果A1,A2,A3加起来的数据量不大(例如几个G)可以考虑缓存到内容。
case 1:查询。当Web Service接收到查询请求时,先检查本机的缓存是否有记录。如有,就根据页码返回一页数据。如果没有,就根据城市决定是去A1/A2还是A3去取数据,取回来后缓存下来,再返回数据给终端case 2:修改。当Web Service接收到修改请求时,根据城市决定去哪张表修改。修改完后,将修改后的内容缓存在本机。以此类推。次缓存服务器需要设计一个机制什么时候清除缓存中的什么数据。一般的设计方法是,当某种情况(例如内存还剩500M,或者缓存容量大于多少G时)发生时,运行一个清除的操作(例如把操作次数小于100的记录从缓存中删除,然后再将剩余的操作计数清零)。。这些机制可以通过写一个服务进程(可靠),或者用ASP.NET的timer(不可靠,不一定保证执行)也行。根据你自己的需求2)如果A1+A2+A3很大,则可考虑用数据库来代替内存。也就是用一张总表来记录缓存。case 1:查询。当Web Service接收到查询请求时,先检查本机的总表是否有记录。如有,就根据页码返回一页数据。如果没有,就根据城市决定是去A1/A2还是A3去取数据,取回来后缓存下来,写入总表,再返回数据给终端case 2:修改。当Web Service接收到修改请求时,根据城市决定去哪张表修改。修改完后,将修改后的内容更新在总表。同样,也需要有一个机制去决定怎么删除总表中长期没被使用的数据,以保证缓存容量不会爆。
用lock啊,lock可以保证所有的线程不会冲突
lock (this) {
......
}
如果你想处理得好一点,避免“死锁”可以用Monitor对象
这是细节设计里的一项目。。基本上跟缓存机制是没有冲突的。。
如果你说用文件来做缓存的话。。我建议你直接用数据库吧。.NET里对数据库的优化之后。。其实差别不是太明显,特别是查询频率怎么密的应用。。数据库是首选
我考虑了一下用数据库来做缓存的方法,不过还是有个地方难以明了,如果用数据库来做缓存查询的话,应该是用一张缓存表了,可是我这个平台,查询频率相当的频繁,而且,查询条件组合非常多,这样的话,一个问题就是导致这个表可能会很大,另外,在缓存过期以及新加入缓存的时候,如果并发产生频繁的insert插入,以及更大量的select,死锁似乎难以避免?
看来还是需要衡量下那种方式更合适了,因为本意做缓存就是想分担数据库压力的不过不管怎么样,都要谢谢superplayboy了,给分