缓存应用学习
一、缓存特征
- 命中率
- 最大缓存存放空间
清空策略:
- 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链
使用方法:
|
|
三、分布式缓存
Redis
核心变量redisObject:
- 数据类型:string/hash/list/set/zset
- 编码方式:raw/zipmap/ziplist/intset/skiplist
线程模型:
- 套接字:套接字操作抽象成文件事件
- I/O多路复用:监听多个套接字,把文件事件放入队列
- 文件事件分派:接收并传给相应的事件处理器
- 事件处理器:处理事件
Redis为什么快:
- 绝大部分请求是纯粹的内存操作(非常快速)
- 采用单线程,避免了不必要的上下文切换和竞争条件
- 非阻塞IO