Java Caching定义5个核心接口:CachingProvider,CacheManager,Cache,Entry,Expiry
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
</dependency>
1.导入数据库文件,创建,创建表
2.创建javabean封装数据
3.整合MyBatis操作数据库
1.配置数据源信息
2.使用Mybatis,创建数据库操作语句
1.开启基于注解的缓存 @EnableCaching
2.标注缓存注解
缓存重要概念
缓存注解
属性:
cacheNames/value:指定缓存组件的名字,将方法的返回结果放在缓存中,是数组的方式,可以指定多个缓存(CacheManager管理多个Cache组件,对缓存的真正CRUD操作在Cache组件中,每一个缓存组件有自己唯一一个名字)
key:缓存数据使用的key,可以用key指定键值,默认使用方法参数的值(SpEL:methodName(当前被调用的方法名),
method(当前被调用的方法),
target(当前被调用的目标对象),
targetClass(当前被调用的目标对象类),
args(当前被调用的方法参数列表),
caches(当前方法调用使用的缓存列表),
argument name(方法参数的名字-#参数),
result(方法执行后的结果返回值))
keyGenerator:key的生成器,可以指定key的生成器组件.
cacheManager:指定缓存管理器,
cacheResolver:指定缓存解析器,和缓存管理器一样
condition:指定符合条件的情况下才进行缓存
unless:否定缓存-当unless指定的条件为true,方法的返回值就不会缓存.可以获取到结果进行判断
sysnc:是否使用异步模式,不支持unless属性
key和keyGenerator只要出现一个
cacheManager和cacheResolver只要出现一个
默认使用的是ConcurrentMapCache组件中的CacheManager进行缓存的,将数据保存在 ConcurrentMap<object,object> 中
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration
org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration
org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration (JSR107)
org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration
org.springframework.boot.autoconfigure.cache.HazelcastCacheConfiguration
org.springframework.boot.autoconfigure.cache.InfinispanCacheConfiguration
org.springframework.boot.autoconfigure.cache.CouchbaseCacheConfiguration
org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration
org.springframework.boot.autoconfigure.cache.CaffeineCacheConfiguration
org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration
org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration
@Cacheable
方法运行之前,CacheManager先获取相应的缓存,按照CacheNames指定的名字获取,,第一次获取缓存如果没有Cache组件会自动创建缓存组件
在Cache中使用key查找缓存内容,key是通过KeyGenerator生成的,默认就是方法的参数
如果没有查到缓存内容就会调用目标方法
将目标方法返回的结果,放进缓存中
流程核心:
@CachePut 既调用方法,又更新缓存数据(对数据库修改操作,会将结果保存在缓存中)
@CacheEvict 清空缓存:当数据库中数据被删除时,执行删除缓存中的数据
@Caching
@Caching(
cacheable = {
@Cacheable(value = "emp",key = "#emp.lastName"),
@Cacheable(value = "emp",key = "#emp.id")
},
put = {
@CachePut(value = "emp",key = "#emp.lastName"),
@CachePut(value = "emp",key = "#emp.id")
},
evict = {
@CacheEvict(value = "emp",key = "#emp.lastName"),
@CacheEvict(value = "emp",key = "#emp.id")
}
)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring.redis.host=192.168.32.242
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Configuration
public class MyRedisConfig {
@Bean
public RedisTemplate<Object, Employee> empRedisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<Object,Employee> redisTemplate=new RedisTemplate<Object,Employee>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<Employee> serializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
redisTemplate.setDefaultSerializer(serializer);
return redisTemplate;
}
}
Redis常见的数据类型:
String-字符串
List-列表
Set-集合
Hash-散列
ZSet-有序集合
redisTemplate.opsForValue()--String(字符串)
redisTemplate.opsForList()--List(列表)
redisTemplate.opsForSet()--Set(集合)
redisTemplate.opsForHash()--Hash(散列)
redisTemplate.opsForZSet()--ZSet(有序集合)
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
在StringRedisTemplate中:
public class StringRedisTemplate extends RedisTemplate<String, String> {
public StringRedisTemplate() {
this.setKeySerializer(RedisSerializer.string());
this.setValueSerializer(RedisSerializer.string());
this.setHashKeySerializer(RedisSerializer.string());
this.setHashValueSerializer(RedisSerializer.string());
}
public StringRedisTemplate(RedisConnectionFactory connectionFactory) {
this();
this.setConnectionFactory(connectionFactory);
this.afterPropertiesSet();
}
protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
return new DefaultStringRedisConnection(connection);
}
}
Redis常见的数据类型:
String-字符串
List-列表
Set-集合
Hash-散列
ZSet-有序集合
stringRedisTemplate.opsForValue()--String(字符串)
stringRedisTemplate.opsForList()--List(列表)
stringRedisTemplate.opsForSet()--Set(集合)
stringRedisTemplate.opsForHash()--Hash(散列)
stringRedisTemplate.opsForZSet()--ZSet(有序集合)