@SpringBootApplication
@EnableCaching
public class Redis3Application {
public static void main(String[] args) {
SpringApplication.run(Redis3Application.class, args);
}
}
@Configuration
public class MyRedisConfig {
@Bean(name = "redisTemplate")
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(keySerializer());
redisTemplate.setHashKeySerializer(keySerializer());
redisTemplate.setValueSerializer(valueSerializer());
redisTemplate.setHashValueSerializer(valueSerializer());
return redisTemplate;
}
@Primary
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){
//缓存配置对象
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofMinutes(30L)) //设置缓存的默认超时时间:30分钟
.disableCachingNullValues() //如果是空值,不缓存
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer())) //设置key序列化器
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((valueSerializer()))); //设置value序列化器
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration).build();
}
private RedisSerializer<String> keySerializer() {
return new StringRedisSerializer();
}
private RedisSerializer<Object> valueSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
}
@Data
public class Product {
String name;
int id;
double print;
String factoryname;
}
@RestController
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping("/product/{id}")
public Product getProduct(@PathVariable("id") Long id) {
Product product = productService.getProductById(id);
return product;
}
//prooduct?productid=1&productName= &
@GetMapping("/product")
public Product updateProduct(Product product) {
productService.updateProduct(product);
return product;
}
@GetMapping("/delproduct")
public String delProduct(@RequestParam(value="id") Long id) {
productService.deleteProductById(id);
return "ok";
}
@GetMapping("/product/name/{productName}")
public Product getEmpByLastName(@PathVariable("productName") String productName){
return productService.getProductByName(productName);
}
}
@Service
@CacheConfig(cacheNames = "product")
public class ProductService {
@Autowired
private ProductMapper productMapper;
@Cacheable(cacheNames = "product1",key = "#root.methodName+'['+#id+']'")
//@Cacheable(cacheNames = {"product1","product2"})// 默认key为参数,多个参数SimpleKey [arg1,arg2]
//@Cacheable(cacheNames = "product",key = "#root.methodName+'['+#id+']'")
//@Cacheable(cacheNames = "product",keyGenerator = "myKeyGenerator")
//@Cacheable(cacheNames = "product",key = "#root.methodName+'['+#id+']'",condition="#a0>10",unless = "#a0==11") //或者condition="#id>10")
public Product getProductById(Long id){
Product product =productMapper.getProductById(id);
System.out.println(product);
return product;
}
@CachePut(value="product",key = "#result.id",condition = "#result!=null")
public Product updateProduct(Product product){
int count = productMapper.updateProduct(product);
System.out.println("影响行数:"+count);
if(count>0){
return product;
}else{
return null;
}
}
//@CacheEvict(value="product",key="#id")
//@CacheEvict(value="product",allEntries = true) //清除所有缓存
@CacheEvict(value="product",allEntries = true,beforeInvocation = true) //清除所有缓存
public boolean deleteProductById(Long id) {
productMapper.deleteProductById(id);
return true;
}
//含有CachePut注解,所以执行这个方法时一定会查询数据库,及时有cacheable注解
@Caching(
cacheable = {@Cacheable(value="product",key="#productName")},
put = {
@CachePut(value="product",key="#result.id"),
@CachePut(value="product",key="#result.name")
}
)
public Product getProductByName(String productName){
Product product =productMapper.getProductByName(productName);
return product;
}
}
@Service
public class ProductMapper {
private static Product product;
static {
product = new Product();
product.setFactoryname("工厂名字1");
product.setName("产品1");
product.setId(1);
product.setPrint(20);
}
public Product getProductById(Long id){
System.out.println("执行方法:"+ "getProductById");
return product;
}
public int updateProduct(Product product){
System.out.println("执行方法:"+ "updateProduct");
this.product = product;
product.setName(product.getName()+" 修改 ");
return 1;
}
void deleteProductById(Long id){
System.out.println("执行方法:"+ "deleteProductById");
product = null;
}
Product getProductByName(String productName){
System.out.println("执行方法:"+ "getProductByName");
return product;
}
}