[Java] SpringBoot redis 注解缓存数据库数据

[Java] SpringBoot redis 注解缓存数据库数据

星如雨
2022-04-24 / 0 评论 / 23 阅读 / 正在检测是否收录...

在数据库中执行创建数据库

以创建一个评论表为例

创建数据库

DROP DATABASE IF EXISTS `springbootdata`;
CREATE DATABASE `springbootdata`;

创建表

CREATE TABLE `t_comment` (
  `id` int(20) NOT NULL AUTO_INCREMENT COMMENT '评论id',
  `content` longtext COMMENT '评论内容',
  `author` varchar(200) DEFAULT NULL COMMENT '评论作者',
  `a_id` int(20) DEFAULT NULL COMMENT '关联的文章id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

添加部分数据

INSERT INTO `t_comment` VALUES 
('1', '1', '1', '1'),
('2', '赞一个', 'tom', '1'),
('3', '很详细', 'kitty', '1'),
('4', '很好,非常详细', '张三', '1'),
('5', '很不错', '张杨', '2');

SpringBoot 部分

引入依赖

    <dependencies>
<!--        spring-boot-starter-web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--        核心:自动配置的支持、日志、yaml解析等-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
<!--        阿里巴巴解析json依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
<!--        httpclient请求依赖-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
<!--        爬虫+解析-->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.10.3</version>
        </dependency>
<!--        junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
<!--        SpringBoot test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!--        mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
            <scope>runtime</scope>
        </dependency>
<!--        myBatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
<!--        alibaba 数据库池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.22</version>
        </dependency>
<!--        jpa 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
<!--        热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
<!--        lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
<!--        可视化接口API-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.4.0</version>
        </dependency>
<!--        thymeleaf 模板-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
<!--        文件下载依赖-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
<!--        Tomcat依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
<!--        Redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>

配置redis

# 配置MySQL数据库 数据库地址 用户名 密码
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
# 显示 jpa sql 语句 执行jpa 的时候会在控制台打印jpa 语句
spring.jpa.show-sql=true
# 配置第三方数据库源 druid
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initial-size=20
spring.datasource.druid.min-idle=10
spring.datasource.druid.max-active=100
# 配置 Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=

创建 Discuss 实例

Discuss
// 使数据库数据映射到 对象
@Entity(name = "t_comment")
// 序列化,作用使数据不会出现乱码情况
public class Discuss implements Serializable {
    /**
     * @Id 表示 某属性 在数据表中是 主键
     * @GeneratedValue : 与 @Id 标注在同一个位置用于表示属性对应主键生成策略
     *          生成策略 :
     *              TABLE       (使用一个特定的数据库表来保存主键)
     *              SEQUENCE    (不支持主键自增的数据库主键生成策略)
     *              INDETITY    (主键自增)
     *              AUTO        (JPA 自动选择前面三个合适的策略,[默认选项])
     * */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String content;
    private String author;
    /**
     * @Column : 对于属性和表字段不同时,使用 name 属性 将类属性 与 表字段属性对应
     * */
    @Column(name = "a_id")
    private Integer aId;
    // 省略 getter,setter 和 toString 方法
}

创建 DiscussRepository 管理sql语句

public interface DiscussRepository extends JpaRepository<Discuss, Integer> {
    // @Transactional 声明是一个事务,执行出错会回滚,控制事务
    @Transactional
    @Modifying
    @Query(value = "update t_comment c set c.author=?1 where c.id=?2")
    public int updateDiscuss(String author,Integer id);
}

创建 DiscussService 缓存一些数据

@Service
public class DiscussService {
    // CommentRepository 继承自 JpaRepository 自带增删改查的方法
    @Autowired
    private DiscussRepository discussRepository;
    // 通过id 查找 评论
    // 缓存这个查询的结果,并以参数为缓存标识符(保证唯一)
    @Cacheable(cacheNames = "comment",unless = "#result==null")
    public Discuss findById(int id){
        Optional<Discuss> discuss = discussRepository.findById(id);
        // 判断查询的类是否存在 当类存在时 则为 true
        if (discuss.isPresent()){
            return discuss.get();
        }
        return null;
    }
    // 更新评论
//    更新缓存,标识符为 评论id, result 表示评论
    @CachePut(cacheNames = "comment",key = "#result.id")
    public Discuss updateDiscuss(Discuss discuss){
        // 根据评论的 id 修改 author
        discussRepository.updateDiscuss(discuss.getAuthor(),discuss.getaId());
        return discuss;
    }
    // 根据id 删除评论
    // 清除缓存注解
    @CacheEvict(cacheNames = "comment")
    public void deleteDiscuss(int discuss_id){
        discussRepository.deleteById(discuss_id);
    }
}

创建 DiscussController 控制页面访问

// 返回json格式字符串
@RestController
public class DiscussController {
    // 注册组件 评论服务
    @Autowired
    private DiscussService commentService;
    // 访问/get/id 可根据评论id 查找相对应的评论
    // @PathVariable 自动映射 URL 绑定的占位符 {}
    @GetMapping("/get/{id}")
    public Discuss findById(@PathVariable("id") int comment_id){
        Discuss discuss = commentService.findById(comment_id);
        return discuss;
    }
    @GetMapping("/update/{id}/{author}")
    public Discuss updateDiscuss(@PathVariable("id") int commet_id,@PathVariable("author") String author){
        Discuss discuss = commentService.findById(commet_id);
        discuss.setAuthor(author);
        Discuss discuss1 = commentService.updateDiscuss(discuss);
        return discuss1;
    }
    @GetMapping("/delete/{id}")
    public void deleteDiscuss(@PathVariable("id") int comment_id){
        commentService.deleteDiscuss(comment_id);
    }
}

运行结果

在浏览器中访问路径 http://127.0.0.1:8088/get/1

控制台会输出

redis 客户端也会进行缓存

  • 刷新浏览器,发现控制台不会再次输出sql语句
    更改访问路径信息http://127.0.0.1:8088/get/2

    redis 客户端会再次缓存数据
0

评论 (0)

取消