- 简介
- 为什么要Cache
- 你都了解哪些Cache?
- 对本地缓存你会如何设计
- 本地缓存的设计
- Cache接口设计
- Cache默认存储设计
- SynchronizedCache 设计及实现
- LoggingCache 设计及实现
- FifoCache设计及实现
- LruCache 设计及实现
- 总结(Summary)
- 降低数据库的访问压力.
- 提高查询的性能,改善用户体验.
- 浏览器缓存
- 数据持久层的Cache(MyBatis中的Cache设计)
- 逻辑处理层的Cache(Spring中的Cache)
- CPU的高速缓存
- 数据的存储结构(散列存储)
- 数据的淘汰算法(FIFO,LRU)
- 任务调度策略(定时刷新缓存)
- 缓存日志的记录(命中率)
- GC时会缓存数据的影响
我们在设计Cache时,一般会先设计一个接口,定义一套规范,例如:
package com.jt.cache;
public interface Cache {
void putObject(Object key,Object value);
Object getObject(Object key);
Object removeObject(Object key);
void clear();
int size();
//...
}
Cache默认存储设计
设计一个Cache的默认存储对象,主要用于存储数据,例如:
package com.jt.cache;
import java.util.HashMap;
import java.util.Map;
public class DefaultCache implements Cache{
private Map
SynchronizedCache 设计及实现
线程安全的Cache设计及实现,例如:
package com.jt.cache;
public class SynchronizedCache implements Cache {
private Cache cache;
public SynchronizedCache(Cache cache) {
this.cache = cache;
}
@Override
public synchronized void putObject(Object key, Object value) {
cache.putObject(key, value);
}
@Override
public synchronized Object getObject(Object key) {
return cache.getObject(key);
}
@Override
public synchronized Object removeObject(Object key) {
return cache.removeObject(key);
}
@Override
public void clear() {
cache.clear();
}
@Override
public int size() {
return cache.size();
}
@Override
public String toString() {
return "SynchronizedCache{" +
"cache=" + cache +
'}';
}
public static void main(String[] args) {
Cache cache = new SynchronizedCache(new DefaultCache());
cache.putObject("A", 100);
cache.putObject("B", 200);
System.out.println(cache);
}
}
LoggingCache 设计及实现
实际工作中我们经常要分析和监控缓存的命中率,例如我们设计了缓存,但为什么还是查询了数据库,有多少请求数据来自缓存,多少请求查询了数据库等,此时需要一个基于日志进行分析的一个过程,因此LoggingCache对象诞生,例如:
package com.jt.cache;
public class LoggingCache implements Cache{
private Cache cache;
private int requests;
private int hints;
public LoggingCache(Cache cache){
this.cache=cache;
}
@Override
public void putObject(Object key, Object value) {
cache.putObject(key,value);
}
@Override
public Object getObject(Object key) {
//1.记录请求次数
requests++;
//2.从cache获取数据
Object object = cache.getObject(key);
if(object!=null){
//计算命中率
hints++;
System.out.println("hits/requests is "+hints*1.0/requests);
}
return object;
}
@Override
public Object removeObject(Object key) {
return cache.removeObject(key);
}
@Override
public void clear() {
cache.clear();
}
@Override
public int size() {
return cache.size();
}
public static void main(String[] args) {
LoggingCache loggingCache =
new LoggingCache(new DefaultCache());
loggingCache.putObject("A",100);
loggingCache.putObject("B",200);
loggingCache.putObject("C",300);
loggingCache.getObject("D");
loggingCache.getObject("A");
loggingCache.getObject("A");
}
}
FifoCache设计及实现
缓存可以提供的内存空间是有限的,在缓存满的时候,我们要提供一些数据淘汰策略,接下来我们基于FIFO算法,对缓存进行设计,例如:
package com.jt.cache;
import java.util.Deque;
import java.util.linkedList;
public class FifoCache implements Cache{
private Cache cache;
private int maxCap;
private Deque
LruCache 设计及实现
基于LRU算法(最近最少使用算法)对缓存进行数据淘汰设计,例如:
package com.cy.java.cache;
import java.util.linkedHashMap;
import java.util.Map;
public class LruCache implements Cache {
private Cache cache;
private Object eldestKey;
private Map
总结(Summary)
本章节为基础拓展章节,重点是通过本地缓存的设计,加强Java中一些基础点的理解,同时在Java缓存设计上做一个拔高.



