消息队列:
通过AddEvent()添加监听事件
通过调用DoEvent()触发事件
消息系统内置一个消息队列,通过不断轮询调用
public abstract class IEventManager
{
public delegate void EventDelegate(byte[] stream);
Dictionary>> mainDict = new Dictionary>>();
private Queue callDataList = new Queue();
private int _delayTime = 0;
public int DelayTime
{
get
{
return _delayTime;
}
}
struct CallData
{
public int _mainId;
public int _assistId;
public byte[] _stream;
}
public IEventManager(int delayTime = 0)
{
_delayTime = delayTime;
}
public virtual void AddEvent(int mainId, int assistId, EventDelegate callback)
{
Dictionary> temp;
List eventList;
if (!mainDict.ContainsKey(mainId))
{
temp = new Dictionary>();
eventList = new List();
eventList.Add(callback);
temp.Add(assistId, eventList);
mainDict.Add(mainId, temp);
}
else
{
temp = mainDict[mainId];
if (!temp.ContainsKey(assistId))
{
eventList = new List();
eventList.Add(callback);
temp.Add(assistId, eventList);
}
else
{
eventList = temp[assistId];
eventList.Add(callback);
temp[assistId] = eventList;
}
mainDict[mainId] = temp;
}
}
public void RemoveEvent(int mainId, int assistId)
{
if (mainDict.ContainsKey(mainId))
{
if (mainDict[mainId].ContainsKey(assistId))
mainDict[mainId].Remove(assistId);
}
}
public virtual void DoEvent(int mainId, int assistId, byte[] stream)
{
CallData data = new CallData
{
_mainId = mainId,
_assistId = assistId,
_stream = stream
};
callDataList.Enqueue(data);
}
public void Update()
{
if (callDataList!=null && callDataList.Count > 0)
{
CallData data = callDataList.Dequeue();
Do(data);
}
}
private void Do(CallData data)
{
if (mainDict.ContainsKey(data._mainId))
{
Dictionary> temp = mainDict[data._mainId];
if (temp.ContainsKey(data._assistId))
{
List eventList = temp[data._assistId];
foreach (EventDelegate ed in eventList)
{
ed(data._stream);
}
}
}
}
}
分布式缓存:
分布式缓存中间件
方便实现缓存的分布式,集群,负载均衡,故障自动转移,并兼容多种缓存存储的分布式缓存中间件。 用于解决分布式架构中的分布式缓存环节。
特点:
1. 代码少,便于扩展。
2. 兼容阿里云memcache,redis,ssdb。
3. 规范缓存使用接口,屏蔽底层缓存实现。
4. 通过配置连接字符串即可切换不同存储引擎,可以混合不同存储引擎组成缓存集群部署。(如部分redis,部分memcache)
5. 动态负载均衡,故障转移,线上无缝平行扩展和扩容,方便运维。
不同存储介质
///
/// Redis
/// 数据存内存,适合内存大小范围内大量缓存。(若是频繁失效的缓存数据,大量热点数据,建议使用redis)
///
Redis,
///
/// SSDB
/// 数据热点存内存,大量数据存磁盘。(若是命中率较低,命中热点数据,大量冷数据,建议使用ssdb)
///
SSDB,
///
/// Memcached
///
Memcached,
///
/// SQLServer内存表
///
SqlServer,
///
/// 阿里云的缓存服务OCS
///
AliyunMemcached,
备注:
1. 属于半研究性项目,已在线上阿里云memcache环境使用。
未来发展:
1. 分布式缓存中间件平台化,实现缓存监控,预警,性能报告等,性能数据收集至监控平台。
2. 扩展分布式缓存的其他特点。
3. 环形一致性hash对负载均衡和故障转移的支持。
或许你还没有用到过分布式缓存,在web集群的情况下,它可以很好的让一部分常用数据常驻服务器内存而不用担心各台web不同步。
下面稍微介绍一下beitmemcached对于.net的支持,官方参考http://code.google.com/p/beitmemcached/
调用一个在服务器已经部署好的Memcached的步骤:
1、点击链接http://code.google.com/p/beitmemcached/页面的downloads,把Memcached_1.2.5.zip 和BeITMemcached_source_2008_05_31.zip两个压缩包下在下来。
2、解压BeITMemcached_source_2010_08_04.zip,它是开发的客户端,里面是全部源代码和一个调用示例。
3、用对应版本的vss打开项目,如果感兴趣就慢慢研究代码,不感兴趣就右键属性→选择生成类库,编译一个BeITMemcached.dll出来。
4、在项目中引用BeITMemcached.dll。
5、在项目的配置文件(web.config)中添加节点。如:
6、写缓存:
①、添加缓存类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using BeIT.MemCached;
using System.Web.Script.Serialization;
namespace Flight.Web.Models
{
///
/// 分布式缓存
///
public class MemcachedService
{
public static MemcachedClient cached;
#region MemCached缓存实例化
public static void GetMemcachedInstance()
{
cached = MemcachedClient.GetInstance("MyConfigFileCache");
cached.SendReceiveTimeout = 5000;
cached.ConnectTimeout = 5000;
cached.MinPoolSize = 1;
cached.MaxPoolSize = 200;
}
#endregion
#region MemCached缓存判断
public static T GetFlightsQueryListByCached(string _CacheName)
{
var serialize = new JavaScriptSerializer();
T t = default(T);
var obj = cached.Get(_CacheName);
t = serialize.Deserialize(obj == null ? "" : obj.ToString());
return t;
}
#endregion
}
}
②、缓存对象
MemcachedService.GetMemcachedInstance();
string cacheName = "FlightsQueryList" + request.departcity + query.arrivecity + request.date;//缓存名称
FlightsRespDTO = MemcachedService.GetFlightsQueryListByCached(cacheName);//FlightsResponse需要缓存的对象
var serialize = new JavaScriptSerializer();
//请求接口
FlightsRespDTO = Common.QueryFlightPost(request);
MemcachedService.cached.Set(cacheName, obj, new TimeSpan(2, 0, 0));//缓存
Memcached在服务器的部署:
1、解压Memcached_1.2.5.zip ,它是memcached的服务器端。
2、把Memcached_1.2.5复制到你指定的做为缓存服务器的电脑上,比如叫做192.168.0.1。
3、cmd下运行类似命令 'd:\memcached\memcached.exe -d install' 安装服务器端,这时候它应该会出现在windows服务中
4、cmd下运行类似命令 'd:\memcached\memcached.exe -d start'启动服务,看服务器进程中是否有memcached进程。
5、确认服务器端口11211是否开放(防火墙设置中),否则其他机器无法访问
6、服务器端这时已经安装完毕、在其他机器上测试一下,cmd输入telnet 192.168.0.1 11211看能否登录。