文章目录
  1. 1. 一、缓存特征
  2. 2. 二、本地缓存
  3. 3. 三、分布式缓存

一、缓存特征

  • 命中率
  • 最大缓存存放空间
  • 清空策略:

    • FIFO先入先出
    • LFU,最少使用(可以保证高频数据有效)
    • LRU,最近最少使用(优先保证热点数据)

二、本地缓存

静态变量

  • 使用Zookeeper自动更新(保证一致性)
  • 缺点:受到heap区影响,缓存数据有限

Guava Cache

  • 功能与特点:

    • 可以自动将Entry节点加载入缓存
    • 缓存数据如果超过限制,采用LRU清理策略清理
    • 根据Entry节点上次被访问时间或写入时间计算过期机制
    • Key封装在WeakReference引用中
    • Value封装在SoftReference引用中
  • 实现机制:

    • 模仿ConcurrentHashMap,ReferenceEntry封装键值对,ValueReference封装值
    • 每个Segment包含ReferenceEntry链,每个ReferenceEntry包含key、hash、valueReference和next
    • ValueReference对应四种实现(Strong/Soft/Weak/Loading),LoadingValueReference支持动态加载(加载完成后替换成其他类型)
    • access链(实现LRU):访问节点如果在链表中,移动到最后,否则直接加在最后,poll时直接删除头节点的下一个节点
    • write链(实现LRU):类似access链
  • 使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* Callable
*/
public void callablex() throws ExecutionException
{
Cache<String, String> cache = CacheBuilder.newBuilder()
.maximumSize(1000).build();
String result = cache.get("key", new Callable<String>()
{
public String call()
{
return "result";
}
});
System.out.println(result);
}

三、分布式缓存

Redis

  • 核心变量redisObject:

    • 数据类型:string/hash/list/set/zset
    • 编码方式:raw/zipmap/ziplist/intset/skiplist
  • 线程模型:

    • 套接字:套接字操作抽象成文件事件
    • I/O多路复用:监听多个套接字,把文件事件放入队列
    • 文件事件分派:接收并传给相应的事件处理器
    • 事件处理器:处理事件
  • Redis为什么快:

    • 绝大部分请求是纯粹的内存操作(非常快速)
    • 采用单线程,避免了不必要的上下文切换和竞争条件
    • 非阻塞IO
文章目录
  1. 1. 一、缓存特征
  2. 2. 二、本地缓存
  3. 3. 三、分布式缓存