目次
SpringBoot でサポートされるキャッシュ コンポーネント
基于API的Redis缓存实现
ホームページ データベース Redis SpringBoot が Redis キャッシュ実装を統合する方法

SpringBoot が Redis キャッシュ実装を統合する方法

May 28, 2023 am 10:58 AM
redis springboot

SpringBoot でサポートされるキャッシュ コンポーネント

SpringBoot では、データのキャッシュ管理とストレージは、スプリングフレームワーク。

プログラム内に CacheManager タイプの Bean コンポーネントまたは cacheResolver という名前の CacheResolver キャッシュ リゾルバーが定義されていない場合、SpringBoot は次のキャッシュ コンポーネントを (指定された順序で) 有効にしようとします。 1) 汎用

(2) JCache (JSR-107) (EhCache 3、Hazelcast、Infinispanなど)

(3) EhCache 2.x

(4) Hazelcast

(5)Infinispan

(6)Couchbase

(7)Redis

(8)カフェイン

(9) Simple

上記は、SpringBoot キャッシュ コンポーネントの読み込み順序に従って SpringBoot でサポートされる 9 つのキャッシュ コンポーネントをリストしています。キャッシュ管理コンポーネント (Redis など) をプロジェクトに追加した後、SpringBoot プロジェクトは対応するコンポーネントを選択して有効にします。キャッシュマネージャーです。プロジェクトに複数のキャッシュコンポーネントが同時に追加され、キャッシュマネージャーまたはキャッシュリゾルバー(CacheManagerまたはcacheResolver)が指定されていない場合、SpringBootは上記の順序で追加された複数のキャッシュコンポーネントのうち最初のものを優先的に有効にします。キャッシュ管理を実行します (たとえば、2 つのキャッシュ コンポーネント Couchbase と Redis が同時に追加された場合、Couchbase コンポーネントが最初に有効になります)。

前回の記事「SpringBoot のキャッシュ管理 (1) デフォルトのキャッシュ管理」で紹介したデフォルトのキャッシュ管理では、構築したプロジェクトにはキャッシュ管理コンポーネントが追加されていませんでしたが、キャッシュ管理は引き続き実装されました。これは、

キャッシュ管理が有効になった後、SpringBoot は上記のキャッシュ コンポーネントの順序でキャッシュ管理に有効なキャッシュ コンポーネントを検索します。キャッシュ コンポーネントがない場合は、デフォルトで最後のシンプル キャッシュ コンポーネントが管理に​​使用されます。

。シンプル キャッシュ コンポーネントは、SpringBoot のデフォルトのキャッシュ管理コンポーネントです。デフォルトでキャッシュ ストレージにメモリ内の ConcurrentMap を使用するため、サードパーティのキャッシュ コンポーネントを追加しなくても、メモリ内キャッシュ管理を実現できますが、推奨されません。 . このキャッシュ管理方法アノテーションベースの Redis キャッシュ実装

SpringBoot キャッシュ管理 (1) デフォルトのキャッシュ管理で構築されたプロジェクトに基づいて Redis キャッシュ コンポーネントを紹介し、アノテーションベースのメソッドを使用して具体的な詳細を説明します。 SpringBoot の Redis キャッシュの統合が達成されました。

(1) Spring Data Redis 依存関係スターターを追加します

Spring Data Redis 依存関係スターターを pom.xml ファイルに追加します:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
ログイン後にコピー

Redis 関連の依存関係を追加するときランチャー、SpringBoot は、キャッシュ関連の自動アセンブリ クラス (以前のデフォルトの SimpleCacheConfiguration) を実行するための自動構成クラスとして RedisCacheConfigratio を使用します。コンテナーで使用されるキャッシュ マネージャーは RedisCacheManager (以前のデフォルトのキャッシュ マネージャー) になり、このキャッシュ マネージャーが作成するキャッシュはRedisCache: Redis を制御してデータをキャッシュします。

(2) Redis サーバーの接続設定

プロジェクトのグローバル設定ファイル application.properties に Redis データベースの接続設定を追加しますサンプルコードは以下のとおりです。

(3) CommentService クラスのメソッドを変更する

キャッシュ管理に @Cacheable、@CachePut、@CacheEvict の 3 つのアノテーションを使用し、キャッシュの保存、キャッシュの更新、キャッシュの削除などの操作を実行します。それぞれ:

# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
ログイン後にコピー

上記のコードでは、@Cacheable、@CachePut、および @CacheEvict アノテーションを使用して、データ クエリ、データ更新、およびデータ削除メソッドのキャッシュ管理を実行します。

このうち、クエリキャッシュの @Cacheable アノテーションにはマークキーの値が存在せず、デフォルトパラメータ値の comment_id がデータを保存するキーとして使用されます。キャッシュを更新するときも同じキーを使用する必要があります。 ; 同様に、クエリキャッシュを使用する場合 @Cacheable アノテーションでは、クエリ結果が空の場合はキャッシュされないことを示すために、unless= "#result==null" が定義されています。

(4) CommentController クラスに 2 つの新しいインターフェイスを追加します。

新しい更新インターフェイスと削除インターフェイスを追加します。

package com.hardy.springbootdatacache.service;

import com.hardy.springbootdatacache.entity.Comment;
import com.hardy.springbootdatacache.repository.CommentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.Optional;

/**
 * @Author: HardyYao
 * @Date: 2021/6/19
 */
@Service
public class CommentService {

    @Autowired
    private CommentRepository commentRepository;

    /**
     * 根据评论id查询评论
     * @Cacheable:将该方法的查询结果comment存放在SpringBoot默认缓存中
     * cacheNames:起一个缓存命名空间,对应缓存唯一标识
     * @param id
     * @return
     */
    @Cacheable(cacheNames = "comment", unless = "#result==null")
    public Comment findCommentById(Integer id){
        Optional<Comment> comment = commentRepository.findById(id);
        if(comment.isPresent()){
            Comment comment1 = comment.get();
            return comment1;
        }
        return null;
    }

    /**
     * 更新评论
     * @param comment
     * @return
     */
    @CachePut(cacheNames = "comment",key = "#result.id")
    public Comment updateComment(Comment comment) {
        commentRepository.updateComment(comment.getAuthor(), comment.getaId());
        return comment;
    }

    /**
     * 删除评论
     * @param comment_id
     */
    @CacheEvict(cacheNames = "comment")
    public void deleteComment(int comment_id) {
        commentRepository.deleteById(comment_id);
    }

}
ログイン後にコピー

(5) アノテーション ベースの Redis クエリ キャッシュ テスト

ブラウザに http://localhost:8080/findCommentById?id=1 と入力してアクセスします:

##ページでエラーが報告されました。コンソール情報を確認してください:

SpringBoot が Redis キャッシュ実装を統合する方法

#エラー メッセージによると、ユーザー コメント情報 Comment を照会するときに対応する SQL ステートメントが実行されましたが、キャッシュ保存中に IllegalArgumentException が発生し、情報要件が求められました。対応する Comment エンティティ クラスは次のとおりです。シリアル化を実装します (DefaultSerializer にはシリアル化可能なペイロードが必要ですが、タイプ [com.hardy.springbootdatacache.entity.Comment] のオブジェクトを受け取りました)。

(6) キャッシュ オブジェクトをシリアル化する

SpringBoot が Redis キャッシュ実装を統合する方法

(7) プロジェクトを再起動してクエリ キャッシュをテストします

在浏览器中输入:http://localhost:8080/findCommentById?id=1 进行访问(连续访问三次):

SpringBoot が Redis キャッシュ実装を統合する方法SpringBoot が Redis キャッシュ実装を統合する方法

打开Redis客户端可视化工具Redis Desktop Manager,连接本地启用的Redis服务,查看具体的数据缓存效果:

SpringBoot が Redis キャッシュ実装を統合する方法

执行findById()方法查询出的用户评论信息Comment正确存储到了Redis缓存库中名为comment的名称空间下。

其中缓存数据的唯一标识key值是以“名称空间comment::+参数值(comment::1)”的字符串形式体现的,而value值则是经过JDK默认序列格式化后的HEX格式存储。这种JDK默认序列格式化后的数据显然不方便缓存数据的可视化查看和管理,所以在实际开发中,通常会自定义数据的序列化格式,这方面的内容在后面会介绍。

(8)基于注解的Redis缓存更新测试

先通过浏览器访问:http://localhost:8080/updateComment?id=1&author=hardy;

接着在访问:http://localhost:8080/findCommentById?id=1,查看浏览器返回信息及控制台打印信息:

SpringBoot が Redis キャッシュ実装を統合する方法

SpringBoot が Redis キャッシュ実装を統合する方法

SpringBoot が Redis キャッシュ実装を統合する方法

可以看到,执行updateComment()更新id为1的数据时执行了一条更新的SQL语句,后续调用findById()方法查询id为1的用户评论信息时没有再次执行查询的SQL语句,且浏览器返回了更新后的正确结果,这说明@CachePut缓存更新配置成功。

(9)基于注解的Redis缓存删除测试

通过浏览器访问:http://localhost:8080/deleteComment?id=1 和 http://localhost:8080/findCommentById?id=1

SpringBoot が Redis キャッシュ実装を統合する方法

SpringBoot が Redis キャッシュ実装を統合する方法

SpringBoot が Redis キャッシュ実装を統合する方法

执行deleteComment()方法删除id为1的数据后查询结果为空,查看Redis缓存数据库:

SpringBoot が Redis キャッシュ実装を統合する方法

可以看到之前存储的comment相关数据被删除掉了,这表明@CacheEvict注解缓存删除成功实现。

通过上面的案例可以看出:使用基于注解的Redis缓存实现只需要添加Redis依赖、并使用几个注解在对应的方法上,就可以实现对数据的缓存管理。

另外,还可以在SpringBoot全局配置文件中配置Redis有效期,示例代码如下:

# 对基于注解的Redis缓存数据统一设置有效期为1分钟,单位毫秒
spring.cache.redis.time-to-live=60000
ログイン後にコピー

上述代码中,在SpringBoot全局配置文件中添加了“spring.cache.redis.time-to-live”属性统一设置Redis数据的有效期(单位为毫秒),但这种方式不够灵活,因此一般不用。

基于API的Redis缓存实现

在SpringBoot整合Redis缓存实现中,除了基于注解形式的Redis缓存形式外,还有一种开发中更常用的方式——基于API的Redis缓存实现。这种基于API的Redis缓存实现,需要在某种业务需求下通过Redis提供的API调用相关方法实现数据缓存管理。同时,这种方法还可以手动管理缓存的有效期。

下面,通过Redis API的方式讲解SpringBoot整合Redis缓存的具体实现。

(1)使用Redis API进行业务数据缓存管理

在 com.hardy.springbootdatacache.service 包下新建一个 ApiCommentService:

package com.hardy.springbootdatacache.service;

import com.hardy.springbootdatacache.entity.Comment;
import com.hardy.springbootdatacache.repository.CommentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Optional;
import java.util.concurrent.TimeUnit;

/**
 * @Author: HardyYao
 * @Date: 2021/6/19
 */
@Service
public class ApiCommentService {

    @Autowired
    private CommentRepository commentRepository;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 根据评论id查询评论
     * @param id
     * @return
     */
    public Comment findCommentById(Integer id){
        // 先查Redis缓存
        Object o = redisTemplate.opsForValue().get("comment_" + id);
        if (o != null) {
            return (Comment) o;
        } else {
            // 如果缓存中没有,则从数据库查询
            Optional<Comment> dbComment = commentRepository.findById(id);
            if (dbComment.isPresent()) {
                Comment redisComment = dbComment.get();
                // 将查询结果存储到缓存中,并设置有效期为1天
                redisTemplate.opsForValue().set("comment_"+id, redisComment,1, TimeUnit.DAYS);
                return redisComment;
            } else {
                return null;
            }
        }

    }

    /**
     * 更新评论
     * @param comment
     * @return
     */
    public Comment updateComment(Comment comment) {
        commentRepository.updateComment(comment.getAuthor(), comment.getId());
        // 更新数据库数据后进行缓存更新
        redisTemplate.opsForValue().set("comment_" + comment.getId(), comment);
        return comment;
    }

    /**
     * 删除评论
     * @param comment_id
     */
    public void deleteComment(int comment_id) {
        commentRepository.deleteById(comment_id);
        // 删除数据库数据后进行缓存删除
        redisTemplate.delete("comment_" + comment_id);
    }

}
ログイン後にコピー

(2)编写Web访问层ApiCommentController

package com.hardy.springbootdatacache.controller;

import com.hardy.springbootdatacache.entity.Comment;
import com.hardy.springbootdatacache.service.ApiCommentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: HardyYao
 * @Date: 2021/6/19
 */
@RestController
@RequestMapping("api")  // 改变请求路径
public class ApiCommentController {

    @Autowired
    private ApiCommentService apiCommentService;

    @RequestMapping(value = "/findCommentById")
    public Comment findCommentById(Integer id){
        Comment comment = apiCommentService.findCommentById(id);
        return comment;
    }

    @RequestMapping(value = "/updateComment")
    public Comment updateComment(Comment comment){
        Comment oldComment = apiCommentService.findCommentById(comment.getId());
        oldComment.setAuthor(comment.getAuthor());
        Comment comment1 = apiCommentService.updateComment(oldComment);
        return comment1;
    }

    @RequestMapping(value = "/deleteComment")
    public void deleteComment(Integer id){
        apiCommentService.deleteComment(id);
    }

}
ログイン後にコピー

(3)测试基于API的Redis缓存实现

输入:http://localhost:8080/api/findCommentById?id=2(连续输入三次)、http://localhost:8080/api/updateComment?id=2&author=hardy、http://localhost:8080/deleteComment?id=2进行访问:

SpringBoot が Redis キャッシュ実装を統合する方法

SpringBoot が Redis キャッシュ実装を統合する方法

SpringBoot が Redis キャッシュ実装を統合する方法

コンソール メッセージと Redis データベースの表示:

SpringBoot が Redis キャッシュ実装を統合する方法

SpringBoot が Redis キャッシュ実装を統合する方法

API ベースの関連事項Redis キャッシュ実装の構成: API ベースの Redis キャッシュ実装では、アノテーションベースのキャッシュのサポートを有効にするために @EnableCaching アノテーションが必要ないため、ここでプロジェクトの起動クラスに追加された @EnableCaching アノテーションを削除するか、アノテーションを付けるかを選択できます。いいえ プロジェクトの機能実装に影響します。

以上がSpringBoot が Redis キャッシュ実装を統合する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Windows 11 10.0.22000.100 のインストール時の 0x80242008 エラーの解決策 Windows 11 10.0.22000.100 のインストール時の 0x80242008 エラーの解決策 May 08, 2024 pm 03:50 PM

1. [スタート]メニューを起動し、[cmd]と入力し、[コマンドプロンプト]を右クリックし、[管理者として実行]を選択します。 2. 次のコマンドを順番に入力します (注意してコピーして貼り付けてください): SCconfigwuauservstart=auto、Enter キーを押す SCconfigbitsstart=auto、Enter キーを押す SCconfigcryptsvcstart=auto、Enter キーを押す SCconfigtrustedinstallerstart=auto、Enter キーを押す SCconfigwuauservtype=share、Enter キーを押す netstopwuauserv 、enter netstopcryptS を押す

Golang API のキャッシュ戦略と最適化 Golang API のキャッシュ戦略と最適化 May 07, 2024 pm 02:12 PM

GolangAPI のキャッシュ戦略により、パフォーマンスが向上し、サーバーの負荷が軽減されます。一般的に使用される戦略は、LRU、LFU、FIFO、TTL です。最適化手法には、適切なキャッシュ ストレージの選択、階層型キャッシュ、無効化管理、監視とチューニングが含まれます。実際には、データベースからユーザー情報を取得する API を最適化するために LRU キャッシュが使用されます。それ以外の場合は、データベースからデータを取得した後にキャッシュを更新できます。

PHP 開発におけるキャッシュ メカニズムとアプリケーションの実践 PHP 開発におけるキャッシュ メカニズムとアプリケーションの実践 May 09, 2024 pm 01:30 PM

PHP 開発では、キャッシュ メカニズムにより、頻繁にアクセスされるデータがメモリまたはディスクに一時的に保存され、データベース アクセスの数が削減され、パフォーマンスが向上します。キャッシュの種類には主にメモリ、ファイル、データベース キャッシュが含まれます。キャッシュは、組み込み関数またはサードパーティのライブラリ (cache_get() や Memcache など) を使用して PHP に実装できます。一般的な実用的なアプリケーションには、データベース クエリ結果をキャッシュしてクエリ パフォーマンスを最適化したり、ページ出力をキャッシュしてレンダリングを高速化したりすることが含まれます。キャッシュ メカニズムにより、Web サイトの応答速度が効果的に向上し、ユーザー エクスペリエンスが向上し、サーバーの負荷が軽減されます。

Win11 英語 21996 を簡体字中国語 22000 にアップグレードする方法_Win11 英語 21996 を簡体字中国語 22000 にアップグレードする方法 Win11 英語 21996 を簡体字中国語 22000 にアップグレードする方法_Win11 英語 21996 を簡体字中国語 22000 にアップグレードする方法 May 08, 2024 pm 05:10 PM

まず、システム言語を簡体字中国語表示に設定して再起動する必要があります。もちろん、以前に表示言語を簡体字中国語に変更したことがある場合は、この手順をスキップできます。次に、レジストリ regedit.exe の操作を開始し、左側のナビゲーション バーまたは上部のアドレス バーで HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNlsLanguage に直接移動し、InstallLanguage キーの値と Default キーの値を 0804 に変更します (英語に変更する場合)。まずシステムの表示言語を en-us に設定し、システムを再起動してから、すべてを 0409 に変更します) この時点でシステムを再起動する必要があります。

PHP 配列のページネーションで Redis キャッシュを使用するにはどうすればよいですか? PHP 配列のページネーションで Redis キャッシュを使用するにはどうすればよいですか? May 01, 2024 am 10:48 AM

Redis キャッシュを使用すると、PHP 配列ページングのパフォーマンスを大幅に最適化できます。これは、次の手順で実現できます。 Redis クライアントをインストールします。 Redisサーバーに接続します。キャッシュ データを作成し、データの各ページをキー「page:{page_number}」を持つ Redis ハッシュに保存します。キャッシュからデータを取得し、大規模な配列での高コストの操作を回避します。

Win11でダウンロードしたアップデートファイルの探し方_Win11でダウンロードしたアップデートファイルの場所を共有する Win11でダウンロードしたアップデートファイルの探し方_Win11でダウンロードしたアップデートファイルの場所を共有する May 08, 2024 am 10:34 AM

1. まず、デスクトップ上の[このPC]アイコンをダブルクリックして開きます。 2. 次に、マウスの左ボタンをダブルクリックして [C ドライブ] に入ります。システム ファイルは通常、自動的に C ドライブに保存されます。 3. 次に、C ドライブで [windows] フォルダーを見つけ、ダブルクリックしてに入ります。 4. [windows]フォルダーに入ったら、[SoftwareDistribution]フォルダーを見つけます。 5. 入力後、win11 のダウンロード ファイルとアップデート ファイルがすべて含まれている [ダウンロード] フォルダーを見つけます。 6. これらのファイルを削除したい場合は、このフォルダー内で直接削除してください。

PHP Redis キャッシュ アプリケーションとベスト プラクティス PHP Redis キャッシュ アプリケーションとベスト プラクティス May 04, 2024 am 08:33 AM

Redis は、高性能のキー/値キャッシュです。 PHPRedis 拡張機能は、Redis サーバーと対話するための API を提供します。 Redis に接続し、データを保存および取得するには、次の手順を使用します。 接続: Redis クラスを使用してサーバーに接続します。ストレージ: set メソッドを使用してキーと値のペアを設定します。取得: get メソッドを使用してキーの値を取得します。

Docker環境にPECLを使用して拡張機能をインストールするときにエラーが発生するのはなぜですか?それを解決する方法は? Docker環境にPECLを使用して拡張機能をインストールするときにエラーが発生するのはなぜですか?それを解決する方法は? Apr 01, 2025 pm 03:06 PM

エラーの原因とソリューションPECLを使用してDocker環境に拡張機能をインストールする場合、Docker環境を使用するときに、いくつかの頭痛に遭遇します...

See all articles