背景
在构建OTA平台系统的时候,经常需要判断一些数据是否存在,并且取得旧数据相关的一些值。本来是使用了Guava Cache了已经,不过考虑到刚好想要提升下自己的水平,单单使用别人的缓存工具还不如自己直接手动撸一个,这才有了这个项目。至于缓存的名字,笔者想想还是以后再说吧,名字啥的其实也不太重要~
竞品分析
只是个调侃啦,主要目的是看下其他缓存的具体功能以及相应的优缺点,在设计笔者自己的缓存的时候,就可以相应的看看能否取长补短(虽然不太现实)。
先来看看我们分析哪几款缓存:Guava Cache、Jodd Cache、Ehcache、Memcached、Redis。
Guava Cache
- 轻量,适用于非复杂的缓存场景
- 支持LRU、FIFO、LFU元素移除策略
- 支持对key和value的软引用、弱引用
- 支持缓存使用过程中的数据统计(包括:命中率、异常率和未命中率等等)
- 不支持缓存数据支持化
- 不支持分布式
Jodd Cache
- 非常轻量、代码简单,适用于简单的缓存场景(比Guava Cache还要轻量)
- 支持LRU、FIFO、LFU元素移除策略
- 不支持缓存数据持久化
- 不支持分布式
EhCache
- 支持完整的缓存策略
- 支持缓存持久化
- 支持分布式缓存
- 支持分布式需要额外的代码配置,配置相对麻烦
Memcached
- 支持完整的缓存策略
- 支持分布式缓存
- 不支持缓存持久化
- 分布式需要额外的服务器支持(通过客户端实现分布式缓存,原理为一致性hash算法)
Redis
- 支持完整的缓存策略
- 核心不支持分布式缓存
- 支持缓存持久化
- 分布式实现需要第三方的支持(官方分布式配置非常复杂,且需要更换客户端);且需要额外的服务器支持
总结以及功能点
结合了解了这么多的功能需求,笔者目前实现的目标是:支持内存缓存、缓存持久化、不同缓存策略、定时缓存清理、懒过期机制、分布式缓存。
计划(会根据项目的实际进展来实时更新)
第一个版本,性能可以一般,但是缓存该有的功能不能缺少。比如:存入缓存,缓存失效,缓存过期自动清理等等。
以下是第一个版本的功能点:
- 内存缓存
- 定时过期策略
- 分级缓存(系统内存 -> 原数据源)
- 使用文档