Java Caching定义5个核心接口:CachingProvider,CacheManager,Cache,Entry,Expiry
<dependency>
<groupId>javax.cachegroupId>
<artifactId>cache-apiartifactId>
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 中
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
SimpleKeyGenerator生成key的策略:
1.如果没有参数: key=new SimpleKey()
2.如果有一个参数: key=参数的值
3.如果有多个参数: key=new SimpleKey(params)
在运行过程中,执行完@CachePut的方法,查询的结果还是之前的数据 :
- 因为在没有指定key值的情况下,key值默认是方法的参数.
- 当方法的参数值不同时,Cache根据key查询缓存数据,key值对应的数据并没有更新.
- 如果需要同步更新缓存数据,需要指定为相同的key值,缓存中的数据才会更新
- 在@Cacheable中不能像@CachePut中使用result属性,
- 因为在@Cacheable是先判断注解,此时没有result值,而在@CachePut是先执行方法
@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.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
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(有序集合)