Redis内存数据库在Exchange会议室的应用

本文论述了现有Exchange会议室应用现状和不足之处,并详细介绍了Redis内存数据库在Exchange会议室的应用,并给出了一种高性能的应用架构及采用关键技术和关键实现过程,最终实现大幅改进系统性能和改善用户体验,并为其余信息系统的优化提供了有效参考。html

1、Redis内存数据库简介数据库

Key-Value 存储系统是当下比较流行的话题,尤为在构建诸如搜索引擎、即时通信、P2P、游戏服务器、SNS等大型互联网应用以及提供云计算服务的时候有着大量的实际应用。编程

Key-Value 存储系统更加注重对海量数据存取的性能、分布式、扩展性支持上,并不须要传统关系数据库的一些特征,例如:Schema、事务、完整SQL查询支持等等。windows

Redis是一个Key-Value存储系统,也称内存数据库。和Memcached相似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。在此基础上,Redis支持各类不一样方式的排序。与Memcached同样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从)同步。缓存

2、Redis内存数据库的应用现状分析服务器

(一)Redis适用的一些场景微信

一、取最新N个数据的操做;架构

二、排行榜应用,取TOP N操做;并发

三、须要精准设定过时时间的应用;框架

四、计数器应用;

五、Uniq操做,获取某段时间全部数据排重值;

六、实时系统,反垃圾系统;

七、Pub/Sub构建实时消息系统;

八、构建队列系统;

九、缓存。

(二)Redis在新浪微博的典型应用分析

      目前全球最大的Redis用户是新浪微博,在新浪有200多台物理机,400多个端口正在运行着Redis, 有+4G的数据跑在Redis上来为微博用户提供服务。

      在新浪微博Redis的部署场景不少,大概分为以下的2种:

第一种是应用程序直接访问Redis数据库

    

图一 应用程序直接访问Redis

     第二种是应用程序直接访问Redis,只有当Redis访问失败时才访问MySQL

    

图二 应用程序直接访问Redis失败时访问MySQL

(三)Exchange会议室应用现状分析

     目前公司会议室申请已在Outlook中进行操做,已实现会议室申请自动化的功能(无需人工干预),且已有一年多的累计会议室数据,但在Outlook日历中会议室查看或查询存在严重缺陷,如没法查看会议申请人或参与人的部门及申请时间等信息,没法进行汇总统计和数据导出等,致使没法进行会议室分析与考核。因为Outlook的会议室存储在Exchange的专用数据库中,且Exchange的专用数据库与通用的关系型数据库如Oracle、Ms SQL Server、MySQL等有很大的不一样,它没有通用的驱动程序或API接口,不过微软提供了基于.Net技术的专用API接口能够经过编程方式访问Exchange会议室数据。

     因为公司已实行windows域管理,且Exchange邮件服务器与域进行了集成和绑定,也就是说会议室申请人的电子邮箱与windows活动目录的用户的电子邮箱属性一一匹配的,且活动目录的用户存在组织架构的属性(如部门、科室、组等信息),这就为会议室查询的二次开发集成创造了必要条件。

同时经过专用的API接口进行二次开发查询在性能方面存在很大瓶颈,特别是跨月查询的时候,耗时较长(可能会形成系统假死现象),用户体验差。

    目前会议室能够提早7天申请,但对于会议室申请的历史发生数据不会作任何变动操做,所以对于历史发生数据能够定时同步到缓存中,本文采用把会议室历史发生数据定时同步到Redis中,为了提升计算性能,同时把Windows活动目录中的全部在职用户信息也同步到Redis中,并给出了一个高性能的应用架构,有效的解决了系统性能问题和数据历史存档问题(如采用实时事务查询机制,一旦某会议室删除,将致使其全部数据丢失,没法进行查询),不只大大提升了用户体验,并且为会议室分析与考核提供了平台。

3、Redis内存数据库在Exchange会议室的应用

(一)总体应用架构

 

 

 

 图三 Redis内存数据库在Exchange会议室的总体应用架构

  根据以上的会议室应用现状分析,该架构的核心是把历史发生的会议室申请数据定时同步到Redis内存数据库中,对于如今和将来时间的会议室数据(目前能够提早7天申请数据)则经过专用接口在Exchange会议室数据库实时查询,根据用户选择查询时间,系统自动判断访问哪一个数据库或进行数据合并(历史数据与如今或将来时间的数据),经过减小访问Exchange会议室数据库以提升查询性能,从而大大改善用户体验,经过与Windows活动目录的用户的集成,为会议室分析和考核提供数据支持。

(二)关键技术简介

      一、ServiceStack.Redis驱动

         ServiceStack.Redis是最受欢迎的开源C#驱动之一,用于访问和读取Redis,它封装了大量方法和对象,这样使二次开发至关容易,如提供了基本KEY/VALUE键值对操做、存储对象、存储表格对象、使用客户端连接池模式提高连接速度等。

         本文采用了ServiceStack.Redis进行二次开发,经过二次开发的接口把Exchange的会议室和Windows活动目录的全部在职用户数据同步Redis中,同时对于历史会议室数据提供查询接口。

      二、Microsoft.Exchange.WebServices类库

         Microsoft.Exchange.WebServices类库是微软官方提供的专门访问Exchange邮件服务器的API,如能够根据此类库编程实现读取会议室数据、邮件、联系人、日程等,能够根据须要进行定制开发以知足不一样的应用需求。

   本文主要使用此类库读取会议室的数据,并结合SystemComponent.ADHelper类库读取会议申请人和参与人的部门信息。

     三、SystemComponent.ADHelper类库

        SystemComponent.ADHelper类库是本人为BPM项目开发的操做windows活动目录(组织单位、组、用户)的通用类库,能够进行复用,目前在BPM项目中已有普遍应用。

       本文主要使用此类库根据电子邮箱得到会议申请人和参与人的所属部门信息。

   四、Quartz.NET做业框架

     Quartz.NET是一个开源的做业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活性而不牺牲简单性。可以用它来为执行一个做业而建立简单的或复杂的调度。它有不少特征,如:数据库支持,集群,插件,支持cron-like表达式等等。 

   本文主要使用此做业框架进行定制开发同步程序,实现定时同步Exchange会议室数据到Redis中,并在Windows服务中运行(实现自动化做业,无需人工干预)。

(三)关键实现过程

      一、定时同步Exchange会议室数据和Windows活动目录的全部在职用户到Redis中

         主要经过以上的关键技术进行二次开发和整合成Windows服务程序,开发完成的程序文件列表以下图:

 

 图四 定时同步Exchange会议室和windows活动目录用户程序文件列表

         在Windows中部署后的服务以下图:

 图五 定时同步Exchange会议室和windows活动目录用户到Redis服务

          该服务的配置文件(定义了数据同步的周期、须要同步的会议室、活动目录的用户路径等信息),以下图:

图六 定时同步Exchange会议室和windows活动目录用户到Redis服务配置文件

 经过在Redis配置文件设置Redis持久化,即Redis异步把内存中数据写入到本地Redis数据库中(dump.rdb),本文配置了天天凌晨4点自动同步一次昨天的Exchange会议室数据到Redis中,以下图:

 

                    图七 Redis持久化

   持久化的好处在于即便重启Redis服务器,内存数据也不会丢失(Redis服务会根据本地Redis数据库自动加载到内存中),所以大大提升了系统可靠性和可用性,并且可移植性好(只要拷贝dump.rdb文件就能够移植到其余Redis服务器中使用)。

  二、定制开发的会议室查询助手

      经过进行定制开发的会议室查询助手,从Redis内存数据库中读取会议室历史数据(数据不会发生变动),从Exchange会议室数据库中读取提早申请的会议室数据(数据可能随时都会发生变动),经过两部分的数据组合,一方面提升了系统性能,另外一方面保证了数据的准确性,该工具主界面以下图:

   图八 客户端Outlook会议室报表查询助手
   系统能够根据会议时间段和会议室列表条件进行查询,同时支持以所见所得的方式导出为Excel文件,便于二次处理(统计分析、考核),以下图:

 图九 导出后Outlook会议室报表查询

 

 为了方便全员共享和查询,除了提供客户端查询工具外(主要面向会议室管理员和绩效考核人员),能够二次开发在企业门户中进行展示,以下图:

                       图十 企业门户Outlook会议室报表查询

(四) 实际应用效果分析

     以惠普Z600工做站电脑进行测试为例,具体硬件信息以下图:

   

                 图十一 惠普Z600工做站电脑硬件信息

Redis内存数据库与直接读取Exchange会议室数据的性能对比分析,以下图:

  

              图十二 Redis内存数据库与Exchange会议室数据库读取性能分析

      从图十二能够看到,读取Redis内存数据库均在0.5秒左右,会议时间段的长短对Redis性能影响微小,而对于Exchange会议室数据库的会议时间段长短影响则巨大,二者性能相差几十倍到几百倍不等。采用Redis内存数据库不管是性能,仍是用户体验都很是好,所以采用Redis内存数据库是一个较好的解决方案。

 4、总结

本文提出了一种基于Redis内存数据库在Exchange会议室应用的解决方案,并给出了相应的关键技术和实现过程,最后对应用效果进行了分析。该解决方案在功能、性能等方面能较好地知足最终用户和管理的需求,在系统架构上很是灵活,可扩展性和可移植性好,开发组件很是容易进行复用。

对于须要高性能、高并发的应用场景和其余相关信息系统的优化提供了有效参考,能够按照本文提出了一种基于Redis内存数据库的应用架构进行优化和改善。

注:这个是本人三年前开发的小应用,但比较实用,现公司已稳定运行了三年,优化的思路能够借鉴!另外本人最近再找新工做,主要是两个方向的求职:在甲方(企业)但愿可以找一份信息化经理相关的职位,在乙方(软件公司)则技术经理、项目经理、系统架构师等均可以考虑,要求工做地点:宁波、杭州、上海!

同时欢迎关注本人的微信订阅号QYXXHQY,不按期更新企业信息化前沿相关技术和应用,欢迎扫描关注,二维码以下:

   

本博客为软件人生原创,欢迎转载,转载请标明出处:http://www.cnblogs.com/nbpowerboy/p/4322724.html。演绎或用于商业目的,可是必须保留本文的署名软件人生(包含连接)。如您有任何疑问或者受权方面的协商,请给我留言。

相关文章
相关标签/搜索