SpringBoot来玩缓存(一)——看效果

前言

​Spring框架支持透明地向应用程序添加缓存对缓存进行管理,其管理缓存的核心是将缓存应用于操作数据的方法,从而减少操作数据的执行次数,同时不会对程序本身造成任何干扰。

Spring Boot继承了 Spring框架的缓存管理功能,通过使用@EnableCaching注解开启基于注解的缓存支持, SpringBoot就可以启动缓存管理的自动化配置。

项目链接:https://github.com/LambertCOL/my-springboot-cache-redis-demo

1. 不使用缓存

1. 环境搭建

1. 数据库

创建名为springbootdata的数据库,运行提供的sql脚本即可生成数据表comment和一些测试数据。
测试数据表

2. 创建项目及编写配置信息

使用Spring Initializr创建一个项目,需要勾选的依赖有JPA、Mybatis和Web,而后在application.properties中配置数据库连接信息并开启sql打印到控制台,以便我们观察:
创建项目1
创建项目2

# MySQL数据库连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456

#显示使用JPA进行数据库查询的SQL语句
spring.jpa.show-sql=true
3. 编写实体

针对comment表编写Comment类与其互为映射关系

@Entity	//@Entity标注这个类是个实体类
@Table(name = "comment")	//@Table(name="comment")标注将该实体类与数据库中名为comment的表进行映射
public class Comment {
    @Id	//@Id标注id属性映射数据表comment的主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)	//因为comment表主键设置了自增,在映射的实体类中标注为主键的属性还需要指定生成策略strategy为自增GenerationType.IDENTITY
    private Integer id;
    
    //@Column(name="context")	//如果数据表字段与实体属性名不一致,可以通过@Column对其进行映射
    private String content;
    
    private String author;
    
    //省略toString和get set方法
}
4. 编写功能代码

我比较习惯先从持久层开始写起,先写如何与数据库进行交互,慢慢往调用层写,于是先写个CommentRepository类继承JpaRepository就完事儿了:

/**
 *继承 JpaRepository 接口可以无需编写sql来实现简单的数据库操作
 */
public interface CommentRepository extends JpaRepository<Comment, Integer> {}

Service层创建AnnoCommentService类来个findCommentById方法,见名思义通过id查询comment:

@Service
public class AnnoCommentService {
    @Autowired
    private CommentRepository commentRepository;

    public Comment findCommentById(Integer id) {
        Optional<Comment> optional = commentRepository.findById(id);
        if (optional.isPresent()) {
            Comment comment = optional.get();
            return comment;
        }
        return null;
    }
}

Controller层创建个CommentController类来个同名方法,拦截/anno/findCommentById请求,获取一个Integer参数,调用CommentService对象的findCommentById方法来获得相应的comment显示到浏览器上:

@RestController
public class AnnoCommentController {

    @Autowired
    private AnnoCommentService annoCommentService;

    @RequestMapping("/findCommentById")
    public Comment findCommentById(Integer id) {
        Comment comment = annoCommentService.findCommentById(id);
        return comment;

    }
}
5. 运行系统分析问题

运行项目,首次发出请求http://localhost:8080/anno/findCommentById?id=1可以看到控制台输出查询SQL
不开启缓存的第一次查询

接着发几次相同的请求,控制台就输出几条执行的SQL
不开启缓存的多次相同查询

这说明了每次我们发出请求,后台都要和数据库进行交互获取数据,量变会引起质变,大量的请求会让我们的系统变得很“慢”,原因就在于与数据库的频繁IO。
表情包1

2. 使用Spring默认缓存

Spring框架为我们提供了缓存支持,在项目启动类标注@EnableCaching表示开启缓存支持

@EnableCaching	//开启缓存注解
@SpringBootApplication
public class MySpringbootCacheRedisDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MySpringbootCacheRedisDemoApplication.class, args);
    }

}

然后在需要做缓存的方法上添加@Cacheable注解

@Cacheable(cacheNames = "comment")
public Comment findCommentById(Integer id) {
    Optional<Comment> optional = commentRepository.findById(id);
    if (optional.isPresent()) {
        Comment comment = optional.get();
        return comment;
    }
    return null;
}

cacheNames = "comment"表示会将要缓存的数据存到名为comment的命名空间中,这个后续详述。

验证一下加了缓存后效果O不OK。发出多次相同的请求,控制台输出:

开启缓存多次查询

可以发现无论发出几次相同的请求,都只会向数据库请求一次数据,这就是缓存的作用。

后续

效果实现了,那么下一篇该来扒一扒底层原理了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 添加Redis依赖 在`pom.xml`中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 配置Redis 在`application.properties`中添加Redis配置: ```properties # Redis配置 spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= # Redis密码(如果需要) ``` 3. 编写缓存操作类 创建一个类`RedisCacheService`,用于实现缓存的操作: ```java @Service public class RedisCacheService { @Autowired private RedisTemplate<String, Object> redisTemplate; /** * 获取缓存数据 * * @param key 缓存的key * @return 缓存的value */ public Object get(String key) { return redisTemplate.opsForValue().get(key); } /** * 设置缓存数据 * * @param key 缓存的key * @param value 缓存的value * @param time 过期时间(单位:秒) */ public void set(String key, Object value, long time) { redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); } /** * 删除缓存数据 * * @param key 缓存的key */ public void delete(String key) { redisTemplate.delete(key); } } ``` 4. 编写控制器 创建一个控制器`RedisCacheController`,用于测试缓存的操作: ```java @RestController public class RedisCacheController { @Autowired private RedisCacheService redisCacheService; @GetMapping("/set") public String set() { redisCacheService.set("name", "test", 60); return "OK"; } @GetMapping("/get") public String get() { Object value = redisCacheService.get("name"); return value != null ? value.toString() : "NULL"; } @GetMapping("/delete") public String delete() { redisCacheService.delete("name"); return "OK"; } } ``` 5. 启动应用程序 启动应用程序,访问`http://localhost:8080/set`设置缓存数据,访问`http://localhost:8080/get`获取缓存数据,访问`http://localhost:8080/delete`删除缓存数据。可以通过Redis客户端查看缓存数据是否被正确设置、获取、删除。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值