1.高性能文件缓存key-value存储—Redis
2.ASP.NET HttpRuntime.Cache缓存类使用总结
备注:三篇博文结合阅读,简单理解并且使用,如果想深入学习,请多参考文章中给出的博文地址。
1.前言
a.Memcached是一个高性能的分布式缓存系统,用于Web应用减轻数据库负载,它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高网站的访问速度。
b.Memcached是一个给予存储键/值对的HashMap,底层使用C语言完成,但是客户端可以使用任何语言来编写(Java,.NET,PHP).
c.Memcached中的数据都是存储在memcached内置的内存存储空间中,由于数据仅存在于内存中,因此当某个服务器停止运行或者出现问题之后,所有存放在服务器上的键/值对都会丢失。
d.下面这幅图可以说明Memcached的工作过程,当首次访问系统的时候,系统从数据库中取得数据保存到Memcached中,在第二次访问的时候则直接从Memcached中读取出来需要的值信息。
e.Memcached的特征
Memcached作为高速运行的分布式缓存服务器,具有以下的特点:
e.1:协议简单(客户端通信并不是使用复杂的XML格式,而是使用简单的基于文本行的协议)
e.2:基于libevent的事件处理(libevent是一个程序库,即使服务器的连接数增加,也能发挥o(1)的性能)
e.3:内置内存存储方式(c中已经描述)
e.4:Memcached不互相通信的分布式。
f.推荐阅读,http://kb.cnblogs.com/page/42731/
g.Github下载地址:https://github.com/kencery/Common/blob/master/KenceryCommonMethod/%E7%BC%93%E5%AD%98
2.封装代码调用描述
1 // 源文件头信息: 2 // <copyright file="MemcacheHelper.cs"> 3 // Copyright(c)2014-2034 Kencery.All rights reserved. 4 // 个人博客:http://www.cnblogs.com/hanyinglong 5 // 创建人:韩迎龙(kencery) 6 // 创建时间:2015-4-24 7 // </copyright> 8 using System; 9 using System.Configuration; 10 using Memcached.ClientLibrary; 11 12 namespace KenceryCommonMethod 13 { 14 /// <summary> 15 /// 封装使用Memchached信息,读取缓存存放在服务器 16 /// <auther> 17 /// <name>Kencery</name> 18 /// <date>2015-4-24</date> 19 /// </auther> 20 /// </summary> 21 public class MemcacheHelper 22 { 23 /// <summary> 24 /// 字段_instance,存放注册的缓存信息 25 /// </summary> 26 private static MemcacheHelper _instance; 27 28 /// <summary> 29 /// 缓存客户端 30 /// </summary> 31 private readonly MemcachedClient _client; 32 33 /// <summary> 34 /// 受保护类型的缓存对象,初始化一个新的缓存对象 35 /// </summary> 36 protected MemcacheHelper() 37 { 38 //读取app.Config中需要缓存的服务器地址信息,可以传递多个地址,使用","分隔 39 string[] serverList = ConfigurationManager.AppSettings["Memcached.ServerList"].Split(','); 40 try 41 { 42 var sockIoPool = SockIOPool.GetInstance(); 43 sockIoPool.SetServers(serverList); 44 sockIoPool.InitConnections = 3; 45 sockIoPool.MinConnections = 3; 46 sockIoPool.MaxConnections = 50; 47 sockIoPool.SocketConnectTimeout = 1000; 48 sockIoPool.SocketTimeout = 3000; 49 sockIoPool.MaintenanceSleep = 30; 50 sockIoPool.Failover = true; 51 sockIoPool.Nagle = false; 52 //实例化缓存对象 53 _client = new MemcachedClient(); 54 } 55 catch (Exception ex) 56 { 57 //错误信息写入事务日志 58 throw new Exception(ex.Message); 59 } 60 } 61 62 /// <summary> 63 /// 获取缓存的实例对象,方法调用的时候使用 64 /// </summary> 65 /// <returns></returns> 66 public static MemcacheHelper GetInstance() 67 { 68 return _instance; 69 } 70 71 /// <summary> 72 /// 添加缓存信息(如果存在缓存信息则直接重写设置,否则添加) 73 /// 使用:MemcacheHelper.GetInstance().Add(key,value) 74 /// </summary> 75 /// <param name="key">需要缓存的键</param> 76 /// <param name="value">需要缓存的值</param> 77 public void Add(string key, object value) 78 { 79 if (_client.KeyExists(key)) 80 { 81 _client.Set(key, value); 82 } 83 _client.Add(key, value); 84 } 85 86 /// <summary> 87 /// 添加缓存信息 88 /// 使用:MemcacheHelper.GetInstance().Add(key,value,Datetime.Now()) 89 /// </summary> 90 /// <param name="key">需要缓存的键</param> 91 /// <param name="value">需要缓存的值</param> 92 /// <param name="expiredDateTime">设置的缓存的过时时间</param> 93 public void Add(string key, object value, DateTime expiredDateTime) 94 { 95 _client.Add(key, value, expiredDateTime); 96 } 97 98 /// <summary> 99 /// 修改缓存的值 100 /// 使用:MemcacheHelper.GetInstance().Update(key,value) 101 /// </summary> 102 /// <param name="key">需要修改的键</param> 103 /// <param name="value">需要修改的值</param> 104 public void Update(string key, object value) 105 { 106 _client.Replace(key, value); 107 } 108 109 /// <summary> 110 /// 修改缓存的值 111 /// 使用:MemcacheHelper.GetInstance().Update(key,value,Datetime.Now()) 112 /// </summary> 113 /// <param name="key">需要修改的键</param> 114 /// <param name="value">需要修改的值</param> 115 /// <param name="expiredDateTime">设置的缓存的过时时间</param> 116 public void Update(string key, object value, DateTime expiredDateTime) 117 { 118 _client.Replace(key, value, expiredDateTime); 119 } 120 121 /// <summary> 122 /// 设置缓存 123 /// 使用:MemcacheHelper.GetInstance().Set(key,value) 124 /// </summary> 125 /// <param name="key">设置缓存的键</param> 126 /// <param name="value">设置缓存的值</param> 127 public void Set(string key, object value) 128 { 129 _client.Set(key, value); 130 } 131 132 /// <summary> 133 /// 设置缓存,并修改过期时间 134 /// 使用:MemcacheHelper.GetInstance().Set(key,value,Datetime.Now()) 135 /// </summary> 136 /// <param name="key">设置缓存的键</param> 137 /// <param name="value">设置缓存的值</param> 138 /// <param name="expiredTime">设置缓存过期的时间</param> 139 public void Set(string key, object value, DateTime expiredTime) 140 { 141 _client.Set(key, value, expiredTime); 142 } 143 144 /// <summary> 145 /// 删除缓存 146 /// 使用:MemcacheHelper.GetInstance().Delete(key) 147 /// </summary> 148 /// <param name="key">需要删除的缓存的键</param> 149 public void Delete(string key) 150 { 151 _client.Delete(key); 152 } 153 154 /// <summary> 155 /// 获取缓存的值 156 /// 使用:MemcacheHelper.GetInstance().Get(key) 157 /// </summary> 158 /// <param name="key">传递缓存中的键</param> 159 /// <returns>返回缓存在缓存中的信息</returns> 160 public object Get(string key) 161 { 162 return _client.Get(key); 163 } 164 165 /// <summary> 166 /// 缓存是否存在 167 /// 使用:MemcacheHelper.GetInstance().KeyExists(key) 168 /// </summary> 169 /// <param name="key">传递缓存中的键</param> 170 /// <returns>如果为true,则表示存在此缓存,否则比表示不存在</returns> 171 public bool KeyExists(string key) 172 { 173 return _client.KeyExists(key); 174 } 175 176 /// <summary> 177 /// 注册Memcache缓存(在Global.asax的Application_Start方法中注册) 178 /// 使用:MemcacheHelper.RegisterMemcache(); 179 /// </summary> 180 public static void RegisterMemcache() 181 { 182 if (_instance == null) 183 { 184 _instance = new MemcacheHelper(); 185 } 186 } 187 } 188 }