@CacheNamespace 是用于在 Mapper 接口上,配置该 Mapper 的二级缓存参数,这样每一个 Mapper 都可以自定义二级缓存的配置。
package com.test.mapper;
import org.apache.ibatis.annotations.CacheNamespace;
import org.apache.ibatis.annotations.Mapper;
@Mapper
@CacheNamespace(size = 512) // 配置缓存大小为 512
public interface UserMapper {
}
implementation 用于指定缓存实现类,MyBatis 提供了默认的实现 PerpetualCache,它是一个简单的、永久存储的缓存实现,我们也可以指定自定义的缓存实现类,比如,我们也可以使用 Redis 实现,首先先实现 Cache 接口,实现该接口的方法,然后操作 Redis 即可。
public class UserRedisCache implements Cache {
// 自定义 Redis 缓存实现
}
@CacheNamespace(
implementation = UserRedisCache.class
)
public interface UserMapper {
}
MyBatis 提供了几种常用的回收策略,例如 LRU(最近最少使用)、FIFO(先进先出)和 SOFT(软引用)。
LRU 是在缓存空间不足时,优先移除那些最近最少使用的缓存项。换句话说,当缓存满了,需要腾出空间时,会优先移除最近最不常访问的数据。
优点:能有效提高缓存的命中率,适合访问频率有明显差异的场景。
缺点:实现相对复杂,维护一个按访问时间排序的数据结构需要一定的开销。
FIFO 是在缓存空间不足时,优先移除最早加入缓存的数据项。即按照数据进入缓存的顺序进行回收。
优点:实现简单,不需要复杂的数据结构。
缺点:无法适应访问频率变化大的场景,可能会移除仍然频繁使用的数据。
SOFT 是一种利用 Java 语言特性的缓存回收策略。它会在 JVM 内存不足时回收缓存中的对象,而不是在缓存空间满时立即回收。使用软引用的对象在内存充足时不会被回收,只有在 JVM 内存不足时才会被垃圾回收器回收。
优点:能更好地利用内存,当内存充足时可以缓存更多的数据,适合对内存敏感的应用。
缺点:不可预测回收时间,可能会导致缓存命中率较低。
示例
// LRU 回收
@CacheNamespace(
eviction = org.apache.ibatis.cache.impl.LruCache.class
)
public interface UserMapper {
}
// FIFO 回收
@CacheNamespace(
eviction = org.apache.ibatis.cache.impl.FifoCache.class
)
public interface UserMapper {
}
// SOFT 回收
@CacheNamespace(
eviction = org.apache.ibatis.cache.impl.SoftCache.class
)
public interface UserMapper {
}
size 用于设置缓存的大小,即缓存中可以存储的对象数量。超过这个数量后,将根据回收策略进行缓存对象的回收,以腾出空间存储新的缓存对象。这样的话,我们就能限制缓存占用的内存,以避免缓存占用过多内存资源。
@CacheNamespace(
size = 512 // 缓存大小为 512
)
public interface UserMapper {
}
readWrite 用于指定缓存是否为读写模式。如果为 true,MyBatis 会对缓存中的对象进行序列化和反序列化,以确保缓存中的对象是线程安全的。默认值为 true。
然后我们需要保证缓存中的对象是线程安全的,那么就设置为 ture 即可,如果不需要保证,只想要效率,那就设置成 false。大多数的环境下都是设置 fasle 即可。
@CacheNamespace(
readWrite = true // 开启读写缓存
)
public interface UserMapper {
}