WhatAKitty Daily

A Programmer's Daily Record

一起写个Cache架构【零】——分析与计划

WhatAKitty   阅读次数loading...

背景

在构建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

  • 支持完整的缓存策略
  • 核心不支持分布式缓存
  • 支持缓存持久化
  • 分布式实现需要第三方的支持(官方分布式配置非常复杂,且需要更换客户端);且需要额外的服务器支持

总结以及功能点

结合了解了这么多的功能需求,笔者目前实现的目标是:支持内存缓存、缓存持久化、不同缓存策略、定时缓存清理、懒过期机制、分布式缓存。

计划(会根据项目的实际进展来实时更新)

第一个版本,性能可以一般,但是缓存该有的功能不能缺少。比如:存入缓存,缓存失效,缓存过期自动清理等等。

以下是第一个版本的功能点:

  • 内存缓存
  • 定时过期策略
  • 分级缓存(系统内存 -> 原数据源)
  • 使用文档

一起写个Cache架构
分析与计划
基础缓存