当前位置:   article > 正文

Spring Boot 2.x 集成 Redis 缓存_springboot2 redis声明式缓存

springboot2 redis声明式缓存

在此章,我们将 SpringBoot 集成 Redis 缓存,Redis是一个开源的,基于内存的数据结构存储,可以用作数据库、缓存和消息代理,在本章仅讲解缓存集成。

准备工作

当前项目工具及环境

  • 开发工具 IDEA 2022
  • 依赖管理 Maven
  • Spring Boot
  • JDK 1.8
  • Redis

现在去初始化一个Spring网站初始生成一个SpringBoot项目

新建项目

点击 Next 后设置项目名称后,点击 Finish 完成创建项目

新建实体对象

要将数据存到redis,我们需要定义一个实体来进行交互,并需要序列化实体对象

User.java

  1. package com.github.gleans.model;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import lombok.ToString;
  6. import javax.persistence.*;
  7. import java.io.Serializable;
  8. @Data
  9. @Entity
  10. @ToString
  11. @NoArgsConstructor
  12. @AllArgsConstructor
  13. public class User implements Serializable {
  14. private static final long serialVersionUID = 1L;
  15. @Id
  16. @SequenceGenerator(name = "SEQ_GEN", sequenceName = "SEQ_USER", allocationSize = 1)
  17. @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
  18. private Long id;
  19. private String name;
  20. private long money;
  21. }
  22. 复制代码

使用JPA的简洁数据操作

UserRepository.java

  1. package com.github.gleans.dao;
  2. import com.github.gleans.model.User;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.stereotype.Repository;
  5. /**
  6. * 操作数据库
  7. */
  8. @Repository
  9. public interface UserRepository extends JpaRepository<User, Long> {
  10. }
  11. 复制代码

接口api代码

UserController.java

  1. import com.github.gleans.dao.UserRepository;
  2. import com.github.gleans.model.User;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.cache.annotation.CacheEvict;
  6. import org.springframework.cache.annotation.CachePut;
  7. import org.springframework.cache.annotation.Cacheable;
  8. import org.springframework.web.bind.annotation.*;
  9. import java.util.List;
  10. @Slf4j
  11. @RestController
  12. public class UserController {
  13. private UserRepository userRepository;
  14. @Autowired
  15. public void setUserRepository(UserRepository userRepository) {
  16. this.userRepository = userRepository;
  17. }
  18. @Cacheable(cacheNames = "userAll")
  19. @GetMapping("user/all")
  20. public Object getUserAll() {
  21. return userRepository.findAll();
  22. }
  23. @Cacheable(value = "users", key = "#userId", unless = "#result.money < 10000")
  24. @GetMapping("user/con/{userId}")
  25. public Object getUserByCondition(@PathVariable Long userId) {
  26. return userRepository.findById(userId);
  27. }
  28. @CachePut(value = "users", key = "#user.id")
  29. @PutMapping("/update")
  30. public User updatePersonByID(@RequestBody User user) {
  31. userRepository.save(user);
  32. return user;
  33. }
  34. @CacheEvict(value = "users", allEntries=true)
  35. @DeleteMapping("/{id}")
  36. public void deleteUserByID(@PathVariable Long id) {
  37. List<User> userListOld = userRepository.findAll();
  38. log.info("删除前:{}", userListOld.toString());
  39. userRepository.deleteById(id);
  40. List<User> userList = userRepository.findAll();
  41. log.info("删除后:{}", userList.toString());
  42. }
  43. }
  44. 复制代码

配置 application.yml

  1. # Redis Config
  2. spring:
  3. datasource:
  4. url: jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000
  5. driverClassName: org.h2.Driver
  6. username: root
  7. password: root
  8. cache:
  9. type: redis
  10. redis:
  11. host: localhost
  12. port: 6379
  13. password: ekko1234
  14. jpa:
  15. show-sql: true
  16. 复制代码

启动 Redis

项目根目录, 使用docker-compose up -d 启动 redis

  1. Microsoft Windows [版本 10.0.17763.1339]
  2. (c) 2018 Microsoft Corporation。保留所有权利。
  3. C:\Users\ekko\Documents\SpringBootLearn>cd springboot-redis
  4. C:\Users\ekko\Documents\SpringBootLearn\springboot-redis>docker-compose up -d
  5. Creating network "springboot-redis_default" with the default driver
  6. Creating my_redis ... done
  7. C:\Users\ekko\Documents\SpringBootLearn\springboot-redis>
  8. 复制代码

开启缓存并初始化数据

在启动类增加注解@EnableCaching开启缓存
并实现CommandLineRunner接口来执行启动完成之后的任务
SpringBootRedisApplication.java

  1. import com.github.gleans.dao.UserRepository;
  2. import com.github.gleans.model.User;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.CommandLineRunner;
  6. import org.springframework.boot.SpringApplication;
  7. import org.springframework.boot.autoconfigure.SpringBootApplication;
  8. import org.springframework.cache.annotation.EnableCaching;
  9. @Slf4j
  10. //springboot启动时执行任务CommandLineRunner
  11. @SpringBootApplication
  12. //开启缓存
  13. @EnableCaching
  14. public class SpringBootRedisApplication implements CommandLineRunner {
  15. private UserRepository userRepository;
  16. public static void main(String[] args) {
  17. SpringApplication.run(SpringBootRedisApplication.class, args);
  18. }
  19. @Autowired
  20. public void setUserRepository(UserRepository userRepository) {
  21. this.userRepository = userRepository;
  22. }
  23. @Override
  24. public void run(String... args) throws Exception {
  25. log.info("开始初始化user ->user count ->{}", userRepository.count());
  26. User james = new User(1L, "James", 2000);
  27. User potter = new User(2L, "Potter", 4000);
  28. User dumbledore = new User(3L, "Dumbledore", 999999);
  29. userRepository.save(james);
  30. userRepository.save(potter);
  31. userRepository.save(dumbledore);
  32. log.info("初始化完成 数据-> {}.", userRepository.findAll());
  33. }
  34. }
  35. 复制代码

新增缓存

当我们数据库查询出来的值要放到缓存里,用@Cacheable注解

  1. @Cacheable(value = "users", key = "#userId", unless = "#result.money < 10000")
  2. @RequestMapping(value = "/{userId}", method = RequestMethod.GET)
  3. public Object getUser(@PathVariable Long userId) {
  4. logger.info("获取user信息根据ID-> {}.", userId);
  5. return userRepository.findById(userId);
  6. }
  7. 复制代码

我们访问 localhost:8080/1 和 localhost:8080/3 分别两次

发现id为3的就走了一次方法 说明缓存成功
id为1的走了两次是因为 unless里条件成立就不会缓存到redis

更新缓存

每次当我们的数据库的值要更改,我们缓存的也要更改 ,我们可以使用 @CachePut 注解

  1. @CachePut(value = "users", key = "#user.id")
  2. @PutMapping("/update")
  3. public User updatePersonByID(@RequestBody User user) {
  4. userRepository.save(user);
  5. return user;
  6. }
  7. 复制代码

删除缓存

当我们的数据从数据库删除,我们也要从缓存进行删除,我们可以使用 @CacheEvict 注解
allEntries 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存

  1. @CacheEvict(value = "users", allEntries=true)
  2. @DeleteMapping("/{id}")
  3. public void deleteUserByID(@PathVariable Long id) {
  4. logger.info("删除用户根据ID-> {}", id);
  5. userRepository.deleteById(id);
  6. }
  7. 复制代码

在redis中查看已经没有了缓存 redis可视化工具下载地址在github

源码地址

github.com/Gleans/Spri…

逻辑脑图


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/838836
推荐阅读
相关标签
  

闽ICP备14008679号