SpringBootプロジェクトにおけるRedis。包括的なアプリケーション
事業内容
ブログのデータベースからすべての投稿タグを照会し、キャッシュ(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の包括的な適用については、スクリプトハウスの過去記事を検索するか、以下の記事を引き続き閲覧してください。
関連
-
Redisクラスタのマスターノードとスレーブノードを縮小する詳細チュートリアル
-
redisキャッシュストレージのセッション原理機構
-
redis の RedissonLock が待ちロックを実装する方法
-
Redisによる分散シングルナンバーと分散ID(カスタムルール生成)
-
Redisデータ永続化技術解説
-
Redisトランザクション処理の使用方法
-
Redisシングルスレッディングの正しい理解
-
Redisの分散ロックについて簡単に説明します
-
インストール後、Redis-cliが動作しない(redis-cli: コマンドが見つからない)。
-
redis アプリケーション編 ---- スパイク、サインイン、セッション共有
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JAVAでRedisの5つのデータ構造を利用する方法
-
CentOS 8.4へのRedis 6.2.6の詳細なインストール方法
-
Redisのインクリメント呼び出しが失敗する理由と推奨される使い方を大きな白い嘘で解説
-
redisプラグインbloom-filterをcentosにインストールする方法
-
Redisにおけるビットマップの説明
-
インタビューFAQです。Redisキャッシュとデータベース間のデータ整合性を確保する方法
-
Redisによる携帯電話認証コード配信の模倣例
-
Redisの高同期スパイクを防ぐために、ソースコードソリューションを売られすぎ
-
SpringBootがRedisの分散ロックを利用して並行処理の問題を解決することについて
-
Redisの文字列はどのように実装されているか