c#消息队列和分布式缓存

消息队列:

通过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看能否登录。
 

你可能感兴趣的:(分布式缓存,消息列队,c#)