SpringBoot学习(七)使用Redis进行缓存,注解方式
(一)、添加依赖,SpringBoot中已经将Redis引入进来
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
(二)、配置Redis
spring.redis.host=192.168.1.150
spring.redis.port=6379
spring.redis.password=123456
#spring.redis.database=0
# 连接池最大连接数(使用负值表示没有限制)
#spring.redis.jedis.pool.max-active=10
# 连接池最大阻塞等待时间(使用负值表示没有限制)
#spring.redis.jedis.pool.max-wait=-1ms
# 连接池中最小空闲连接
#spring.redis.jedis.pool.min-idle=0
# 连接池中的最大空闲连接
#pring.redis.jedis.pool.max-idle=8
# 连接超时时间毫秒
#spring.redis.timeout=5000ms
(三)、开启缓存,在启动类使用注解 @EnableCaching
@SpringBootApplication
@MapperScan(basePackages = "com.xie.eleven.dataobject.mapper")
@EnableCaching//开启缓存
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication .class, args);
}
}
(四)、使用注解进行缓存
[email protected]设置缓存,当缓存中没有这条key数据时就执行方法内容并进行缓存,下次调用方法就不会执行方法内容了,会自动在缓存中取数据
参数解释
cacheNames:缓存的名称
key :缓存中一条数据的key,可以自定义,也可以通过EL表达式用方法的参数。
//自定义key
@Cacheable(cacheNames = "product",key = "123")
public ProductInfo findById(String productInfoId) {
return repository.findById(productInfoId).get();
}
//用方法的参数作为key
@Cacheable(cacheNames = "product",key = "#productInfoId")
public ProductInfo findById(String productInfoId) {
return repository.findById(productInfoId).get();
}
//如果方法中参数为对象,还可用对象的属性
@Cacheable(cacheNames = "product",key = "#productInfo.productInfoId")
public ProductInfo findById(ProductInfo productInfo) {
return repository.findById(productInfo.getProductInfoId).get();
}
keyGenerator:定义key生成的类,但注意和属性key的不能同时存在,上面 的例子使用默认的keyGenerator,对应spring的SimpleKeyGenerator
//使用自定义key生成器
@Cacheable(cacheNames="book3", keyGenerator="myKeyGenerator")
public ProductInfo queryCacheableUseMyKeyGenerator(String id){
.........
return productInfo ;
}
//自定义key生成器,实现KeyGenerator接口,并实现generate方法
@Component
public class MyKeyGenerator implements KeyGenerator {
@Override
public Object generate(Object target, Method method, Object... params) {
.......
.......
return 123456;
}
}
sync:设置sync=true
1. 如果缓存中没有数据,多个线程同时访问这个方法,则只有一个方法会执行到方法,其它方法需要等待;
2. 如果缓存中已经有数据,则多个线程可以同时从缓存中获取数据
condition:判断条件,在所在方法调用前进行判断,如果为true就进行缓存,false就不缓存
unless :判断条件,在所在方法调用后进行判断,如果为true就不缓存,为false就进行缓存
condition和unless可同时使用
//判断条件condition实例
@Cacheable(cacheNames="book11",key="#id" condition="T(java.lang.Integer).parseInt(#id)<3")
public ProductInfo queryCacheableWithCondition(String id) {
.........
.........
return productInfo;
}
//判断条件unless 实例
@Cacheable(cacheNames="book11",key="#id" unless ="T(java.lang.Integer).parseInt(#id)<3")
public ProductInfo queryCacheableWithCondition(String id) {
.........
.........
return productInfo;
}
[email protected],删除缓存数据
属性: allEntries ,默认为false,只删除key对应的数据;如果设置为true,则删除cacheNames=“product”中的所有数据
//删除缓存productInfo中的所有数据
@CacheEvict(cacheNames="productInfo", key="#id",allEntries=true)
public void updateBook(String id, String name){
productInfoService.updateById(id);
}
//删除缓存productInfo中key为id的那条数据
@CacheEvict(cacheNames="productInfo", key="#id")
public void updateBook(String id, String name){
productInfoService.updateById(id);
}
[email protected],每次方法调用都会进行缓存替换,常用做更新数据操作。
//更新缓存中key为id的数据
@CachePut(cacheNames="productInfo", key="#id")
public ProductInfo queryUpdate(String id){
..........
return productInfo;
}
[email protected],可以用此注解在类上定义并设置类全局属性cacheNames,则此类中的所有方法上 @Cacheable的cacheNames默认都是此值。当然@Cacheable也可以重定义cacheNames的值
@CacheConfig(cacheName="produvt")
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductInfoRepository repository;
@Override
@Cacheable(key = "123")
public ProductInfo findById(String productInfoId) {
return repository.findById(productInfoId).get();
}
//重定义cacheNames的值
@Override
@Cacheable(cacheNames = "product1111",key = "123")
public ProductInfo findById(String productInfoId) {
return repository.findById(productInfoId).get();
}
}
上一篇: SHA1算法