Java Caching定义了5个核心接口,分别是CacheingProvider,CacheManager,Cache,Entry和Expiry
添加依赖
<dependency> <groupId>javax.cache</groupId> <artifactId>cache-api</artifactId> </dependency>
引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>javax.cache</groupId> <artifactId>cache-api</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency>
@ComponentScan({"com.zzy.demo.dao"}) @SpringBootApplication @EnableCaching//开启缓存 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
Cache 缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache等
CacheManager 缓存管理器,管理各种缓存(Cache)组件
@Cacheable 主要争对方法配置,能够根据方法的请求参数对其结果进行缓存
/** * @Cacheable将方法的运行结果进行缓存,以后再要相同的数据,直接从缓存中获取,不要调用方法 * 属性: * cacheNames/value 指定缓存组件的名字 也就是使用一张表用来储存特定的 数据 * key 缓存数据使用的key 可以用它来指定 默认是方法参数的值 因为Cache是以map的数据结构来储存的所以要指定key值 形参-方法的返回值 * keyGenerator key的默认生成器 可以自己指定key的生成器 * cacheManager 指定缓存管理器 * condition 指定符和条件的情况下才进行缓存 * unless 否定缓存 当unless指定的条件为 true 方法的返回值就不会被缓存 * sync 是否使用异步模式 * @return */ @Override @Cacheable(cacheNames = "book" ,key="#id",keyGenerator = "myKeyGenerator")//指定自定义的key生成器 public List<Book> selectBook() { List<Book> bookList = bookMapper.selectByExample(bookExample); return bookList; } }
//自己指定key值生成器 @Configuration public class MyConfiguration extends WebMvcAutoConfiguration { @Bean("myKeyGenerator") public KeyGenerator myKeyGenerator(){ return new KeyGenerator() { @Override public Object generate(Object o, Method method, Object... objects) { int i = 0; return method.getName()+"zzy"+i++; } }; } }
@CacheEvict 清空缓存 缓存清除
/** * value 指定表 * key 指定删除的key键值对 * allEntries 是否删除缓存中的所有数据 默认是false 不删除 * beforeInvocation = false 指定缓存的清除是否在方法之前清除 默认在方法之后执行清除 可以防止异常的抛出 事务 * @param id * @return */ @CacheEvict(value = "book",key = "#id") public Integer delBook(Integer id){ Integer i = bookMapper.deleteByPrimaryKey(id); return i; }
/** * @Cache 和 @Cacheable 前者是先调用目标方法 再将目标方法的结果返回回来 * 注意: @Cache 方法会自动更新数据库和缓存库中的数据 但是要注意的是 map数据结构的特性是key值覆盖 所以它们的key值要是一样的 要专门指定key的值和存入时的key值相等 注意 关于#result的取值 @Cacheable 注解的返回值是在方法运行之前的 而 @CachePut 的返回值是在方法运行之后的 * @param book * @return */ @CachePut(value = "book",key = "#Book.id")//key="#result.id" public Integer selectBook(Book book) { Integer bookList = bookMapper.updateByPrimaryKey(book); return bookList; } }
@Caching( cacheable = { @Cacheable(value = "book",key = "id") }, put = { @CachePut(value = "book" , key = "name"), @CachePut(value = "book",key = "wirte") } ) public Book select(Integer id){ Book book = bookMapper.selectByPrimaryKey(id); return book; }
@CacheConfig(cacheNames = "book") public class BookServiceImpl implements BookService {
docker run -d -p 6379:6379 --name myredis redis
引入Redis的starter
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency>
配置redis
spring: redis: host: 192.168.11.xxx
一但redis成功引入 springboot自动配置起效 会帮助我产生两个bean对象 StringRedisTemplate 和 RedisTemplate 对象用来简化操作redis的
StringRedisTemplate:专门操作字符串
RedsiTemplate:专门操作对象
设置自定义序列化器 更改默认的JdkSerializationRedisSerializer 序列化器 这样传出的值就是json了
修改RedisCacheManager
@Bean public RedisTemplate<Object,Object> redisTemplate(){ RedisTemplate<Object,Object> template = new RedisTemplate<>(); Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<Object>(Object.class); template.setDefaultSerializer(serializer); return template; } @Bean public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory){ RedisCacheWriter redisCacheWriter = RedisCacheWriter.lockingRedisCacheWriter(redisConnectionFactory); RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())); RedisCacheManager redisCacheManager = new RedisCacheManager(redisCacheWriter,redisCacheConfiguration); return redisCacheManager; }