APP下载

基于Redis的水务云系统缓存替换策略设计

2020-09-01张审问吴海燕涂国庆

水利信息化 2020年4期
关键词:水务命中率字节

张审问 ,吴海燕 ,李 星 ,涂国庆

(1. 甘肃省水利厅信息中心,甘肃 兰州 730000;2. 武汉大学网络安全学院,湖北 武汉 430072)

0 引言

当今万物互联和感知已是大势所趋,在水务数据应用领域,水务云系统成为一种新型有效的水务感知数据综合管理平台。水务云系统是一个各类水务监测系统的数据与应用服务中心,它接收远程监测数据并集中存储到云端数据库,并按照统一的用户界面,提供监测和基本信息的展示、查询、统计、管理功能。水务云管理的水利监测数据要素和种类繁多,主要涉及到水位、雨量、压力、电压、电量等文本数据,也包含现场图片数据。

面临着水务数据爆炸式增长,水务云系统如何应对海量数据的存储和传输是一个较大的挑战[1]。当大量的用户同时访问云服务器时,会对后台数据库造成巨大的访问压力。如何提升用户对系统资源的访问速度,改善系统的服务体验,降低系统后台数据库的访问压力是当前水务云系统面临的关键问题。

为实现水务云系统的高并发和高可用性,通常采用数据库缓存技术。Redis 属于一种基于缓存的内存数据库,具有优秀的读写性能,可以应对数据库高并发读写,适用于各种不同场景下的缓存和数据存储需求[2]。缓存替换算法在很大程度上影响着水务云系统整体缓存性能的强弱。Web 缓存替换算法较多,代表算法有基于访问时间间隔的 LRU 算法[3],基于访问频率的 LFU 算法[4]。GDS(Greedy Dual Size)缓存替换算法是根据 LRU 算法发展而来的,以价值函数为评价标准[5],缺陷在于:不能识别出只访问过 1 次和频繁被访问的对象,有时会出现频繁访问的对象反而被替换掉的情况。GDSF(Greedy Dual Size Frequency)缓存替换算法是在GDS 算法的基础上改进而来的[6],除了考虑缓存对象的开销和字节数大小外, 还要考虑缓存中对象的访问次数。通过对缓存对象设置权值函数的方法,可以将访问次数多的对象在缓存空间停留更久的时间,进而提高缓存的命中率[7]。但是针对水务云系统应用,GDSF 算法没有关注到系统中访问水务要素的类型和用户访问行为这 2 个关键要素。

通常,水务云系统数据访问采用的是单例多用户模式,具有以下鲜明的特点:用户的数量庞大;不同的用户对系统提供的服务质量的要求也不尽相同;不同用户关注的热点业务数据不同,即不同的用户对不同资源的访问时间和频率都有各自的特点;不同的用户对服务器产生的负载峰值的时间不同。

针对以上数据访问特点,以 Redis 数据库作为系统缓存,对 GDSF 缓存替换算法加以改进,设计一种基于用户访问行为的缓存方案,实现水务云系统的高并发和高可用性,以提高 Redis 缓存的请求命中率,减小数据库的查询压力。

1 基于 Redis 的水务云系统缓存框架

水务云系统通过水务监测终端 RTU,将远程数据以 GPRS 等方式传输到云平台进行集中管理,面向不同数据需求的用户,提供个性化的监测数据应用服务。设计的基于 Redis 的水务云缓存方案总体框架如图 1 所示,RTU 以报文形式将采集的数据发送到水务云系统的报文解析平台,报文解析平台负责将收到的报文数据进行解析并存入水务云系统的关系型数据库,使用 Redis 数据库作为系统缓存。

图1 基于 Redis 的水务云系统缓存总体框架图

多用户和多物联终端是水务云系统主要特征之一,系统用户可能来自不同区域,而不同区域的用户往往拥有不同的热点业务数据,热点数据的因素主要包括用户访问的数据类型和对数据的访问频率。

为了将水务云系统的热门访问数据对象和缓存技术结合,需要对水务云系统所有用户访问请求的日志信息进行分析,用户的日志信息主要指用户名、用户对业务数据的查询及处理等操作数据,具体包含请求的时间、URL(统一资源定位系统)、参数、方法(get 或者 post)、服务器,以及用户名标识符等信息。

2 基于用户访问行为的 GDSF 缓存替换算法

结合水务云系统的多用户访问模式和特性,在GDSF 的基础上设计一种基于用户访问行为的缓存替换算法,即 GDSF-UB(GDSF-User Behavior)。主要从水务云系统中的访问水务要素类型和用户访问请求行为 2 个角度进行改进,具体分析如下:

1)水务云系统中访问对象的开销。网络中衡量访问对象开销的方法通常有以下 3 种:a. 根据访问对象的延迟时间进行计算,访问对象的延迟时间和开销大小成正比,即访问对象的延迟时间越大开销就越大。但是访问对象的延迟时间波动性较大,和网络环境因素的关联性较高,所以对其进行定量化计算,难度较大,故在实际应用中此方法使用较少。b. 当访问对象的大小近似相等时,可以直接给每个访问对象赋予相同的开销值,这种方法是对访问对象的一种简化处理,可以为服务器节省一定的计算性能,但是应用条件比较苛刻,适用性不强。c. 以访问对象网络传输包的数量作为开销的大小,这种方法便于对不同访问对象的开销进行定量计算[8]。

本研究采用第 3 种方法对水务云系统中的访问对象进行开销计算,计算公式如下:

式中:Ci表示访问对象i的开销大小;Si表示访问对象i的字节数大小,使用 TCP 协议进行网络传输时的最大传输段大小默认为 536 字节。通常设定开销的大小大致等于在高速缓存未命中的情况下必须传输的 TCP 段的数量(高速缓存未命中本身需要2 个额外的单位),所以在此须做加 2 操作。

2)访问数据要素的类型。因为不同的用户对水务云系统数据要素类型的访问会有所不同,为满足这一特定的场景需求,需要对缓存替换算法的价值函数做一定的改变。水务云系统中包含的数据要素类型主要有瞬时流量、累计流量、压力、电压、水位、常规水质、雨量等,可以根据用户对不同要素类型的访问频率为其赋予不同的权重。某数据对象i所属要素类型的权重记为Ri,计算公式如下:

式中:nt(i) 为数据对象i所属要素类型的访问总次数;nt为所有水务数据的访问总次数。

3)用户对水务数据的访问行为。根据 Web 的访问特点,用户对水务数据的访问规律符合齐普夫定律[9],数据对象i被再次访问的概率Pi为

式中:nr(i) 为对象i的请求次数;ti为对象i的请求时间间隔;β为参数。

除此之外,根据用户的访问行为还可以得出用户对不同要素对象的感兴趣程度[10],在用户对水务云系统的访问请求中,主要考虑的因素是访问水务对象的频率,兴趣度可通过以下方式进行定量计算:

a. 定义向量的计算。定义向量U,表示水务云系统中的所有用户的集合;定义向量G,表示水务云系统中 Redis 缓存空间中所有数据对象的集合;定义向量I,表示水务云系统中的每个用户对缓存空间中每个数据对象的兴趣度的集合。

b. 用户对数据对象兴趣度的计算。通过对大量的访问日志分析发现,衡量用户Um对数据对象Gn的兴趣度Im,n,应考虑用户个人、所属部门,以及水务云系统全体用户,提出如下计算模型公式:

式中:m为用户序号;n为数据对象序号;wu,wd,wa分别为用户个人、所属部门、系统全体用户的权重系数,且wu+wd+wa= 1;nu(m,n) 为用户Um对水务数据对象Gn的访问次数,nu(m) 为用户Um对所有水务数据对象总的访问次数;nd(m,n) 为用户Um所属的部门对水务数据对象Gn的访问次数;nd(m)为用户Um所属的部门对所有水务数据对象总的访问次数;na(m) 为水务云系统所有用户对水务数据对象Gn的访问次数,na为水务云系统所有用户对所有水务数据对象总的访问次数。在对权重系数进行取值时,考虑到用户属性的关联性,用户个人和所属部门对用户的兴趣度计算影响较大,所以wu与wd的取值应稍大,wa的取值应稍小。

为保存用户对水务数据对象兴趣度的结果,将数据进行持久化存储。为此设计用户兴趣度统计表,结构如表 1 所示。

Im,n值位于 0 和 1 之间,越接近1 表明用户Um对数据对象Gn越感兴趣。

结合以上因素,提出 GDSF-UB缓存数据对象的权值函数计算方法:

式中:Vi是数据对象i的权值;ni是数据对象i的总访问次数;L为膨胀因子水务数据对象i的兴趣度之和。

综上,GDSF-UB 缓存替换算法的流程如图 2所示。图中部分参数说明如下:膨胀因子L初始为0,在算法实际运行中,其值为缓存空间中权值最低的对象的权值;St为缓存空间总的大小;Sa为缓存空间已经使用过的大小。为水务云系统所有用户对

表1 用户兴趣度统计表

算法具体执行步骤如下:

1)首先将参数进行初始化,置L= 0,Sa= 0;然后判断请求的水务数据对象i是否已在 Redis 缓存空间中,若对象i已在缓存空间中,转步骤 2),否则转步骤 3)。

2)Sa的值保持不变,根据式 (5) 重新计算缓存对象i的权值,本次算法结束。

图2 GDSF-UB 算法流程图

3)此时说明访问请求未命中,应将请求转发至水务云数据库系统,通过数据库服务返回请求对象i,然后把请求对象i放入缓存空间中,设置nr(i) =1,即对象i的访问次数为 1,按照式 (5) 计算对象i的权值;接下来判断缓存剩余空间的大小能否容纳当前访问对象i,若剩余缓存空间大小能够容纳当前访问对象i,转步骤 4),否则转步骤 5)。

4)直接向缓存中添加请求对象i,同时更新Sa的值,即

本次算法结束。

5)依次从缓存空间中找出k个权值最低的对象,并且k个对象满足以下条件:

6)将k个对象移出缓存空间,然后将对象i放入缓存,同时将L的值设置为k个对象中权值最大的一个,即L=Vi,k,更新缓存空间使用大小Sa值,即:

至此,本次算法结束。

3 GDSF-UB 缓存方案实现

将 GDSF-UB 缓存替换算法结合 Redis 数据库的方案应用在水务云系统中。本方案涉及的水务数据通常是 1 次/h 从监测分中心打包上传到水务云中心的,为保证缓存中数据的有效性,设置 Redis 中缓存数据的有效时间为 1 h。考虑到 GDSF-UB 缓存替换算法需用到用户的访问行为,所以首先对水务云系统的日志进行设置,然后将 GDSF-UB 缓存替换算法和 Redis 进行结合,主要实现步骤如下:

1)水务云系统日志的配置。配置过程为:

a. 在水务云系统中设置日志过滤器,本方案设置的是拦截用户的所有访问请求。

b. 从会话中获取用户信息,编写自定义的日志过滤器 LogFilter,重写 doFilter 方法用来记录水务云用户特定的一些访问请求信息,主要包含用户名、用户访问日期、客户端 IP、用户操作行为、客户端请求方式、请求提交的参数、请求的资源、服务器状态响应码、行为花费的时间、传输的字节数等内容。

c. 在 MySQL 数据库中新建 Statistics 和 Interest统计表,分别存储用户行为分析的统计和对缓存对象的兴趣度计算等结果。

d. 编写日志分析代码,对用户访问信息进行分析和统计,并将统计结果写入到 Statistics 统计表中。

2)GDSF-UB 替换算法和 Redis 的结合。本研究采用 Redis 实现水务云的数据缓存,因此需要将GDSF-UB 缓存替换算法和 Redis 结合应用到水务云系统中。访问请求输入的是用户访问 URL 路径的哈希值和访问对象,其中 URL 路径哈希值作为 Redis存储的 key 值,访问对象为对应的 value 值,采用面向对象开发,编写 GDSF-UB 和 Redis 结合的算法,实现图 2 中的 GDSF-UB 算法流程。

3)将 GDSF-UB 和 Redis 结合后的算法嵌入水务云系统。水务云系统后台使用 SSM(Spring +Spring MVC + MyBatis)框架进行开发,所以将算法嵌入到该框架的 Controller 层实现。

4 缓存替换算法实验结果分析

对 GDSF-UB 缓存替换算法进行实验以分析其性能,包含缓存的请求、字节 2 种命中率。为客观评价 GDSF-UB 缓存替换算法,同时做 LRU 及GDSF 结合 Redis 2 种缓存替换算法实验,并对实验结果进行对比和分析。

4.1 实验环境

本实验模拟水务云系统的实际使用场景,采用的数据集来自水务云系统数据库中的部分数据,主要包含的水务对象有瞬时流量、累计流量、水压和设备电压,取其中的 5 000 条数据作为实验数据。Redis 缓存空间大小对用户总请求字节数的占比分别取 0.4%,2.0%,4.0%,8.0%,12.0%,16.0%,20.0% 进行实验。采用 httpClient 模拟用户客户端对水务云系统进行访问,并随机生成请求条件模拟不同用户进行访问请求,包含随机请求的方法、水务数据类型和时间段。

硬件开发环境如下:CPU 为 Intel (R) Core (TM)i3-4170 CPU @3.70 GHz;内存大小为 16 GB;硬盘大小为 120 GB。软件开发环境如下:操作系统为 Window 7 Sp1 x64;开发工具为 myeclipse;开发环境为 jdk-1.8,Redis-3.2,MySQL-5.5,Tomcat-8.0。

4.2 评价指标

实验采用的评价指标主要是请求和字节的命中率。假设m为用户总的访问请求数量,Su(i) 为用户第i次请求的水务数据对象的字节数大小。若用户第i次请求的数据对象位于 Redis 缓存空间中,即请求缓存命中,置命中标志位φi= 1;若缓存未命中,则置φi= 0。2 个评价指标定义如下:

1)请求命中率。请求命中率考察缓存请求命中的数量,其值为命中的用户请求数和用户总请求数的比值,值越高,意味着用户从 Redis 缓存中获取对象的次数越多,即用户向水务云系统的源服务器访问请求的次数越少,降低服务器压力的程度就越高,同时用户也可以更加快速地得到请求响应。

2)字节命中率。字节命中率考察请求命中的字节数大小,其值为用户请求命中的数据对象的字节数大小之和与总请求的数据对象的字节数大小之和的比值,值越高,代表缓存性能越好。

4.3 结果分析

实验结果分析如下:

1)请求命中率。对比分析 LRU,GDSF 和GDSF-UB 缓存替换算法的请求命中率,对比图如图 3 所示。从图 3 可知:Redis 默认使用的 LRU 缓存替换算法的请求命中率,相对其他 2 种缓存替换算法最低;GDSF 替换算法考虑了缓存对象的大小和开销及访问次数,相对 LRU 具有不错的请求命中率;GDSF-UB 替换算法考虑了缓存对象的访问频率、对象所属类型和用户对缓存对象的兴趣度,比GDSF 算法有更高的请求命中率,最高达到 0.522。

图3 请求命中率对比图

2)字节命中率。对比分析 3 种缓存替换算法的字节命中率,对比图如图 4 所示。从图 4 可知:LRU 缓存替换算法的字节命中率总体来说,相对其他 2 种缓存替换算法最低;虽然缓存大小在 1%到 6% 之间,GDSF 替换算法的字节命中率比 LRU略低,但是缓存大小在 6% 到 20% 之间,GDSF 替换算法的字节命中率远高于 LRU,所以总体来说GDSF 的字节命中率高于 LRU 替换算法;GDSFUB 缓存替换算法的字节命中率相对其他 2 种缓存替换算法最高,最高达到 0.471。所以实验结果表明:GDSF-UB 缓存替换算法要比 GDSF 替换算法效果更优。

图4 字节命中率对比图

5 结语

为提升水务云系统的整体数据服务性能,在传统 LRU 和 GDSF 缓存替换算法基础上,设计了基于用户访问行为的 GDSF-UB 缓存替换算法,并将该算法和 Redis 数据库结合应用在水务云系统中。实验结果表明,改进后系统的数据缓存性能与采用传统算法的系统相比,性能得到了提升。本研究方案和思路侧重于并发海量数据访问中的数据特征和用户行为,可以为众多类型的水利大数据应用提供有益的借鉴。在对用户的数据兴趣度进行量化计算时,还可以根据具体场景考虑其他影响因素,以及对各影响因素合理建模与综合利用,这是后续工作需继续研究和优化的方向。

猜你喜欢

水务命中率字节
安徽欧泰祺智慧水务科技有限公司广告
基于文献回顾的罚球命中率与躯干稳定性影响因素研究
No.8 字节跳动将推出独立出口电商APP
基于新农村水务PPP模式下在我国农村饮水工程建管中的探讨
No.10 “字节跳动手机”要来了?
夜夜“奋战”会提高“命中率”吗
2015男篮亚锦赛四强队三分球进攻特点的比较研究
新时期水务档案管理工作的创新途径分析
轻量级分组密码Midori64的积分攻击
投篮的力量休斯敦火箭