Asp.net mvc 网站之速度优化 -- Memcache
前一章说了一下使用页面缓存的问题,这次说一下数据缓存,我们使用的是Memcache作为数据缓存。
下面弱弱地引用一下百度百科关于Memcache的定义:
Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。Memcache是danga的一个项目,最早是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。
1.Memcache服务器端的安装与启动
- 下载memcache,我们使用的版本是1.2.5。
- 使用命令行方式安装memcached-1.2.5.exe: memcached-1.2.5.exe -d install
- 启动memcached: memcached-1.2.5.exe -d start
- 确认Windows 服务中memcached服务已经安装成功:
- 需要注意的是memcached服务是使用的11211端口,如果开启了防火墙,需要将11211添加到例外中。
2.网站中配置BeITMemcached
- 下载BeITMemcached_source_2010_08_04.zip, 并编译出BeITMemcached的DLL文件添加到项目的解决方案中:
- 配置Web.Config
<!– 第三方的组件配置–>
<configSections>
<section name=”beitmemcached” type=”System.Configuration.NameValueSectionHandler” />
</configSections>
<beitmemcached>
<add key=”MemcachedConfig” value=”localhost” />
</beitmemcached>
我们目前的访问量还不是很大,因此将Memcached与网站部署在一台机器上,使用的是localhost. 如果网站和Memcache部署在不同机 器,这里的value 就应该是memcached所在机器的IP,请再次确认11211端口可以访问。
3. Memcache在业务代码中的设计
前面把配置都弄完了,现在需要说一下Memcache在业务代码中的设计了。我们使用的是Controller->Service->Model的模式,切入点就在Service层。
首先构造一个接口ICachePolicy:
2
3 void Add<T>(string key, T value);
4
5 void Add<T>(string key, T value, DateTime dt);
6
7 T Get<T>(string key);
8
9 void Add(string key, object value);
10
11 void Add(string key, object value, DateTime dt);
12
13 object Get(string key);
14
15 void Delete(string key);
16
17 }
接着实现MemcachedCachePolicy实现ICachePlolicy:
1 public class MemcachedCachePolicy : ICachePolicy
3 private static readonly ILog Logger = LogManager.GetCurrentClassLogger();
4
5 private readonly MemcachedClient _cache;
6
7 public MemcachedCachePolicy()
8 {
9 _cache = MemcachedClient.GetInstance("MemcachedConfig");
10
11 _cache.MaxPoolSize = 10000;
12 }
13
14 public void Add<T>(string key, T value)
15 {
16 if (_cache.Set(key, value))
17 {
18 Logger.Debug("Set _cache for key successed, key[" + key + "]");
19 }
20 else
21 {
22 Logger.Debug("Set _cache for key failed");
23 }
24 }
25
26 public void Add<T>(string key, T value, DateTime dt)
27 {
28 _cache.Set(key, value, dt);
29 }
30
31 public T Get<T>(string key)
32 {
33 try
34 {
35 return (T)_cache.Get(key);
36 }
37 catch (Exception e)
38 {
39 Logger.Debug("Get _cache for key failed, key[" + key + "]", e);
40 _cache.Delete(key);
41 return default(T);
42 }
43 }
44
45 public void Add(string key, object value)
46 {
47 _cache.Set(key, value);
48 }
49
50 public void Add(string key, object value, DateTime dt)
51 {
52 _cache.Set(key, value, dt);
53 }
54
55 public object Get(string key)
56 {
57 return _cache.Get(key);
58 }
59
60 public void Delete(string key)
61 {
62 _cache.Delete(key);
63 }
64 }
2 {
3 protected readonly ICachePolicy _cachePolicy;
4
5 protected BaseCacheService()
6 {
7
8 }
9
10 protected BaseCacheService(ICachePolicy cachePolicy)
11 {
12 _cachePolicy = cachePolicy;
13 }
14
15 protected T GetCache<T>(string key) where T: class
16 {
17 return _cachePolicy.Get<T>(key);
18 }
19
20 protected void Add<T>(string key, T items)
21 {
22 _cachePolicy.Add(key, items);
23 }
24
25 protected T GetOrAdd<T>(string key, T loadedItems) where T : class
26 {
27 var items = _cachePolicy.Get<T>(key);
28
29 if (items == null)
30 {
31 _cachePolicy.Add(key, loadedItems);
32 return loadedItems;
33 }
34
35 return items;
36 }
37
38 protected T GetOrAdd<T>(string key, Func<T> howToGet) where T : class
39 {
40 var items = _cachePolicy.Get<T>(key);
41
42
43 if (items == null)
44 {
45 var loadedItems = howToGet();
46 _cachePolicy.Add(key, loadedItems);
47 return loadedItems;
48 }
49
50 var type = items.GetType();
51 if (type == typeof(int) && items.Equals(0))
52 {
53 var loadedItems = howToGet();
54 _cachePolicy.Add(key, loadedItems);
55 return loadedItems;
56 }
57
58 return items;
59 }
60
61 protected T GetOrAdd<T>(string key, Func<T> howToGet, DateTime dt) where T : class
62 {
63 var items = _cachePolicy.Get<T>(key);
64 if (items == null)
65 {
66 var loadedItems = howToGet();
67 _cachePolicy.Add(key, loadedItems, dt);
68 return loadedItems;
69 }
70
71 var type = items.GetType();
72 if (type == typeof(int) && items.Equals(0))
73 {
74 var loadedItems = howToGet();
75 _cachePolicy.Add(key, loadedItems, dt);
76 return loadedItems;
77 }
78 return items;
79 }
80 }
posted on 2011-06-16 15:59 enjoyeclipse 阅读(6476) 评论(28) 编辑 收藏 举报