Redis内存数据库在Exchange会议室的应用(转)
本文论述了现有Exchange会议室应用现状和不足之处,并详细介绍了Redis内存数据库在Exchange会议室的应用,并给出了一种高性能的应用架构及采用关键技术和关键实现过程,最终实现大幅改进系统性能和改善用户体验,并为其他信息系统的优化提供了有效参考。
一、Redis内存数据库简介
Key-Value 存储系统是当下比较流行的话题,尤其在构建诸如搜索引擎、即时通讯、P2P、游戏服务器、SNS等大型互联网应用以及提供云计算服务的时候有着大量的实际应用。
Key-Value 存储系统更加注重对海量数据存取的性能、分布式、扩展性支持上,并不需要传统关系数据库的一些特征,例如:Schema、事务、完整SQL查询支持等等。
Redis是一个Key-Value存储系统,也称内存数据库。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与Memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
二、Redis内存数据库的应用现状分析
(一)Redis适用的一些场景
1、取最新N个数据的操作;
2、排行榜应用,取TOP N操作;
3、需要精准设定过期时间的应用;
4、计数器应用;
5、Uniq操作,获取某段时间所有数据排重值;
6、实时系统,反垃圾系统;
7、Pub/Sub构建实时消息系统;
8、构建队列系统;
9、缓存。
(二)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中,并给出了一个高性能的应用架构,有效的解决了系统性能问题和数据历史存档问题(如采用实时事务查询机制,一旦某会议室删除,将导致其所有数据丢失,无法进行查询),不仅大大提高了用户体验,而且为会议室分析与考核提供了平台。
三、Redis内存数据库在Exchange会议室的应用
(一)整体应用架构
图三 Redis内存数据库在Exchange会议室的整体应用架构
根据以上的会议室应用现状分析,该架构的核心是把历史发生的会议室申请数据定时同步到Redis内存数据库中,对于现在和未来时间的会议室数据(目前可以提前7天申请数据)则通过专用接口在Exchange会议室数据库实时查询,根据用户选择查询时间,系统自动判断访问哪个数据库或进行数据合并(历史数据与现在或未来时间的数据),通过减少访问Exchange会议室数据库以提高查询性能,从而大大改善用户体验,通过与Windows活动目录的用户的集成,为会议室分析和考核提供数据支持。
(二)关键技术简介
1、ServiceStack.Redis驱动
ServiceStack.Redis是最受欢迎的开源C#驱动之一,用于访问和读取Redis,它封装了大量方法和对象,这样使二次开发相当容易,如提供了基本KEY/VALUE键值对操作、存储对象、存储表格对象、使用客户端链接池模式提升链接速度等。
本文采用了ServiceStack.Redis进行二次开发,通过二次开发的接口把Exchange的会议室和Windows活动目录的所有在职用户数据同步Redis中,同时对于历史会议室数据提供查询接口。
2、Microsoft.Exchange.WebServices类库
Microsoft.Exchange.WebServices类库是微软官方提供的专门访问Exchange邮件服务器的API,如可以根据此类库编程实现读取会议室数据、邮件、联系人、日程等,可以根据需要进行定制开发以满足不同的应用需求。
本文主要使用此类库读取会议室的数据,并结合SystemComponent.ADHelper类库读取会议申请人和参与人的部门信息。
3、SystemComponent.ADHelper类库
SystemComponent.ADHelper类库是本人为BPM项目开发的操作windows活动目录(组织单位、组、用户)的通用类库,可以进行复用,目前在BPM项目中已有广泛应用。
本文主要使用此类库根据电子邮箱获得会议申请人和参与人的所属部门信息。
4、Quartz.NET作业框架
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活性而不牺牲简单性。能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。
本文主要使用此作业框架进行定制开发同步程序,实现定时同步Exchange会议室数据到Redis中,并在Windows服务中运行(实现自动化作业,无需人工干预)。
(三)关键实现过程
1、定时同步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服务器中使用)。
2、定制开发的会议室查询助手
通过进行定制开发的会议室查询助手,从Redis内存数据库中读取会议室历史数据(数据不会发生变更),从Exchange会议室数据库中读取提前申请的会议室数据(数据可能随时都会发生变更),通过两部分的数据组合,一方面提高了系统性能,另一方面保证了数据的准确性,该工具主界面如下图:
图八 客户端Outlook会议室报表查询助手
系统可以根据会议时间段和会议室列表条件进行查询,同时支持以所见所得的方式导出为Excel文件,便于二次处理(统计分析、考核),如下图:
图九 导出后Outlook会议室报表查询
为了方便全员共享和查询,除了提供客户端查询工具外(主要面向会议室管理员和绩效考核人员),可以二次开发在企业门户中进行展现,如下图:
图十 企业门户Outlook会议室报表查询
(四) 实际应用效果分析
以惠普Z600工作站电脑进行测试为例,具体硬件信息如下图:
图十一 惠普Z600工作站电脑硬件信息
Redis内存数据库与直接读取Exchange会议室数据的性能对比分析,如下图:
图十二 Redis内存数据库与Exchange会议室数据库读取性能分析
从图十二可以看到,读取Redis内存数据库均在0.5秒左右,会议时间段的长短对Redis性能影响微小,而对于Exchange会议室数据库的会议时间段长短影响则巨大,两者性能相差几十倍到几百倍不等。采用Redis内存数据库无论是性能,还是用户体验都非常好,因此采用Redis内存数据库是一个较好的解决方案。
四、总结
本文提出了一种基于Redis内存数据库在Exchange会议室应用的解决方案,并给出了相应的关键技术和实现过程,最后对应用效果进行了分析。该解决方案在功能、性能等方面能较好地满足最终用户和管理的需求,在系统架构上非常灵活,可扩展性和可移植性好,开发组件非常容易进行复用。
对于需要高性能、高并发的应用场景和其他相关信息系统的优化提供了有效参考,可以按照本文提出了一种基于Redis内存数据库的应用架构进行优化和改善。