欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计一套缓存框架需要关注的要素

程序员文章站 2022-03-02 09:23:59
...

最近关注了一些缓存框架的特性和实现,包括OSCache、JCS、Ehcache、Memcached等等,公司的两个缓存框架,以及一个标准JSR 107(JCache),发现一些诸多类同的方面。如果你不够熟悉以上,不妨先看看这两篇文章:OSCache框架源码解析》和《Ehcache详细解读》,再看下面的内容也许会有更多想法。之后再思考,如果要自己去实现一套缓存框架,需要考虑哪些东西?

1、为哪些数据做缓存?

  1. 模型对象,这在业务逻辑层面最常见。
  2. 数据库查询结果集。
  3. 页面缓存、页面片段缓存。
  4. 运算结果集,尤其对于幂等性服务。
  5. 外部接口查询结果。

 

2、缓存框架的核心:

 

缓存生命周期管理,很多重要特性都是围绕它来展开的。

举例:

设计一套缓存框架需要关注的要素
            
    
    博客分类: FrameworkPerformance 缓存框架 

 

3、重要特性,这些特性不一定全部要具备,但是多数都要包含:

 

  • 一致性选择。缓存框架的设计必须首先考虑这一点。通常我们见到的缓存框架都是最终一致性的,允许获取数据有一定的延迟窗口。一致性关系到缓存的生命周期,是缓存的核心理念之一。

  • 分级存储。也和缓存生命周期密切相关。至少应包括内存和磁盘两级存储,有些缓存框架包含组网内部节点的分级等等,允许用户管理缓存数据在不同级别存储中的跃迁。分级存储还包括对存储数据的管理,以提高数据获取的效率;包括跃迁策略的定制,比如在某一级满足怎样的超时策略可以发生向下跃迁。

  • 规约配置,默认配置。可以支持XML、properties、DSL编程等等多种配置方式,但是最重要的是,要提供一个默认配置,允许用户在简单配置或者零配置的情况下使用缓存。

  • 集群、分布式,这意味着一定的伸缩性。包括内部通信协议选择,比如节点之间使用JMS、RMI或RESTful方式通信等等;包括节点热部署和节点发现能力,这通常都使用组播消息来实现;包括集群的方式,是Server-Client群、消息总线方式还是节点对等,等等。

  • 定制扩展性。尤其是淘汰算法、事件监听、持久化策略等等,都要允许用户方便地自定义。

 

4、相对较次要的特性:

 

  • 统计能力。包括各级缓存命中情况统计,生命周期长度统计。
  • 批量接口、异步接口。包括缓存分组能力。
  • 缓存数据存储校验。
  • Web支持。特指Web容器中,对于页面存储的额外支持。
  • 免锁数据处理。
  • 缓存状态监控。
  • 无侵入式拦截,注解编程支持。
  • 运行时参数调整。

……

 

5、核心模型应该包括哪些?

 

  • CacheManager:模型管理对象,可以是多实例的,也可以是单实例的。
  • Cache:通过CacheManager创建出来的缓存容器,内部包含了真正的缓存承载体,至少开放add/remove/flush等接口。
  • CacheMap:真正的缓存承载体,大致上都是一个Map,各种类型的Map。
  • CacheEntity:缓存条目,相当于CacheMap里面的每一条Entry。
  • CacheEvent:缓存事件,比如CacheEntity的创建、更新、删除等等。
  • CacheEventListener:缓存事件相应的监听器。
  • CacheEvictionAlgorithm:缓存淘汰算法,常见的有LRU、LFU、FIFO等等。

--------------------------------------------------------------------------------------------------------------------------------

2012-6-10:

 

任何一个缓存框架,它要解决什么样的问题?

数据的访问、存取、计算太慢、太不稳定、太消耗资源,同时,这样的操作存在重复性。因此希望有这样一种中间媒介,放置在其间,只保存自己关心的数据,而不关心具体数据逻辑内容,对于重复性的操作给出响应。对于数据和服务的使用者,它是透明的。

 

从请求和数据流向的角度看,一个完整的缓存框架应该包括这样几个部分:

  • 操作捕获
  • 缓存数据存储
  • 缓存数据读取
  • 缓存数据流动

因此缓存框架的功能都是围绕数据展开的,它的核心就是缓存数据的整个生命周期。

但是其中每一项都可以拆分和解耦成许多部分,以缓存数据存储为例,可以拆分成:

  • key生成
  • value封装、元数据封装
  • 索引生成
  • 文件结构生成
  • 序列化、反序列化
  • 淘汰算法
  • 过期检查
  • 存储数据预处理
  • 持久化媒介

……

但是看的到的不同实现越多,越发发现难以跳出这个思维惯性的圈子了。

 

文章系本人原创,转载请注明出处和作者

 

  • 设计一套缓存框架需要关注的要素
            
    
    博客分类: FrameworkPerformance 缓存框架 
  • 大小: 18.4 KB
相关标签: 缓存框架