如何设计一个本地缓存( 三 )

提供一个傻瓜式的对外接口是很有必要的 , 对使用者来说使用此缓存不是一种负担而是一种享受;提供常用的get , put , remove , clear , getSize方法即可;

7.是否持久化

这个其实不是必须的 , 是否需要将缓存数据持久化看需求;本地缓存如ehcache是支持持久化的 , 而guava是没有持久化功能的;分布式缓存如redis是有持久化功能的 , memcached是没有持久化功能的;

8.阻塞机制

在看Mybatis源码的时候 , 二级缓存提供了一个blocking标识 , 表示当在缓存中找不到元素时 , 它设置对缓存键的锁定;这样其他线程将等待此元素被填充 , 而不是命中数据库;其实我们使用缓存的目的就是因为被缓存的数据生成比较费时 , 比如调用对外的接口 , 查询数据库 , 计算量很大的结果等等;这时候如果多个线程同时调用get方法获取的结果都为null , 每个线程都去执行一遍费时的计算 , 其实也是对资源的浪费;最好的办法是只有一个线程去执行 , 其他线程等待 , 计算一次就够了;但是此功能基本上都交给使用者来处理 , 很少有本地缓存有这种功能;

推荐阅读