关于缓存框架,本人早年在一些中小型项目中自己用Map封装过一个进程内的本地缓存方案。后来陆续用过ehcache、及memcache等特定厂商实现的缓存。他们之间没有太大的可比性,因为各自都有自己的特点和优劣。而因业务场景的复杂多变,让我开始考虑在同一个应用系统中能否同时使用不同的缓存实现。
然而,如果直接使用每个缓存厂商自己的api来实现这种需求,将会使得业务代码与缓存操作的在代码混在一起,可移值和可维护性都很差。为了解决可移值性问题,spring3给出了一种通过注解的方式来统一api,spring3的缓存模块,除了给出了一种基于Map的内存实现外,并没有其它的具体实现,需要用户自己配置一个特定缓存实现的缓存管理器。
然而,spring的support包中只提供ehcache等少数几种缓存的缓存管理器实现。对于诸如memcache等缓存,还是要自己实现在缓存管理器。而且还有诸如当数据库中没有数据时,因为没有缓存null值,导致每次从都数据库中查询引起缓存穿透现象,还有诸如,当memcache挂掉时,如果暂停使用缓存等等。再如,如何要为同一种类型的不同实例在缓存中缓存存活时间不一样等等这种个性化的需求spring框架并没有很好的支持,需要自己实现。
从本周开始,将陆续通过文档展示一个自己实现的通用缓存框架,满足上述所有需求,总结如下:
1、提供统一的缓存操作api(包括注解以及相应的工具类)。
2、支持同时使用多种缓存实现。这样做可适用的一个业务场景就是:如在某游戏系统中可以通过配置将会员信息缓存到分布式部署的memcache缓存中,而将会员后台界面中的权限菜单缓存在本地ehcache缓存或者干脆放到基于Map的内置缓存中(会员只能在同一个服务器登录,因此比如权限菜单之类的数据没必要缓存到分布式缓存容器中)。
3、提供灵活的配置。所有需要缓存的数据都通过配置实现在具体使用什么缓存,并可以随时通过修改配置进行切换。
4、需要防止缓存穿透。以便在数据库中没有数据时,因缓存无法命中而每次都查询数据库。
5、需要可以灵活指定缓存存活时间。比如让某些比较重要的会员在缓存中存久一点,而让某些不重要的会员在缓存中存短一点。
6、需要任意控制缓存的停用或启用。比如,在使用memcache缓存时,memcache服务器还没有搭建好,可以先在应用层上暂停使用缓存,等memcache服务器正常了,再启用缓存。
满足以上需求的通用缓存框架,本人已经基本实现,目前处于测试和写文档阶段。
目前JAD-CACHE项目已在开源中国码云平台上开源,地址:
https://git.oschina.net/457049726/jad-cache
想了解更多信息或者想及时知道进展的同学们可以扫描以下二维码关注本人的微信公众号,多谢。
欢迎扫码关注本人微信公众号以获取最新进展及更多信息
原创声明:本文纯属原创,如需转载,请指明出处