B/S开发框架缓存的作用是只在数据第一次被访问时才从数据库中读取数据,将数据放在内存中,以后查询相同的数据则直接从内存中返回,这样速度有明显的提升。Web开发框架在数据更改时更改内存数据,同时或者规定的延时内更改数据库对应的数据,从而实现缓存和数据库数据同步。基本原理是用空间换时间,我们重点看下下面代码如何做的。
B/S开发框架objectcache代码如下:
/// <summary> /// /// </summary> public class RedisStrategy:ICacheStrategy { IDatabase _database; IServer _server; public RedisStrategy() { string host = Config.GetStr("CacheHost"); if (string.IsNullOrEmpty(host)) { throw new Exception("CacheHost Is Error"); } ConnectionMultiplexer connect = ConnectionMultiplexer.Connect(host); _database = connect.GetDatabase(); _server = connect.GetServer(host); } /// <summary> /// /// </summary> /// <param name="key"></param> /// <param name="obj"></param> /// <param name="expire"></param> public void Add(string key, object obj, int expire) { if (key == null || key.Length == 0 || obj == null) { return; } //永不过期 if (expire == 0) { _database.StringSet(key, Serialize(obj)); } else { _database.StringSet(key, Serialize(obj), new TimeSpan(0, 0, expire)); } } /// <summary> /// /// </summary> /// <param name="key"></param> public void Remove(string key) { _database.KeyDelete(key); } /// <summary> /// /// </summary> /// <param name="key"></param> /// <returns></returns> public object Retrieve(string key) { object value = _database.StringGet(key); return value; } /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <returns></returns> public T Retrieve<T>(string key) where T : class { return Deserialize<T>(_database.StringGet(key)); } /// <summary> /// /// </summary> public void FlushAll() { _server.FlushDatabase(); } /// <summary> /// 序列化对象 /// </summary> /// <param name="obj"></param> /// <returns></returns> private byte[] Serialize(object obj) { if (obj == null) { return null; } BinaryFormatter binaryFormatter = new BinaryFormatter(); using (MemoryStream memoryStream = new MemoryStream()) { binaryFormatter.Serialize(memoryStream, obj); byte[] objectDataAsStream = memoryStream.ToArray(); return objectDataAsStream; } } /// <summary> /// 反序列化对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="stream"></param> /// <returns></returns> private T Deserialize<T>(byte[] stream) { if (stream == null) { return default(T); } BinaryFormatter binaryFormatter = new BinaryFormatter(); using (MemoryStream memoryStream = new MemoryStream(stream)) { T result = (T)binaryFormatter.Deserialize(memoryStream); return result; } } }
web开发框架中为什么要使用Redis分布式缓存?
如果B/S开发框架程序将数据库数据读取后又丢弃,并不放到哪儿保留,方便下次快速读取,整个数据库服务器都在不停的运转。高IO吞吐,高CPU占用率,对资源消耗会异常的大,使得请求并发量稍微大点,系统就会假死,甚至崩掉。并且在大型软件开发系统中,多子业务系统是正常的,为了适应各个子业务系统的数据高并发,分布式缓存就派上用场了,Redis、membercache等成熟nosql结果型数据库都是分布式B/S开发平台不错的选择。