1. ホーム
  2. データベース
  3. レディス

SpringBootプロジェクトにおけるRedis。包括的なアプリケーション

2022-01-15 15:10:02

事業内容

ブログのデータベースからすべての投稿タグを照会し、キャッシュ(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


ビジネスロジックのコード設計と実装

ドメイン・オブジェクトの設計

このタイプのオブジェクトを元に、Tag(タグ情報)を格納するTagクラスを以下のコードで作成します。

package com.jt.blog.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
TableName; import com.baomidou.mybatisplus.annotation;

import java.io;

/**
 * Design of the tag class
 */
@TableName("tb_tag")
public class Tag implements Serializable {
    private static final long serialVersionUID = 4504013456197711455L;
    /**Table id*/
    @TableId(type = IdType.AUTO)
    private Long id;
    /** tag name**/
    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 + '\'' +
                '}';
    }
}

ダオロジックのオブジェクト設計

タグ情報のデータアクセスインターフェースを以下のコードで作成します。

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;

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());
        }
    }
}


サービスロジカルオブジェクト設計

TagServiceインターフェイスと実装クラスを設計し、Tagビジネスロジックを定義します。
ステップ1:以下のコードで、TagServiceインターフェースを定義します。

package com.jt.blog.service;
import com.jt.blog.domain.Tag;
import java.util.List;
public interface TagService {
    /**
     * Query all tags
     * @return
     */
    List<Tag> selectTags();
}


Step 2: 次のコードで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;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TagServiceImpl implements TagService {
    //Configuration of the RedisTemplate in the RedisAutoConfiguration class
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private TagMapper tagMapper;
    @Override
    public List<Tag> selectTags() {
        //1. query Tag information from redis, redis has then directly returned
        ValueOperations<String,List<Tag>> valueOperations =
        redisTemplate.opsForValue();
        List<Tag> tags=valueOperations.get("tags");
        if(tags!=null&&!tags.isEmpty())return tags;
        //2. no tag information from redis, query mysql
        tags = tagMapper.selectList(null);
        //3. store tag information from mysql query to redis
        valueOperations.set("tags", tags);
        //4. return the query result
        return tags;
    }
}


Listをredisに保存する場合、TagはSerializableインターフェイスを実装する必要があることを説明します。

ステップ3: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;

import java.util.List;

@SpringBootTest
public class TagServiceTests {
    @Autowired
    private TagService tagService;
    
    @Test
    void testSelectTags(){
        List<Tag> tags=
        tagService.selectTags();
        System.out.println(tags);
    }
}


コントローラロジックオブジェクト設計

リクエストとレスポンスのロジックを処理するためのタグコントロールロジックオブジェクトを、以下のコードで作成します。

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;
import org.springframework.web.bind.annotation;

import java.util.ArrayList;
import java.util;

@RestController
@RequestMapping("/tag")
public class TagController {
    @Autowired
    private TagService tagService;
    
    @GetMapping
    public List<Tag> doSelectTags(){
      return tagService.selectTags());//1.redis,2.
    }
}


サービスを起動し、ブラウザを開いてアクセステストを行います。また、このレイヤーにローカルキャッシュを追加できないか考えています。

まとめ(Summary)

このセクションの焦点は、プロジェクトにおけるキャッシュの適用に関する1つの考え方を学ぶことです。

SpringBootプロジェクトにおけるRedisの包括的な適用に関するこの記事は以上です。SpringBootにおけるRedisの包括的な適用については、スクリプトハウスの過去記事を検索するか、以下の記事を引き続き閲覧してください。