Spring Boot中的缓存注解@Cacheable,@CachePut,@CacheEvict 的作用及用法。

一.前言

        在 Spring Boot 项目中中,缓存是一个非常重要的话题。当我们需要频繁读取一些数据时,为了提高性能,可以将这些数据缓存起来,避免每次都从数据库中读取。为了实现缓存,Spring Boot 提供了一些缓存注解,可以方便地实现缓存功能。

二.如何启动缓存

@EnableCaching注解

        注解的作用是启用Spring缓存机制,用于自动配置适合所选缓存并使用CacheManager作为缓存管理器。这样可以方便地添加注释以声明方法需要缓存以及使用什么缓存等详细信息。

在SpringBoot项目中,我们开启缓存的话,需要使用@EnableCaching注解

 三.@Cacheable注解

1.作用

       使用@Cacheable注解就可以将运行结果缓存,以后查询相同的数据,直接从缓存中取,不需要调用方法,把方法的返回值添加缓存中

       注解中的cacheNames相当于map中的key,而返回的结果集bookTypes则是map中的value

注:如果缓存存在,则使用缓存;如果缓存不存在,则执行方法,并将结果塞入缓存

2.用法

        将@Cacheable注解放在方法上,通常是频繁使用的数据,我这边是一个图书类型,因为查询图书的时候会经常使用这个图书类型,将它存在缓存中可以避免每次都从数据库中读取,可以提高性能。

3.测试

这里我们使用postman进行端口测试

将要测试的方法端口输入postman中

 

现在将后台运行数据清空后,再测试一次这个方法的端口

 

 再测试一遍

 后台也没有再运行,而是直接从缓存中读取数据

 4.结论

      使用缓存可以有效地提升性能

 四.@CachePut注解

1.作用

        当我们查找数据时将数据库中得到的数据存在缓存中,后续如果进行添加或者删除修改等操作时,需要同步更新缓存中存储的数据,避免与数据库的数据不一致,因此在对数据库数据修改的时候,调用@CachePut注解,目的是同步数据库的数据和缓存中的数据。

        @CachePut注解是先进行方法调用,然后将方法结果更新到缓存中。

2.用法

        @CachePut注解加在方法上,通常是对数据库的数据进行操作的方法,用以更新缓存。

        这里的cacheNames对应的是缓存中的key,通过这个key可以将方法返回的结果更新到对应的缓存中。

注:@CachePut注解在调用方法的同时又更新缓存,它是默认先调用目标方法,然后将目标方法的运行结果存入缓存,不过需要注意的是如果要保持缓存同步更新,这个注解使用的key需要和缓存的key保持一致。

五.@CacheEvict注解

1.作用

       @CacheEvict注解可以标记一个方法需要删除缓存,当我们每次调用被他注解的方法的时候,就会触发这个触发器,来删除他指定的缓存。

       @CacheEvict注解是先进行方法调用,然后清除缓存。

2.用法

      将@CacheEvict注解加在方法上,通常用在数据删除方法上,用以删除缓存

     这里的cacheNames对应的是缓存中的key,通过这个key可以将方法返回的结果更新到对应的缓存中,删除相应的缓存。

 六.总结

        在 Spring Boot 中,缓存是非常重要的。通过使用缓存注解,可以方便地实现缓存功能,提高程序的性能。在代码中,我们可以通过使用 @Cacheable、@CachePut、@CacheEvict 注解来开启缓存功能,也可以通过配置文件来配置缓存属性。

 

       

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用Spring Boot整合Redis的`@Cacheable`、`@CachePut`、`@CacheEvict`注解实现增删改查的示例: 1. 添加Redis依赖 在pom.xml添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> ``` 2. 配置Redis连接 在application.properties添加以下配置: ```properties # Redis连接配置 spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= # 开启缓存 spring.cache.type=redis ``` 3. 编写Redis配置类 ```java import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.lang.reflect.Method; import java.util.Arrays; @Configuration @EnableCaching public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); // key序列化方式 RedisSerializer<String> stringRedisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); // key redisTemplate.setHashKeySerializer(stringRedisSerializer); // hash key // value序列化方式 RedisSerializer<Object> valueRedisSerializer = new GenericJackson2JsonRedisSerializer(); redisTemplate.setValueSerializer(valueRedisSerializer); // value redisTemplate.setHashValueSerializer(valueRedisSerializer); // hash value redisTemplate.afterPropertiesSet(); return redisTemplate; } @Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory); return builder.build(); } @Bean public KeyGenerator wiselyKeyGenerator() { return (Object target, Method method, Object... params) -> { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); Arrays.stream(params).forEach(param -> sb.append(param.toString())); return sb.toString(); }; } } ``` 4. 编写实体类 ```java import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = 1L; private Integer id; private String name; private Integer age; public User(Integer id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } ``` 5. 编写Service ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserDao userDao; @Cacheable(value = "user", keyGenerator = "wiselyKeyGenerator") public User getUserById(Integer id) { return userDao.getUserById(id); } @CachePut(value = "user", keyGenerator = "wiselyKeyGenerator") public User updateUser(User user) { userDao.updateUser(user); return user; } @CacheEvict(value = "user", keyGenerator = "wiselyKeyGenerator") public void deleteUserById(Integer id) { userDao.deleteUserById(id); } } ``` 6. 编写Controller ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public User getUserById(@PathVariable Integer id) { return userService.getUserById(id); } @PutMapping("") public User updateUser(@RequestBody User user) { return userService.updateUser(user); } @DeleteMapping("/{id}") public void deleteUserById(@PathVariable Integer id) { userService.deleteUserById(id); } } ``` 7. 测试 启动应用后,可以通过以下方式测试: - 获取用户:GET http://localhost:8080/user/1 - 更新用户:PUT http://localhost:8080/user 请求体: ```json { "id": 1, "name": "Tom", "age": 20 } ``` - 删除用户:DELETE http://localhost:8080/user/1 以上就是一个使用Spring Boot整合Redis的`@Cacheable`、`@CachePut`、`@CacheEvict`注解实现增删改查的示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值