Redis是常用的分布式缓存工具,Spring Boot中提供了方便的Redis集成和优雅的使用方式,其中一个常用的注解是@Cacheable
。在使用@Cacheable
时,我们可以指定缓存的key值,key值可以是一个字符串,也可以是一个Java对象,本文将详细讲解如何使用Java对象作为@Cacheable
注解的参数。
使用Java对象作为@Cacheable
注解的参数
使用Java对象作为@Cacheable
注解的参数可以方便我们进行个性化的缓存处理,通过指定对象的某些属性作为缓存的key值,可以保证缓存的可读性和准确性。在指定Java对象作为key值时,我们需要注意以下几点:
-
Java对象必须实现Serializable接口,否则会报
java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type
异常。 -
使用对象作为key值时,该对象的属性必须保证唯一性,否则会出现误命中的情况。
下面将通过两个示例演示如何使用Java对象作为@Cacheable
注解的参数。
示例1:使用字符串类型的Java对象作为@Cacheable
注解的参数
/**
* 用户实体类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private String id;
private String name;
private Integer age;
}
/**
* Redis缓存服务
*/
@Service
public class RedisService {
private static final String USER_KEY = "user:%s";
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 获取用户信息
*
* @param id 用户ID
* @return 用户信息
*/
@Cacheable(cacheNames = "user", key = "#user.getId()", cacheManager = "redisCacheManager")
public User getUserById(User user) {
// 从数据库中获取用户信息
User result = getUserFromDBById(user.getId());
return result;
}
/**
* 从数据库中获取用户信息
*
* @param id 用户ID
* @return 用户信息
*/
private User getUserFromDBById(String id) {
// 从数据库中获取用户信息,省略代码
}
}
在上述代码中,我们在getUserById
方法上添加了@Cacheable
注解,并使用了#user.getId()
作为缓存的key值。当调用getUserById
方法时,如果Redis缓存中存在以用户ID作为key值的缓存,则直接从缓存中获取用户信息;如果缓存中不存在,则从数据库中获取用户信息,并将用户信息添加到Redis缓存中。此处使用StringRedisTemplate
来操作Redis缓存,因为key值是字符串类型。
示例2:使用自定义Java对象作为@Cacheable
注解的参数
/**
* 商品实体类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product implements Serializable {
private String id;
private String name;
private String category;
}
/**
* Redis缓存服务
*/
@Service
public class RedisService {
private static final String PRODUCT_KEY = "product:%s:%s";
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 获取商品信息
*
* @param product 商品对象
* @return 商品信息
*/
@Cacheable(cacheNames = "product", key = "#product.getId() + ':' + #product.getName()", cacheManager = "redisCacheManager")
public Product getProduct(Product product) {
// 从数据库中获取商品信息
Product result = getProductFromDB(product.getId(), product.getName());
return result;
}
/**
* 从数据库中获取商品信息
*
* @param id 商品ID
* @param name 商品名称
* @return 商品信息
*/
private Product getProductFromDB(String id, String name) {
// 从数据库中获取商品信息,省略代码
}
}
在上述代码中,我们自定义了一个Product
类作为缓存的key值,使用#product.getId() + ':' + #product.getName()
作为缓存的key。当调用getProduct
方法时,如果Redis缓存中存在以商品ID和商品名称组成的字符串作为key值的缓存,则直接从缓存中获取商品信息;如果缓存中不存在,则从数据库中获取商品信息,并将商品信息添加到Redis缓存中。此处使用RedisTemplate
来操作Redis缓存,因为key值是自定义的Java对象。
总结
使用Java对象作为@Cacheable
注解的参数可以方便我们进行缓存处理,提高缓存的可读性和准确性。需要注意Java对象必须实现Serializable接口,而且使用对象作为key值时,该对象的属性必须保证唯一性。在使用@Cacheable
注解时,还需要指定缓存的key值和缓存的管理器。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:手写redis@Cacheable注解 参数java对象作为key值详解 - Python技术站