欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot学习(七)使用Redis进行缓存,注解方式

程序员文章站 2022-06-05 08:49:02
...

(一)、添加依赖,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();
    }
}

 

相关标签: 技术分享