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

如何实现

以上大致介绍了实现一个本地缓存我们都有哪些需要考虑的地方 , 当然可能还有其他没有考虑到的点;下面继续看看关于每个点都应该如何去实现 , 重点介绍一下思路;

1.数据结构

本地缓存最常见的是直接使用Map来存储 , 比如guava使用ConcurrentHashMap , ehcache也是用了ConcurrentHashMap , Mybatis二级缓存使用HashMap来存储:

Map<Object Object> cache = new ConcurrentHashMap<Object Object>()

Mybatis使用HashMap本身是非线程安全的 , 所以可以看到起内部使用了一个SynchronizedCache用来包装 , 保证线程的安全性;
当然除了使用Map来存储 , 可能还使用其他数据结构来存储 , 比如redis使用了双端链表 , 压缩列表 , 整数集合 , 跳跃表和字典;当然这主要是因为redis对外提供的接口很丰富除了哈希还有列表 , 集合 , 有序集合等功能;

2.对象上限

本地缓存常见的一个属性 , 一般缓存都会有一个默认值比如1024 , 在用户没有指定的情况下默认指定;当缓存的数据达到指定最大值时 , 需要有相关策略从缓存中清除多余的数据这就涉及到下面要介绍的清除策略;

推荐阅读