ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:30.50KB ,
资源ID:28047775      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28047775.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(缓存管理需求说明.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

缓存管理需求说明.docx

1、缓存管理需求说明缓存管理功能需求说明缓存管理开发背景缓存管理功能的开发,意在减少系统对数据库的过多访问,通过减少对数据库的访问次数,改用访问内存的方式,提升系统的性能。直接从内存获取数据,较之从数据库获取数据,效率可以得到显著的提升。 系统由于多次查询数据库,消耗大量系统资源,且查询效率可能因为开发者的个人能力导致查询效率不高,或占用过多资源影响系统性能。使用缓存管理,系统只有第一次查询访问数据库,而后皆通过访问内存取得数据,不需要在计较这次查询的SQL是否过于复杂,是否效率低下,直接取得数据返回即可。第一部分、缓存管理缓存管理提供了缓存工具类CacheUtils以供开发者对缓存进行自定义开发

2、。如果开发者需要自己开发某功能需要涉及缓存管理则可以借助使用CacheUtils工具类来完成。本地缓存管理和redis缓存管理的区分在于redis是否正确连接且启动。注意,是正确连接并且启动redis服务器。关于开发者需要自行开发某功能的缓存管理需要了解CacheUtils怎么使用可以查看缓存管理开发说明本地缓存管理 本地缓存管理是在redis没有正常启动运行的时候系统提供的缓存管理方式。本地缓存管理暂无任何持久化操作。对于缓存中的所有数据,在应用重启后一律清空,需要重新载入缓存。本地缓存管理采用的是标准的key-value形式保存,于Java中采用的结构形式为HashMap结构,HashMa

3、p有利于快速的存取,因而采用该结构保存本地缓存。其中key的类型为string,value的类型为object。本地缓存管理对于类型的限制基本没有。Value可以置入任何Java支持的对象。 本地缓存管理中,保存进入缓存只需要使用CacheUtils中的save方法进行保存即可,保存的数据在本地缓存中不做多余的处理,直接置入缓存中。由于采用的是以Object类型的形式保存,并不会对保存的数据进行转换,获取保存的缓存数据时直接使用CacheUtils中的get方法即可取得保存的数据,达到怎么存就怎么取,存什么取什么。无需更多的变换数据结构,更不会导致因为存储导致类型的变换或者数据的丢失。 由于存

4、什么取得的就是什么,因而直接修改取得的数据对象有可能导致缓存数据也被修改。Redis缓存管理 Redis缓存管理需要开启redis服务器并正确配置连接信息,系统会在启动的时候检测redis是否可以正常连接启用,如果没有正常连接启用则使用本地缓存管理。 Redis缓存管理对于类型具有特别的要求,对于不同的数据类型需要使用对应的类型进行保存。且不允许使用复杂的对象类型进行保存,如list-object是不被允许的,需要转换为list-string的类型再进行保存,同理Map类型也不被允许使用Object,但是单个JavaBean是允许进行存取的。即redis缓存管理不支持三维结构存储,仅支持二维结

5、构存储。 Redis缓存管理的数据会有简易的持久化。即当redis停止后或者系统停止后,再次启动时redis依然存有数据提供,不需要再次载入缓存。如果缓存设置了失效则可能会被清除。Redis缓存管理保存、修改 由于redis数据类型的特殊性,所以所有Java中复杂的对象存储都需要进行相应的转换后才可以进行保存。对于redis缓存管理中缓存的修改,采用删除原有数据再行保存新数据的更新方式,并非采用覆盖数据的方式。 对于list中的泛型,如果为string类型则可以直接保存进入缓存中,如果list中的泛型为JavaBean对象或者其他复杂类型则需要将数据转换为string类型后再行保存。对于这类复

6、杂对象转换为string的处理方法为将之转换为json格式的字符串用以保存,通过将原本的数据类型的完整类型名获取保存于json字符串之前,这样在对于数据的回转的时候就能避免类型的丢失导致无法正确转换为原有类型。对于此类数据采用了如下的解决方案:1.如果是list中包含复杂对象,则将list中的对象取出,解析第一条数据,取得数据的数据类型完整类型名,再将数据转换为json格式的字符串,二者进行拼接,拼接规则为:完整类型名_&_数据对象json字符串 -数据拼接规则如此得到具有对象完整数据以及结构的字符串,并将其存入list中,其后的数据直接转换为数据对象json字符串放入list中。2.如果是p

7、age对象的result中包含了复杂对象,则将page中的result取出,因为page中的result类型为list类型,因此将result以如上list的转换方式转换,再将得到的转换后的list放回page中,最后将page对象拆分为hash结构进行保存。3.如果是JavaBean对象,提供两种解决方案,其一,直接保存JavaBean对象,将JavaBean对象进行hash拆分,存入缓存。其二,如上拼接规则将数据拼接得到string,直接保存string字符串,而后取回时再行解析。第一种方案由缓存管理提供,第二种方案由开发者自行控制,缓存管理不提供具体解析过程,仅提供保存string的方法

8、以及获取string的方法。4.如果是map类型,将map拆分hash结构保存。如果map的value类型为复杂类型,缓存管理将不会对对象进行解析,直接保存,因此可能导致数据丢失。如果类型为复杂类型需要又开发者自行转换string格式进行保存。5.如果是其他复杂类型,缓存管理不进行解析管理,统一使用object的toString进行string转换保存。因此,其他复杂类型不建议使用缓存,如果一定有必要,需要开发者自行定制保存解析规则,进行string格式的保存。Redis缓存管理获取 因为redis数据结构的特殊性,本缓存管理主要采用list、hash、value三种方式对数据进行获取。Lis

9、t对应Java的list-string类型;hash对应Java的map类型,且value为string类型;value对应Java的string类型。 上一部分已经说明了在redis缓存管理中的数据保存形式,由缓存管理定制了数据解析规则,因而获取缓存数据后转换Java支持的对象则需要使用到解析规则,在此获取数据提供如下解决方案:1.如果需要取得的数据是list形式的,在解析规则下具有两种情况:其一,从缓存中取出的list数据为符合数据拼接规则的字符串,对于此类型解析完整类型名,得到类型的Class,同时又有数据的json格式字符串,将json字符串转换为对应的形式,构造新list,返回构造好

10、的数据;其二,从缓存中取出的list为特殊标识ID字符串,取得特殊标识ID,根据这特殊的字符串从缓存中取得hash结构的数据,解析特殊标识ID,得到数据的类型,将hash结构的数据转换为数据原有类型,构造新list返回。2.如果需要取得的数据是page类型,从缓存中获取page对应的hash结构数据,将hash结构的数据转换为page对象,得到page中的result,将result如上list般处理后,置入page对象中,返回page对象。3.如果需要取得的数据是JavaBean对象类型,缓存管理提供两种方案获取:其一,判断获取的key,如果符合特殊标识ID的形式,通过特殊标识ID从缓存中取

11、得hash结构的对象数据,根据特殊标识ID解析得到数据的类型,将取得的hash结构数据转换为对应类型的JavaBean对象,返回对象;其二,如果标识不符合特殊标识ID形式则获取hash结构数据,将hash结构数据根据传入的对象类型转换成相应的JavaBean对象,返回对象。开发者如果有特殊需要可以自行定义规则进行对象存取。4.如果需要取得的数据是map类型,则直接根据key值取得对应的hash结构数据,转换map返回。如果存储是数据出错,得到的缓存数据也会出错,开发者需要覆盖上正确的数据或者移除该缓存,节省缓存空间。5.如果是其他类型,将由redis的Jackson2序列化工具进行序列化,为了

12、防止无法序列化导致数据丢失,建议开发者自行定义规则进行存取,自行解析。Redis缓存管理单表形式管理 Redis缓存管理提供了单表形式的缓存管理方案,该方式可以直接缓存整张表的数据,并对这张表的数据进行相应的缓存管理。该形式同样适用于本地缓存,即本地缓存及redis缓存在此形式的方案是一致的。 缓存的单表形式缓存管理,旨在简化对于单表数据缓存操作的管理,方便开发者通过该形式方案简单的操纵单表数据以完整开发的缓存需要。 通过getTableData方法,可以获取该表在缓存中的数据,如果缓存中不存在该表数据则将该表数据置入缓存,并返回数据。由于使用了该方式会将表数据写入缓存中,所以需要考虑表数据的

13、数据量,如果表数据的数据量过大,则不建议使用该方式进行缓存,否则过多的数据进入缓存对系统会造成不必要的负担。 对于单表形式的缓存管理,CacheUtils类中提供了对表数据的增删查改方法,且表数据具有如下数据结构: 单表缓存数据结构示意图 如上图所示,表数据结构满足特殊标识ID的结构,因而可以使用特殊标识ID的解决方案进行缓存管理。 对于单表形式缓存管理还有需要注意的是,必须确保操作的表的数据一致性,即缓存中的表数据必须和数据库中的表数据保持同步一致,对于表的增删改操作都需要进行缓存的同步更新,不能仅仅操作数据库而不对缓存数据进行更新,如果不实时更新将到时获取的数据不准确。保持数据库与缓存的数

14、据同步可能需要使用到缓存操作注解。PS:缓存数据是无法通过getTableData达到实时更新的,不可以通过使用getTableData来节省更新的步骤,该方式是不可行的。第二部分、缓存操作注解 缓存操作注解作用于service层,用于将service方法的返回数据纳入缓存管理中,提升系统的工作效率。缓存操作注解的所有相应缓存管理功能皆使用缓存管理提供的cacheUtils类进行实现,并借助缓存管理的数据结构及存储特点对service方法的返回数据进行合理处理。注解参数说明 缓存注解包含以下几种标识: 查询有效:1、value(该项基本不建议使用);2、initData 具备该项则说明该方法是

15、基于单表的查询,缓存查询是通过表映射关系取得缓存数据、且如果表数据没有缓存会进行缓存整个表数据;3、name 具备该标识的方法一般为多表查询或其他特殊查询,缓存中保存该方法的返回数据采用完整保存的方式进行保存,不会对数据进行拆分。即一个具备name的查询对应一个结果存于缓存中。增删改有效:1、clear 该项表明当前方法的操作会影响到哪些name标识的缓存查询,需要将这些缓存进行清除。该项值为一个字符串,将多个name以英文逗号隔开。2、oprTable 该项表明当前方法的操作会影响到哪些表数据,需要对这些表数据进行更新。该项值为一个class数组,class为需要更新表对应的实体类。所有有效

16、、增删改必要:1、operation 该项用于注明当前方法的操作是属于增删查改中哪一类型的操作,该项默认为查询操作,增删改操作需另行注明。CacheConstants类中有常量属性标识。 参数逻辑通过缓存注解标识判断当前缓存操作的操作类型,操作需要等进行相应的缓存管理操作。 Value(该方式不被推荐使用): 存入逻辑: Value加入缓存的key生成规则为 完整类名 + 英文句号 + 方法名 + value值 + 下划线 + 入参的MD5加密码Value的缓存存储为非定类型存储,即直接对返回结果进行保存,不做任何干预处理,仅凭保存方法的逻辑进行处理,同时,使用value的缓存将不再进行任何管

17、理,即系统不再干预,直到开发者自行调用方法销毁或缓存自行销毁,直至之前都不会有任何的变化。 取回逻辑:同理,因为使用value为非定类型存储,不做任何控制,取回时直接由缓存中取出并直接返回,同样不进行任何处理。Name(用于复杂的多表查询或特殊查询) 存入逻辑: Name加入缓存的key生成规则为: Name标识的值 + _data_ + 入参的MD5加密码 Name的存储涵盖了以下几种类型(使用了redis以下才有效,非redis直接保存即可):1、list 当方法的返回类型为list时,将取得的方法返回值进行解析,取得list中的每一条数据,并将数据转换成json格式的字符串加以存储,为了

18、能正常回转,在第一条数据中会将list的泛型完整类名进行标记,所以方法的第一条数据格式为:类型 + _&_ + 数据json字符串。2、page 当方法的返回类型为page时,将取得返回值进行解析,将page中的result如list般处理并回写page,同时将page转换为hash结构(即map形式)进行保存。3、JavaBean 当方法的返回类型为一个实体类型时,将数据以json字符串格式存放,并且字符串前拼接实体类型 类型 + _&_ + 数据json字符串。4、String、Map类型以原有形式保存,若map中有复杂对象类型可能导致存储出错或数据错乱。取回逻辑: 当返回类型为list、

19、page、JavaBean类型时,根据字符串的信息解析得到返回的泛型或返回类型,再根据类型解析json格式的字符串,转换为相应的类型并构造返回值返回。当使用本地缓存时无需做任何解析,直接取得数据返回。 当返回类型为其他类型时则直接返回从缓存中取得的值。 initData(用于单表查询) 使用该方式缓存时需要缓存完整表数据。该方式采用缓存管理的单表缓存管理模式进行开发,基于单表缓存数据结构进行相应的缓存管理操作。 存入逻辑: 完整表数据加入缓存的key生成规则: 实体名 + 英文冒号 + 表名 + _data_ 完整表数据加入缓存的value生成规则: 完整类名 + 下划线 + 对象ID值 表数

20、据以value的生成规则生成的值作为key保存每一条对应表数据,即: Key : 完整类名 + 下划线 + 对象ID值 Value : 该对象的hash结构数据(redis)(非redis则是完整对象) 查询结果的数据映射关系加入缓存的key生成规则: 实体名 + 英文冒号 + 表名 + _mapping_ + 入参MD5加密码 InitData存储主要包括三种类型:1、list 取得返回值,将返回值的对象ID取回根据 完整表数据value生成规则生成value,再将生成的value以list的形式存入缓存。2、page 取得返回值,将page中的result取出,同list处理,再将处理后的

21、list放回page中,以hash形式保存page。3、JavaBean 取得返回值,用完整表数据value生成规则生成value,加入缓存。取回逻辑:1、list 从缓存中取得数据,直接以取得的数据作为key值匹配缓存,得到完整对象值,构造对象list返回。2、page 从缓存中取得数据,取出result的数据再次匹配缓存得到完整对象list,构造page返回。3、JavaBean 从缓存中取得数据,再次匹配缓存得到对象返回。Clear(用于清除name查询的缓存结果) 不论操作为增删改哪种,都对clear中标识出来的所有name进行清除。 清除逻辑:取得clear值,解析得name数组,遍

22、历name数组,匹配缓存中以name作为前缀的所有缓存数据,进行删除操作 OprTable(用于清除有变动的表数据) 不论操作为增删改哪种,都对oprTable标识出来的表数据进行清除并重新装载。 清除逻辑:取得oprTable的值,解析得实体类数组,遍历实体类数组,得到实体类的前缀将所有前缀匹配的缓存都进行清理,该部分缓存会包换表数据的缓存以及关于该表的单表查询结果。最后重新装载表数据。 如果该项没有标记则以操作方式更新表数据,目前统一全部清除。缓存注解执行逻辑 对于使用了缓存注解标识的方法,切入方式使用了spring的aop方式进行方法的切入。在方法执行前及方法返回前进行操作。对于标识了缓

23、存注解的方法,在执行前将会切入其中,根据operation标识判断当前方法是什么操作。如果是查询操作则通过标识和入参判断缓存数据是否存在,如果缓存数据存在则不再执行被切入的方法,直接返回缓存数据结果,如果不存在缓存数据则直接往下执行方法。如果不是查询操作则直接往下执行方法。在被切方法执行完方法体后准备返回的阶段,切入方法,判断方法操作类型,如果不是查询操作,根据增删改更新缓存数据。如果是查询操作,取得方法返回值,根据条件进行相应的缓存存入。如此,在第二次访问相同的方法,且入参相同时则不需要再次进入service方法进行方法体的执行,直接获取缓存数据返回。方法执行前的控制方法使用的是around

24、环绕通知控制,方法执行后的控制方法使用的是afterReturning。第三部分、缓存失效管理 将缓存类似session进行管理,统一配置一个过期时长,缓存数据在保存时根据过期时长及写入时间记录过期时间。在每次获取某条缓存数据时根据过期时长及获取时间重设过期时间。每分钟遍历所有缓存数据过期时间,达到过期时间的则清除。达到对较长时间未使用的缓存数据清理目的。失效时间设置 失效时间提供两种方式进行设置,第一种,使用配置文件的形式进行配置,在配置文件中配置上对应的参数,对所有的缓存数据进行统一的失效处理,默认失效时长设定为30分钟。第二种,在对缓存数据进行保存的时候对缓存数据进行独立的失效时长设定,

25、定义缓存的失效时间,对单一缓存进行失效管理。失效处理 对缓存失效时间在本地缓存中单独开辟一个空间进行管理。将设定了失效时间的缓存对应的key及失效时间保存在设定的空间中。设定一个定时器执行定时任务,每分钟检查一遍该空间内的缓存失效时间,如果发现已达失效时间,则取得对应缓存的key,对该缓存数据进行清理,同时将该缓存的失效时间从该空间内移除。在此并不严苛要求精确的删除时间,此方式仅为了保证内存空间持续充足且减少垃圾缓存的存在。缓存数据的失效时间会随着缓存的命中而更新,如对该缓存进行增查改操作,均会更新失效时间,将缓存时间更新为命中时的时间加上统一失效时长。失效移除(短时及长期) 对于设置了失效的缓存,如果需要该缓存持续存在,可以通过两种方式进行失效移除。短时移除系统提供短期移除方法,移除对应缓存的失效时长,至于具体多短取决于用户的下次访问时间,如果用户在短期移除后一分钟,即操作了该缓存数据,则缓存再次进入失效队列,失效时长为配置的失效时长,而如果用户在移除后再也没有访问过,则缓存一直存在,直到下次命中才进入失效队列。长期移除(持久化)长期移除,系统提供长期移除方法,该方式并非移除缓存失效时间,而是由系统将缓存失效时间设定为10年后,该方式保证了缓存的持续存在,但如果系统持续运行10年,且缓存数据十年间都没有被访问的话,该缓存将会面临失效。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1