通过弱引用技术消除缓存对象不一致性的装置和方法
【专利说明】
[0001]
技术领域
[0002] 本发明涉及数据处理领域,具体地,涉及一种通过弱引用技术消除缓存对象不一 致性的装置和方法。
【背景技术】
[0003] 在面向对象的软件开发领域,往往会通过缓存机制来实现系统的高效率运行。对 于以内存作为缓存对象存储容器的缓存机制而言,由于内存的大小有限,往往需要通过缓 存容量限制或缓存对象超时时间等机制来进行缓存对象的淘汰,最常用的淘汰策略是LRU (LeastRecentlyUsed)算法。对于存在淘汰机制的缓存系统而言,一次用户请求可能经由 不同的程序组件进行处理,若在此过程中发生了缓存对象的淘汰现象,则同一对象在内存 中可能存在不同的版本,这种不一致性会对程序处理逻辑造成严重干扰。
[0004] 以表1所示的员工调薪的处理程序为例说明:有表1可见,由于不一致性的存在, id=l的员工本应调薪到11800元,却变成了 10800元。
[0005] 申请号为200810105131.0的专利文件中,公开课一种灵活使用弱引用缓存对象 的方法,该技术方案存在一个主要问题:缓存完全依赖弱引用进行管理,而不是将弱引用作 为对象淘汰后的重新获取机制。在没有强引用的情况下,弱引用对象会很快被GC回收掉, 该技术方案所设计的缓存并不能解决上述问题。
[0006] 表1 :员工调薪的处理程序表。
【发明内容】
[0007] 现有技术存在的问题关键在于:当进行缓存对象的淘汰时,能否检测到该缓存对 象正在被程序代码使用,并不真正进行淘汰。这样,当需要再次使用该对象时,可以直接返 回内存中被其它程序代码所修改过的对象。
[0008] 本发明的目的在于,针对上述问题,提出一种通过弱引用技术消除缓存对象不一 致性的装置和方法,以解决缓存对象不一致的问题。
[0009] 为实现上述目的,本发明采用的技术方案是: 一种通过弱引用技术消除缓存对象不一致性的装置,包括弱引用字典管理器、缓存对 象管理器和缓存对象获取器, 所述缓存对象管理器:将缓存区域内淘汰的缓存对象加入到弱引用字典管理器; 所述弱引用字典管理器:保存来自缓存对象管理器的缓存对象; 所述缓存对象获取器:在获取缓存对象时,首先获取缓存区域内保存的缓存对象,如缓 存区域中获取不到缓存对象,则从弱引用字典管理器中获取缓存对象。
[0010] 优选的,所述弱引用字典管理器采用key-value格式。
[0011] 优选的,所述缓存对象管理器,包括缓存对象包装单元和缓存对象管理单元, 所述缓存对象包装单元:使用弱引用包装淘汰的缓存对象的值; 所述缓存对象管理单元:接收包装对象的值,并在弱引用字典管理器内查找是否存在 对应缓存对象的key,如存在则使用包装对象替换掉弱引用字典管理器内对应的缓存对象, 如不存在,则将包装对象加入到弱引用字典管理器,包装对象即使用弱引用包装的淘汰的 缓存对象。
[0012] 优选的,所述缓存对象获取器包括,缓存区域获取单元和弱引用字典获取单元; 所述缓存区域获取单元:在缓存区域内获取缓存对象; 弱引用字典获取单元:在弱引用字典管理器内获取缓存对象。
[0013] 优选的,所述弱引用字典获取单元获取缓存对象具体为: 通过缓存对象的Key检索弱引用字典管理器; 如弱引用字典管理器内存在对应的包装对象,则检测包装对象所引用的内存对象是否 存活; 如管理器存活则返回存活的内存对象。
[0014] 同时本发明的技术方案还公开一种通过弱引用技术消除缓存对象不一致性的方 法,包括以下步骤: 将缓存区域内淘汰的缓存对象加入到弱引用字典的步骤; 以及 获取缓存对象时,首先获取缓存区域内保存的缓存对象,如缓存区域中获取不到缓存 对象,则从弱引用字典中获取缓存对象的步骤。
[0015] 优选的,所述弱引用字典采用key-value格式。
[0016] 优选的,所述将缓存区域内淘汰的缓存对象加入到弱引用字典的步骤包括: 使用弱引用包装淘汰的缓存对象的值的步骤; 根据包装对象的值在弱引用字典内查找是否存在对应的缓存对象的Key,如存在则使 用包装对象替换掉弱引用字典内对应的缓存对象,如不存在,则将包装对象加入到弱引用 字典的步骤。
[0017] 优选的,所述从弱引用字典中获取缓存对象包括, 通过缓存对象的Key检索弱引用字典; 如弱引用字典内存在对应的包装对象,则检测包装对象所引用的内存对象是否存活; 如管理器存活则返回存活的内存对象。
[0018] 本发明的技术方案具有以下有益效果: 本发明的技术方案,增加了一个弱引用字典,被淘汰策略所淘汰的缓存对象并不立即 清除,而是将其放入到弱引用字典中。如果缓存对象没有被任何程序代码所引用,那么随着 垃圾回收的发生,存放在弱引用字典中的缓存对象最终将彻底从内存中清除。但只要还有 其它强引用存在,垃圾回收就无法清除该对象。这样,当需要重新获取缓存对象时,就可以 直接从弱引用字典中拿到,不会生成一份新的实例,从而避免内存对象不一致性的问题。
[0019] 下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
【附图说明】
[0020] 图1为本发明实施例所述的通过弱引用技术消除缓存对象不一致性的装置的原 理框图; 图2为本发明实施例所述的缓存对象管理器的原理框图; 图3为本发明实施例所述的缓存对象获取器的原理框图; 图4为本发明实施例所述的通过弱引用技术消除缓存对象不一致性的方法的流程图; 图5为本发明实施例所述的增加将淘汰的缓存对象加入到弱引用字典的流程图; 图6为本发明实施例所述的从弱引用字典中检索存活内存对象的流程图。
【具体实施方式】
[0021] 以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实 施例仅用于说明和解释本发明,并不用于限定本发明。
[0022] 如图1所示,一种通过弱引用技术消除缓存对象不一致性的装置,包括弱引用字 典管理器、缓存对象管理器和缓存对象获取器, 缓存对象管理器:将缓存区域内淘汰的缓存对象加入到弱引用字典管理器; 弱引用字典管理器:保存来自缓存对象管理器的缓存对象; 缓存对象获取器:在获取缓存对象时,首先获取缓存区域内保存的缓存对象,如缓存区 域中获取不到缓存对象,则从弱引用字典管理器中获取缓存对象。
[0023] 其中,弱引用字典管理器采用key-value格式。
[0024] 如图2所示,缓存对象管理器,