详解Redis在SpringBoot工程中的综合应用

目录
  • 业务描述
  • 准备工作
    • 初始化数据
    • 添加项目依赖
    • 添加数据库访问配置
  • 业务逻辑代码设计及实现
    • domain对象设计
    • dao 逻辑对象设计
    • service 逻辑对象设计
    • controller逻辑对象设计
  • 总结(summary)

    业务描述

    从一个博客数据库中查询所有的文章标签,然后存储到缓存(cache),后续查询时可从缓存获取。提高其查询性能。

    准备工作

    初始化数据

    初始化数据库中数据,sql脚本如下:

    drop database if exists `blog`;
    create database `blog` default character set utf8mb4;
    set names utf8mb4;
    set foreign_key_checks = 0;
    use `blog`;
    
    create table `tb_tag` (
      `id` bigint(20) not null auto_increment comment 'id',
      `name` varchar(255) not null comment 'data_id',
      primary key (`id`)
    ) engine=innodb default charset=utf8 collate=utf8_bin comment='tb_tag';
    
    insert into `tb_tag` values (null,"mysql"),(null,"redis");

    添加项目依赖

    在jt-template工程的原有依赖基础上添加mysql数据库访问依赖,例如:

    <!--mysql-->
    <dependency>
        <groupid>mysql</groupid>
        <artifactid>mysql-connector-java</artifactid>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupid>com.baomidou</groupid>
        <artifactid>mybatis-plus-boot-starter</artifactid>
        <version>3.4.2</version>
    </dependency>

    添加数据库访问配置

    在项目的配置文件(例如application.yml)中添加数据库访问配置,例如:

    spring:
      datasource:
        url: jdbc:mysql:///blog?servertimezone=asia/shanghai&characterencoding=utf8
        username: root
        password: root
    

    业务逻辑代码设计及实现

    domain对象设计

    创建一个tag类,基于此类型的对象存储tag(标签信息),代码如下:

    package com.jt.blog.domain;
    
    import com.baomidou.mybatisplus.annotation.idtype;
    import com.baomidou.mybatisplus.annotation.tableid;
    import com.baomidou.mybatisplus.annotation.tablename;
    
    import java.io.serializable;
    
    /**
     * 标签类的设计
     */
    @tablename("tb_tag")
    public class tag implements serializable {
        private static final long serialversionuid = 4504013456197711455l;
        /**标签id*/
        @tableid(type = idtype.auto)
        private long id;
        /**标签名*/
        private string name;
    
        public long getid() {
            return id;
        }
    
        public void setid(long id) {
            this.id = id;
        }
        public string getname() {
            return name;
        }
        public void setname(string name) {
            this.name = name;
        }
        @override
        public string tostring() {
            return "tag{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

    dao 逻辑对象设计

    创建tag信息的数据访问接口,代码如下:

    package com.jt.blog.dao;
    
    import com.baomidou.mybatisplus.core.mapper.basemapper;
    import com.jt.blog.domain.tag;
    import org.apache.ibatis.annotations.mapper;
    
    @mapper
    public interface tagmapper
            extends basemapper<tag> {
    }
    

    创建单元测试类,tagmapper中的相关方法进行单元测试,例如:

    package com.jt.blog.dao;
    
    import com.jt.blog.domain.tag;
    import org.junit.jupiter.api.test;
    import org.springframework.beans.factory.annotation.autowired;
    import org.springframework.boot.test.context.springboottest;
    
    import java.util.list;
    
    @springboottest
    public class tagmappertests {
        @autowired
        private tagmapper tagmapper;
        @test
        void testselectlist(){
            list<tag> tags =
            tagmapper.selectlist(null);
            for(tag t:tags){
                system.out.println(t);
                //system.out.println(t.getid()+"/"+t.getname());
            }
        }
    }
    

    service 逻辑对象设计

    设计tagservice接口及实现类,定义tag(标签)业务逻辑。
    第一步:定义tagservice接口,代码如下:

    package com.jt.blog.service;
    import com.jt.blog.domain.tag;
    import java.util.list;
    public interface tagservice {
        /**
         * 查询所有的标签
         * @return
         */
        list<tag> selecttags();
    }
    

    第二步:定义tagserviceimpl类,代码如下:

    package com.jt.blog.service.impl;
    
    import com.jt.blog.dao.tagmapper;
    import com.jt.blog.domain.tag;
    import com.jt.blog.service.tagservice;
    import org.springframework.beans.factory.annotation.autowired;
    import org.springframework.data.redis.core.redistemplate;
    import org.springframework.data.redis.core.valueoperations;
    import org.springframework.stereotype.service;
    
    import java.util.list;
    
    @service
    public class tagserviceimpl implements tagservice {
        //redisautoconfiguration 类中做的redistemplate的配置
        @autowired
        private redistemplate redistemplate;
        @autowired
        private tagmapper tagmapper;
        @override
        public list<tag> selecttags() {
            //1.从redis查询tag信息,redis有则直接返回
            valueoperations<string,list<tag>> valueoperations =
            redistemplate.opsforvalue();
            list<tag> tags=valueoperations.get("tags");
            if(tags!=null&&!tags.isempty())return tags;
            //2.从redis没有获取tag信息,查询mysql
            tags = tagmapper.selectlist(null);
            //3.将从mysql查询到tag信息存储到redis
            valueoperations.set("tags", tags);
            //4.返回查询结果
            return tags;
        }
    }
    

    说明,假如将list存储到redis,此时tag必须实现serializable接口。

    第三步:定义tagservicetests单元测试类并进行单元测试,代码如下:

    package com.jt.blog.service;
    
    import com.jt.blog.domain.tag;
    import org.junit.jupiter.api.test;
    import org.springframework.beans.factory.annotation.autowired;
    import org.springframework.boot.test.context.springboottest;
    
    import java.util.list;
    
    @springboottest
    public class tagservicetests {
        @autowired
        private tagservice tagservice;
        
        @test
        void testselecttags(){
            list<tag> tags=
            tagservice.selecttags();
            system.out.println(tags);
        }
    }
    

    controller逻辑对象设计

    创建tag控制逻辑对象,用于处理请求和响应逻辑,代码如下:

    package com.jt.blog.controller;
    
    import com.jt.blog.domain.tag;
    import com.jt.blog.service.tagservice;
    import org.springframework.beans.factory.annotation.autowired;
    import org.springframework.web.bind.annotation.getmapping;
    import org.springframework.web.bind.annotation.requestmapping;
    import org.springframework.web.bind.annotation.restcontroller;
    
    import java.util.arraylist;
    import java.util.list;
    
    @restcontroller
    @requestmapping("/tag")
    public class tagcontroller {
        @autowired
        private tagservice tagservice;
        
        @getmapping
        public  list<tag> doselecttags(){
          return  tagservice.selecttags());//1.redis,2.mysql
        }
    }
    

    启动服务,打开浏览器进行访问测试。同时思考,我们是否可以在这个层加一个本地cache。

    总结(summary)

    本章节重点是学习项目中缓存(cache)的一种应用思想。

    到此这篇关于redis在springboot工程中的综合应用的文章就介绍到这了,更多相关redis在springboot综合应用内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

    (0)
    上一篇 2022年3月21日
    下一篇 2022年3月21日

    相关推荐