Springboot注釈によるreidsキャッシュの使用


Springbootはキャッシュのサポートに非常に柔軟で、デフォルトで使用されているEhCacheは、redisなどの第三者のフレームワークを統合して構成するだけでよい.ehcacheはjvm仮想マシンに直接キャッシュされ、速度が速く、効率が高い.しかし,キャッシュ共有が面倒でクラスタ分散アプリケーションが不便である.redisはsocketを通じてキャッシュサービスにアクセスし、ecacheよりも効率が低く、データベースよりもずっと速く、クラスタの処理と分散キャッシュの処理が便利で、成熟した方案がある.単一のアプリケーションまたはキャッシュへのアクセスが要求されるアプリケーションの場合はehcacheを使用します.大規模なシステムの場合、キャッシュ共有、分散配置、キャッシュコンテンツが大きい場合はredisを推奨します.
基本構成
propertiesファイルは注釈タイプを構成すればよい.
spring.cache.type=redis  

redis構成の追加
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=

pom導入依存

    org.springframework.boot
    spring-boot-starter-data-redis


Application.javaクラス追加@EnableCaching注記オープンキャッシュサポート
よく使う注記
@Cacheable
  • はクラスにマークされます.クラスのすべてのメソッドがキャッシュをサポートしていることを示します.
  • メソッドにタグ付け:1つのメソッドに@Cacheableタグが追加されている場合、Springは実行するたびにCacheに同じkeyのキャッシュ要素が存在するかどうかをチェックし、存在する場合はそのメソッドを実行せず、直接キャッシュから結果を取得して戻ります.No実行して指定したキャッシュに戻ります.
  • @Cacheableでは、value、key、conditionの3つのプロパティを指定できます.

  • valueは、現在のメソッドの戻り値がどのCacheにキャッシュされるかを示すCacheの名前を指定する必要があります.1つのCacheであってもよいし、複数のCacheを指定する必要がある場合に配列であってもよい.
  • unlessパラメータの役割は、関数の戻り値が式の条件に合致し、veto(拒否)、キャッシュしないことです.すなわち、関数は、値が条件に合致する除外を返し、残りの条件に合致しない
  • のみをキャッシュする.
  • conditionパラメータは、条件を満たす場合にのみキャッシュされることを示す.
  • 適用シーン:クエリーインタフェース
      //cache   user     
      @Cacheable(value ="user", unless = "#result eq null")
      public List findUser() {
          return userRepository.findAll(userId);
      }
      // key     
      @Cacheable(value ="user" key="#root.methodName" )
       public List findUser() {
          return userRepository.findAll(userId);
      }
      //key    
      @Cacheable(value ="user", key="#userId",unless = "#result eq null")  
      public User findUser(String userId) {
          return userRepository.findById(userId).orElse(null);
      }
      //key     p0       p0
      @Cacheable(value ="user", key="#p0",unless = "#result eq null")  
      public User findUser(String userId) {
          return userRepository.findById(userId).orElse(null);
      }
      //key     +  
      @Cacheable(value ="user", key="#root.methodName+'['+#userId+']'",unless = "#result eq null")  
      public User findUser(String userId) {
          return userRepository.findById(userId).orElse(null);
      }
      //key     +    
      @Cacheable(value ="user", key="#root.methodName+'['+#userId+','+#name+']'",unless = "#result eq null")  
      public User findUser(String userId) {
          return userRepository.findById(userId).orElse(null);
      }
      //key         
      @Cacheable(value ="user", key="#user.id",unless = "#result eq null")  
      public User findUser(User user) {
          return userRepository.findById(userId).orElse(null);
      }
    
  • @CachePut
  • @CachePutは、キャッシュ機能をサポートするメソッドを宣言することもできます.違いは、@CachePutマークアップを使用する方法では、実行前にキャッシュに以前に実行された結果があるかどうかをチェックするのではなく、その都度実行され、指定したキャッシュに実行結果をキー値ペアとして格納します.
  • 適用シーン:更新操作、挿入操作、一般的にこの注釈を更新方法に置くことで、キャッシュデータをリアルタイムで更新することができます.keyとvalueの値に注意して、この2つのパラメータによってキャッシュ更新を決定します.
      @CachePut(value="user", key="#user.id")
      public User update(User user) {
          user = userRepository.save(user);
          //              ,         redis 
          return user;
      }
    

  • @CacheEvict
  • @CacheEveictはキャッシュをクリアする注記です.ここで、注釈パラメータはvalueのみであってもよく、keyはvalue値空間内のkey値データを消去することを意味し、現在の注釈メソッドが正常に実行された後にデフォルトで消去されます.
  • redisキャッシュのすべてのユーザデータを削除するには、注記を@CacheEveict(cacheName="user",allEntries=true)
      //    key
      @CacheEvict(value="user", key="#id")
      public boolean delete(String id) {
          //                      
          return true;
      }
    
      //        
      @CacheEvict(value="user",allEntries=true)
      public boolean deleteAll() {
          //                      
          return true;
      }
    
  • に変更します.
  • 注意:beforeInvocation:メソッドの実行前にクリアするかどうか、デフォルトはfalse、trueと指定すると、メソッドがまだ実行されていないときにキャッシュがクリアされます.デフォルトでは、メソッドが例外を放出すると、キャッシュ
  • はクリアされません.