缓存
jboot
# 缓存
# 目录
- 描述
- 配置
- 使用
- EhCache
- Redis
- EhRedis
- caffeine
- caredis
- J2Cache
- NoneCache
# 描述
Jboot 定位为高性能的微服务框架,然而高性能离不开合理的缓存设计。Jboot 内置了丰富的框架支持,比如:
- ehcache
- redis
- ehredis
- caffeine
- caredis
- j2cache
# 配置
默认情况下,用户无需做任何配置就可以使用 Jboot 的缓存功能,默认情况下 Jboot 是使用 caffeine
作为 Jboot 的缓存方案。
如果需要修把 caffeine
方案修改为使用 redis
,则可以添加如下的配置:
jboot.cache.type = redis
在使用 redis
作为默认的缓存方案时,需要配置上 redis
的相关信息,例如:
jboot.cache.redis.host = 127.0.0.1
jboot.cache.redis.port = 3306
jboot.cache.redis.password
jboot.cache.redis.database
jboot.cache.redis.timeout
jboot.cache.redis.clientName
jboot.cache.redis.testOnCreate
jboot.cache.redis.testOnBorrow
jboot.cache.redis.testOnReturn
jboot.cache.redis.testWhileIdle
jboot.cache.redis.minEvictableIdleTimeMillis
jboot.cache.redis.timeBetweenEvictionRunsMillis
jboot.cache.redis.numTestsPerEvictionRun
jboot.cache.redis.maxAttempts
jboot.cache.redis.maxTotal
jboot.cache.redis.maxIdle
jboot.cache.redis.maxWaitMillis
jboot.cache.redis.serializer
当,以上未配置的时候,Jboot 自动会去寻找 redis
模块来使用,redis
的配置为:
jboot.redis.host
jboot.redis.port
jboot.redis.password
jboot.redis.database
jboot.redis.timeout
jboot.redis.clientName
jboot.redis.testOnCreate
jboot.redis.testOnBorrow
jboot.redis.testOnReturn
jboot.redis.testWhileIdle
jboot.redis.minEvictableIdleTimeMillis
jboot.redis.timeBetweenEvictionRunsMillis
jboot.redis.numTestsPerEvictionRun
jboot.redis.maxAttempts
jboot.redis.maxTotal
jboot.redis.maxIdle
jboot.redis.maxWaitMillis
jboot.redis.serializer
以下是 JbootRedisCacheImpl
的部分代码:
public class JbootRedisCacheImpl extends JbootCacheBase {
private JbootRedis redis;
public JbootRedisCacheImpl() {
JbootRedisCacheConfig redisConfig = Jboot.config(JbootRedisCacheConfig.class);
//优先使用 jboot.cache.redis 的配置
if (redisConfig.isConfigOk()) {
redis = JbootRedisManager.me().getRedis(redisConfig);
}
// 当 jboot.cache.redis 配置不存在时,
// 使用 jboot.redis 的配置
else {
redis = Jboot.getRedis();
}
if (redis == null) {
throw new JbootIllegalConfigException("can not get redis, please check your jboot.properties , please correct config jboot.cache.redis.host or jboot.redis.host ");
}
}
//....
}
# 使用缓存
# 显式代码调用
Jboot 提供了一个工具类 CacheUtil,我们可以直接通过 CacheUtil 来操作缓存。
# 添加内容到缓存
CacheUtil.put("cacheName","key","value")
# 添加内容到缓存,并设置该缓存的有效期为 10 秒钟
CacheUtil.put("cacheName","key","value",10)
# 获取缓存内容
String value = CacheUtil.get("cacheName","key");
# 删除缓存
CacheUtl.remove("cacheName","key")
# 重新设置某个缓存的有效期
CacheUtil.setTtl("cacheName","key")
当一个系统有多个缓存组件的时候,可能有 redis 或者 ehcache 等,则可以使用如下use("type") 进行操作。
CacheUtil.use("redis").put("cacheName","key","value")
CacheUtil.use("ehcache").put("cacheName","key","value")
# 通过注解使用缓存
- @Cacheable
- @CacheEvict
- @CachesEvict
- @CachePut
在 service 中,Jboot 提供了以上的 4 个组件,方便我们进行缓存操作,而无需使用 CacheUtil 来显示调用。
例如:
@Bean
public class CommentServiceImpl implements CommentService {
@Override
public String getCommentById(String id) {
return "id:" + id + " data:" + UUID.randomUUID();
}
@Override
@Cacheable(name = "cacheName", key = "#(id)")
public String getCommentByIdWithCache(String id) {
return "id:" + id + " data:" + UUID.randomUUID();
}
@Override
@Cacheable(name = "cacheName", key = "#(id)", liveSeconds = 5)
public String getCommentByIdWithCacheTime(String id) {
return "id:" + id + " data:" + UUID.randomUUID();
}
@Override
@CachePut(name = "cacheName", key = "#(id)")
public String updateCache(String id) {
return "id:" + id + " data:" + UUID.randomUUID();
}
@Override
@CacheEvict(name = "cacheName", key = "#(id)")
public void delCache(String id) {
}
}
getCommentById
方法没有使用任何注解,每次调用的时候,data后面的都是一个新的随机数。getCommentByIdWithCache
使用@Cacheable
注解,缓存的 key 是传入进来的 id,因此只要是同一个 id 值,每次返回的随机数都是一样的,因为随机数已经被缓存起来了。getCommentByIdWithCacheTime
使用@Cacheable
注解,但是添加了5秒
的时间限制,因此,在 5秒钟内,无论调用多少次,返回的随机数都是一样的,5秒之后缓存被删除,再次调用之后会是一个新的随机数,新的随机数会继续缓存 5秒钟。updateCache
使用了注解@CachePut
,每次调用此方法之后,会更新掉该 id 值的缓存delCache
使用了@CacheEvict
注解,每次调用会删除该 id 值的缓存