Spring Boot 的 Redis 最佳实践

港控/mmm° 2022-05-22 11:12 347阅读 0赞

1. pom.xml引用

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

2. RedisConfig 配置

  1. @Configuration
  2. public class RedisConfig extends CachingConfigurerSupport {
  3. @Bean
  4. public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
  5. RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
  6. // 设置缓存过期时间 (秒)
  7. cacheManager.setDefaultExpiration(2 * 60);
  8. return cacheManager;
  9. }
  10. @Bean
  11. public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
  12. StringRedisTemplate template = new StringRedisTemplate(factory);
  13. setJsonSerializer(template);//设置序列化工具
  14. template.afterPropertiesSet();
  15. return template;
  16. }
  17. // json 序列化定义
  18. private void setJsonSerializer(StringRedisTemplate template) {
  19. // 定义 key 的序列化方式为 string
  20. // Long类型会出现异常信息;需要我们上面的自定义key生成策略,一般没必要
  21. // 需要注意这里Key使用了 StringRedisSerializer,那么Key只能是String类型的,不能为Long,Integer,否则会报错抛异常。
  22. // 就是假如 PostRepository 里定义的 @Cacheable(key="#p0") 的话就会报错,因为这样作为key的是int型,key必须为String。
  23. StringRedisSerializer redisSerializer = new StringRedisSerializer();
  24. // JdkSerializationRedisSerializer redisSerializer = new JdkSerializationRedisSerializer();
  25. template.setKeySerializer(redisSerializer);
  26. template.setHashKeySerializer(redisSerializer);
  27. // 定义 value 的序列化方式为 json
  28. @SuppressWarnings({
  29. "rawtypes", "unchecked"})
  30. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  31. ObjectMapper om = new ObjectMapper();
  32. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  33. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  34. jackson2JsonRedisSerializer.setObjectMapper(om);
  35. template.setValueSerializer(jackson2JsonRedisSerializer);
  36. template.setHashValueSerializer(jackson2JsonRedisSerializer);
  37. }
  38. }

3. Service层使用

  1. @Service
  2. @CacheConfig(cacheNames="cityCache") // 本类内方法指定使用缓存时,默认的名称就是 cityCache
  3. @Transactional
  4. public class CityServiceImpl extends AbstractService<City> implements CityService {
  5. private Logger log = LoggerFactory.getLogger(CityServiceImpl.class);
  6. @Autowired
  7. private CityMapper cityMapper;
  8. // 因为必须要有返回值,才能保存到数据库中,如果保存的对象的某些字段是需要数据库生成的,
  9. // 那保存对象进数据库的时候,就没必要放到缓存了
  10. // 必须要有返回值,否则没数据放到缓存中
  11. @CachePut(key="'cityId:' + #p0.id") //#p0表示第一个参数
  12. public City insert(City city){
  13. cityMapper.insert(city);
  14. //u对象中可能只有只几个有效字段,其他字段值靠数据库生成,比如id
  15. return cityMapper.selectByPrimaryKey(city.getId());
  16. }
  17. @CachePut(key="'cityId:' + #p0.id")
  18. public City updateCity(City city){
  19. cityMapper.updateByPrimaryKeySelective(city);
  20. //可能只是更新某几个字段而已,所以查次数据库把数据全部拿出来全部
  21. return cityMapper.selectByPrimaryKey(city.getId());
  22. }
  23. // @Cacheable 会先查询缓存,如果缓存中存在,则不执行方法
  24. @Cacheable(key="'cityId:' + #p0")
  25. public City find(Integer id){
  26. log.info("根据id=" + id +"获取用户对象,从数据库中获取");
  27. return cityMapper.selectByPrimaryKey(id);
  28. }
  29. public List<City> findAll() {
  30. return cityMapper.selectAll();
  31. }
  32. // 删除缓存名称为 userCache ,key等于指定的id对应的缓存
  33. @CacheEvict(key="'cityId:' + #p0")
  34. public void delete(Integer id){
  35. cityMapper.deleteByPrimaryKey(id);
  36. }
  37. // 清空缓存名称为 userCache(看类名上的注解)下的所有缓存
  38. //如果数据失败了,缓存时不会清除的
  39. @CacheEvict(allEntries = true)
  40. public void deleteAll(){
  41. // cityMapper.deleteByPrimaryKey();
  42. }
  43. }

这里写图片描述

发表评论

表情:
评论列表 (有 0 条评论,347人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring Boot 安全最佳实践

    Spring Boot 安全的最佳实践 在 Web 应用程序中,安全性是至关重要的。恶意攻击者可能会利用您的应用程序中的弱点来获取敏感信息或者窃取用户数据。为了保护您的应