王红爱,朱建生,刘文韬,阎志远
(中国铁道科学研究院 电子计算技术研究所,北京 100081)
实现与时俱进的目标,按照铁路客票销售渠道多样化、服务手段现代化、运营管理现代化的发展方向,铁路客票系统目前已经成功应用于各城际、高速铁路上,购票方式、支付手段多样化,满足不同消费人员的需求。为满足业务种类的不断膨胀、数据量的不断增加,除了对硬件资源做升级改造外,研究有效的缓存机制,优化软件系统对提高售票速度是非常重要的研究课题。本文分析了目前客票系统中已在应用的缓存策略,根据业务特点提出了一种适应分布式系统的缓存方案。
数据缓存[1]是数据库数据或外存中的文件数据在内存中的临时存储对象,是应用程序运行到一定阶段数据信息的内存副本。在实际应用环境中,有的数据在整个运行阶段更新频率较低,没有必要频繁地读取,应用系统启动后一次性读入内存供使用即可;有的数据更新相对较频繁,查询时由于算法规则的复杂性导致响应性能不能满足实际需求,因而需要将这类数据周期性地存入内存,供后续操作或其他用户直接从内存中间接读取使用,以减少直接读取次数,加快响应速度。
Hibernate是一个优秀的开放源代码数据持久层轻量级封装框架,其缓存机制是大家广为借鉴和使用的。H ibernate的缓存机制就是为了降低应用程序对源数据库访问的频度,进而提高应用程序的运行性能[2]。客户端提交申请时首先访问缓存,如果能够命中,则从缓存中提出数据,否则从数据库中提出数据。H ibernate的一级缓存为Session级的缓存或事务级缓存,是缓存实体对象的,不缓存普通属性,各Session间不能共享一级缓存数据;Hibernate的二级缓存为SessionFactory级的缓存或进程级的缓存,通常对读远远大于写的数据进行缓存,可以被所有的session所共享。
缓存机制3个标志性的特征[3]为缓存粒度、缓存一致性策略以及缓存替换策略。
(1)缓存粒度
在关系型数据库中,由行和列组成了完整的记录。根据此特点将缓存的粒度分为行缓存、列缓存、混合缓存。其定义分别为:
行缓存:向表中插入一条记录的时候,该行记录的每一列都要建立缓存。此时,缓存的数据有一部分对用户来说是冗余的;
列缓存:向表中插入一行记录的时候,只对用户频繁访问的列数据进行缓存;
混合缓存:根据用户访问的实际情况,对某些表的缓存采用行缓存,对另外的某些表采用属性列缓存。
(2)缓存一致性策略
根据缓存数据和服务器端数据的一致性程度,将一致性分为强一致性和弱一致性。强一致性要求查询事务读取的值是数据服务器的最新值;弱一致性可以在本地的缓存上执行,如果客户端和服务器端连接断开,此时的缓存可以提供弱一致性。
(3)缓存替换策略
缓存中的数据块一旦失效,需要将新的数据块移入缓存,同时将失效的数据块移出。常用的缓存替换策略[4]有随机替换策略、最近不可能使用策略(LRU)、最近未使用策略(NRU)、最近最少使用策略(LFU)和先进先出策略(FIFO)。FIFO[2]的含义是最先进入缓存的数据,在缓存空间不够的情况下(超出最大元素限制时)会被最先清理出去。LFU的含义是使用频率低的元素最先被清理掉。LRU的含义是最近最少使用的缓存的元素最早被清出缓存。在以上5种缓存更新算法中,先进先出策略和最近未使用策略虽然实现简单,但效率不高;LFU和LRU策略符合局部性原理,但是当缓存中的对象数目增加时效率会迅速下降;随机替换算法则最简单,效率一般。
(1)事务范围
事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存的生命周期才会结束。事务范围的缓存使用内存作为存储介质,一级缓存就属于事务范围。
(2)应用范围
应用程序的缓存可以被应用范围内的所有事务共享访问。缓存的生命周期依赖于应用的生命周期,当应用结束时,缓存的生命周期才会结束。应用范围的缓存可以使用内存或硬盘作为存储介质,二级缓存就属于应用范围。
(3)集群范围
在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中数据的一致性。
铁路客票系统是一个功能庞大的C/S模式的分布式系统,实现窗口、自动售票机等终端用户对各车站、铁路局、铁道部数据库服务器的访问。根据业务的需要,分为静态数据和动态数据。静态数据包括一般不发生改变和列车调图发生改变等数据类型;动态数据包括存根类、统计类、席位类等数据。不同类型的数据存放在不同的服务器上,发出一个申请席位的命令,系统会根据提前指定的规则连接到相应服务器上进行判断,最终给出有效的席位。
目前根据铁路客票业务访问量的大小制定了静态的缓存策略,每个子系统用户在登录时会在本机缓存该操作员和该窗口的信息,包括操作员权限、窗口权限、窗口参数定义等;业务繁忙的铁路局建立了查询服务器,每个客户端都可以访问该服务器,加快了发到站查询、余票查询的速度。本机缓存与Hibernate的Session级缓存保持一致,在各Session间不共享,需要连接到本地服务器中获取信息;查询服务器的建立与Hibernate的进程级缓存保持一致,保存了常用的数据信息,每个Session都可以使用该信息来提高响应速度。
本文根据实际的应用,在客户端和远程服务器端用缓存日志动态地调整缓存配置文件,以达到理想的缓存命中率。缓存机制的应用模型如图1所示。
图1 缓存机制的应用模型图
客户端和远程端在业务交互时分别记录各自的缓存日志,客户端在交班后计算访问命中率,将访问命中率分为高、中、低三级,在本地配置文件中查找命中率为0或低于一定百分率的缓存项,用高命中率的新缓存项替代; 远程端在业务空闲时每天定时读取远程缓存日志,将访问命中率分为高、中、低三级,在远程配置文件中查找命中率为0或低于一定百分率的缓存项,用高命中率的新缓存项替代。通过对访问命中率的分析,可以动态调整缓存项,提高系统性能。
2.4.1 本地缓存方案
本地缓存中的数据应该具备如下特征:
(1)经常被读但基本不被修改的数据。
(2)可以被并发访问,但从来不会修改的数据。
图2为本地缓存方案,流程如下:
客户端登录铁路客票子系统;
客户端下载窗口定义、操作员定义、窗口参数定义等特有信息;
读取本地缓存配置文件中的缓存项;
根据缓存项从远程缓存服务器端下载相关信息,未找到则从源数据库下载;
在办理业务的过程中记录缓存日志;
交班后通过历史和当日的缓存日志分析命中率,根据命中率的比例修改本地的缓存配置文件;
退出子系统。
通过实际的应用动态的调整配置文件,将利用率高的数据在本地进行缓存,可以地提高响应速度。
图2 本地缓存方案
2.4.2 远程缓存方案
远程缓存中的数据应该具备如下特征:
(1)经常被读但很少修改的数据;
(2)可以被并发访问但很少修改的数据,如:基础数据;
(3)可以被并发访问并且经常修改的数据,如:余票数据。
图3为远程缓存方案,流程如下:
图3 远程缓存方案
(1)客户端根据本地缓存项从远程缓存服务器端下载相关信息,未找到则在远程端记录缓存日志;
(2)每天定时通过远程缓存日志的历史和当日的记录分析命中率,根据命中率的比例修改远程的缓存配置文件;
(3)远程端根据配置文件中缓存项的改动向源数据库发出更新缓存的请求;
(4)源数据库可以通过修改复制服务器的参数将新的缓存项所对应的表进行复制等方式动态的调整远程缓存服务器的数据。
铁路客票系统业务量非常庞大,用户面向全国两千多个联网车站,一万四千多个售票窗口,保证系统的运行速度是提高旅客满意度的重要方面。把频繁使用的数据用有效的缓存机制加载到缓存区后,可以减少应用程序对物理数据源的低效访问,使得程序的运行性能明显提升。为了提高系统运行效率并达到理想的缓存命中率,本文设计了动态的缓存策略,根据应用系统的运行状况动态地调整缓存项,使缓存机制得以自适应化。
[1] 卢成均. 缓存机制及其在数据存取层中的应用模型研究[J]. 计算机应用与软件,2008(12).
[2] 敖小玲,黄 晋. Hibernate缓存机制研究与应用 [J]. 计算机与现代化, 2010(9).
[3] 袁华华. 移动数据库中复制与缓存相关技术的研究[D].武汉:湖北工业大学,2008,5.
[4] 方 君,杨寿保,周文煜,王淑玲. 网络存储中分布式I_O缓存机制研究[J].自然科学版华中科技大学学报.2011(6).