多数のユーザーと大量のシステムアクセス
データベースへの頻繁なアクセス、システムパフォーマンスの低下、ユーザーエクスペリエンスの低下
環境構築
メイブン座標
Spring Data Redis の Maven 座標をプロジェクトの pom.xml ファイルにインポートします。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Spring Data Redis の Maven 座標をプロジェクトの pom.xml ファイルにインポートします。
設定ファイル
Redis 関連の設定をプロジェクトの application.yml に追加します。
spring:
redis:
host: 172.17.2.94
port: 6379
password: root@123456
database: 0
構成クラス
構成クラス RedisConfig をプロジェクトに追加します。
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
//默认的Key序列化器为:JdkSerializationRedisSerializer
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
SMS認証コードをキャッシュする
以前にモバイル端末に認証コードログインを実装し、ランダムに生成された認証コードを HttpSession に保存しました。次に、検証コードを Redis にキャッシュするように変更する必要があります。具体的な実装アイデアは次のとおりです。
-
Redisを操作するサーバー側のUserControllerにRedisTemplateオブジェクトを注入する
@Autowired private RedisTemplate redisTemplate;
-
サーバー側のUserControllerのsendMsgメソッドで、ランダムに生成された検証コードをRedisにキャッシュし、有効期間を5分に設定します
//将生成的验证码缓存到Redis中,并且设置有效期为5分钟 redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);
-
サーバー側のUserControllerのログインメソッドで、キャッシュされた検証コードをRedisから取得し、ログインに成功したらRedis内の検証コードを削除する
//从Redis中获取缓存的验证码 String codeInRedis = (String) redisTemplate.opsForValue().get(phone);
ディッシュデータをキャッシュする
以前、モバイル端末上で料理を閲覧する機能を実装しましたが、対応するサーバーメソッドはDishControllerのlistメソッドで、このメソッドはフロントエンドから送信されたクエリ条件に従ってデータベースのクエリ操作を実行します。同時実行性が高い場合、データベース クエリが頻繁に行われると、システムのパフォーマンスが低下し、サーバーの応答時間が増加します。ここで、システムのパフォーマンスを向上させるために、このメソッドのキャッシュを最適化する必要があります。
具体的な実装アイデアは次のとおりです。
-
DishControllerのlistメソッドを変更し、まずRedisから料理データを取得し、存在する場合はデータベースにクエリせずに直接返し、ない場合はデータベースにクエリを実行し、クエリした料理データをRedisに入れます。
List<DishDto> listDto = null; //先从redis中获取缓存数据 String key = "dish_" + dish.getCategoryId() + "_" + dish.getStatus();//dish_1397844263642378242_1 listDto = (List<DishDto>) redisTemplate.opsForValue().get(key); if (listDto != null) { //如果存在,直接返回,无需查询数据库 return R.success(listDto); } //如果不存在,需要查询数据库,将查询到的菜品数据缓存到Redis //...查数据库 redisTemplate.opsForValue().set(key, listDto, 60, TimeUnit.MINUTES);
-
DishControllerのsaveメソッドとupdateメソッドを変更し、キャッシュをクリアするロジックを追加
- 方法 1
//清理所有菜品的缓存数据 Set keys = redisTemplate.keys("dish_*"); redisTemplate.delete(keys) ;
- 方法2
//清理某个分类下面的菜品缓存数据 String key = "dish_" + dishDto.getCategoryId() + "_1"; redisTemplate.delete(key);
キャッシュを使用するプロセスでは、データベース内のデータがキャッシュ内のデータと一致していることを確認するように注意してください。データベース内のデータが変更された場合は、キャッシュされたデータを適時にクリアする必要があります。
スプリングキャッシュ
Spring キャッシュの概要
Spring Cacheはアノテーションベースのキャッシュ機能を実現するフレームワークであり、アノテーションを追加するだけでキャッシュ機能を実現できます。
Spring Cache は抽象化の層を提供し、基礎となる層は異なるキャッシュ実装を切り替えることができます。具体的には、さまざまなキャッシュ テクノロジが CacheManager インターフェイスを通じて統合されます。
CacheManager は、Spring が提供するさまざまなキャッシュ テクノロジの抽象インターフェイスです。
キャッシュ テクノロジごとに異なる CacheManager を実装する必要があります。
キャッシュマネージャー | 説明 |
---|---|
EhCacheキャッシュマネージャー | キャッシュテクノロジーとしてEhCacheを使用する |
Guavaキャッシュマネージャー | Google の Guavacache をキャッシュ技術として使用 |
Redisキャッシュマネージャー | Redis をキャッシュ テクノロジとして使用する |
Spring Cache の共通アノテーション
注釈 | 説明する |
---|---|
@EnableCaching | 注釈のキャッシュを有効にする |
@キャッシュ可能 | Spring はメソッドを実行する前に、まずキャッシュにデータがあるかどうかを確認し、データがある場合はキャッシュされたデータを直接返し、 データがない場合はメソッドを呼び出してメソッドの戻り値をキャッシュに置きます。 |
@CachePut | メソッドの戻り値をキャッシュに入れる |
@CacheEvict | キャッシュから 1 つ以上のデータを削除します |
- Spring Boot プロジェクトでキャッシュ テクノロジを使用するには、関連するキャッシュ テクノロジの依存関係パッケージをプロジェクトにインポートし、@EnableCaching を使用してスタートアップ クラスでのキャッシュ サポートを有効にするだけです。
- たとえば、Redis をキャッシュ テクノロジとして使用するには、Spring データ Redis の Maven 座標をインポートするだけで済みます。
CacheEvict (キャッシュのクリア) アノテーションは SpEL (Spring Expression Language、Spring Expression Language) をサポートしており、値を書き込む方法は数多くあります。
@CacheEvict(value = "userCache", key = "#pO")//获取方法的第一个参数
//@CacheEvict(value = "userCache ", key = "#root.args[0]")//获取方法的第一个参数
//@CacheEvict(value = "userCache", key = "#id")//获取方法指定名称的参数
//@CacheEvict(value = "userCache", key = "#result")//获取方法的返回值
@DeleteMapping("/{id}")
public void delete (@PathVariable Long id){
userService.removeById(id) ;
}
Springキャッシュの使い方
Spring Boot プロジェクトで Spring Cache を使用する操作手順 (Redis キャッシュ テクノロジを使用):
-
Maven 座標をインポートする
spring-boot-starter-data-redis、spring-boot-starter-cache -
application.ymlを設定する
spring: cache: redis: time-to-live: 1800000 #设置缓存有效期(ms)
-
スタートアップクラスに@EnableCachingアノテーションを追加して、キャッシュアノテーション機能を有効にします。
-
@Cacheable、@cacheEvict、およびその他のアノテーションをコントローラー メソッドに追加して、キャッシュ操作を実行します
パッケージデータをキャッシュする
以前にモバイルパッケージ閲覧機能を実装しましたが、対応するサーバーメソッドはSetmealControllerのlistメソッドで、このメソッドはフロントエンドから送信されたクエリ条件に従ってデータベースクエリ操作を実行します。
同時実行性が高い場合、データベース クエリが頻繁に行われると、システムのパフォーマンスが低下し、サーバーの応答時間が増加します。
ここで、システムのパフォーマンスを向上させるために、このメソッドのキャッシュを最適化する必要があります。
具体的な実装アイデアは次のとおりです。
-
Spring Cache と Redis 関連の Maven 座標をインポートする
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
application.yml でキャッシュされたデータの有効期限を構成する
spring: cache: redis: time-to-live: 1800000 #设置缓存数据的过期时间(ms)
-
スタートアップクラスに@EnableCachingアノテーションを追加して、キャッシュアノテーション機能を有効にします。
@Slf4j//配置log @SpringBootApplication @ServletComponentScan//开启filter注解扫描 @EnableTransactionManagement//开启事务注解支持 @EnableCaching//开启Spring Cache注解方式的缓存功能 public class ReggieApplication { public static void main(String[] args) { SpringApplication.run(ReggieApplication.class, args); log.info("项目启动成功..."); } }
-
@Cacheable アノテーションを SetmealController の list メソッドに追加します
@GetMapping("/list") @Cacheable(value = "setmealCache", key = "#setmeal.categoryId + '_' + #setmeal.status") public R<List<Setmeal>> list(Setmeal setmeal)
-
CacheEvict アノテーションを SetmealController の保存メソッドと削除メソッドに追加します。
@PostMapping @CacheEvict(value = "setmealCache" , allEntries = true) public R<String> save(@RequestBody SetmealDto setmealDto)
@DeleteMapping @CacheEvict(value = "setmealCache" , allEntries = true) public R<String> delete(@RequestParam List<Long> ids)
注: 返された R オブジェクトに対してシリアライザーを設定する必要があります。
public class R<T> implements Serializable