SpringCacheの@CachePut

1812 ワード

CachePut注記を使用すると、このメソッドは毎回実行され、対応するkeyがキャッシュに値する(または更新される)ことは、次の2つに分けられます.
  • 値nullを返すと、次回キー値クエリーを行うと、データベースも1回調べられます.この場合@CacheEveict注釈に相当します.
  • 戻り値がnullでない場合、そのkey値キャッシュの更新が行われ、キャッシュ値が戻りデータであることが更新される.

  • 分析:状況の戻り値はnull:
        //  Redis  
        @Cacheable(value="Manager",key="#id")
        public User findById(Integer id) {
            System.out.println("---    DB-----");
            return userMapper.selectByPrimaryKey(id);
        }
    
        @CachePut(value="Manager",key="#manager.getId()")
        //@CacheEvict(value="Manager",key="#manager.getId()")//    
        public User update(User manager) {
            userMapper.updateByPrimaryKeySelective(manager);
            //return userMapper.selectByPrimaryKey(manager.getId());
            return null;
        }

    ケース2の戻り値がnullでない場合:
  • まずデータidが1のクエリーを行い、次のクエリーidが1のデータがDBにクエリーされず、直接キャッシュされないことを発見した.
  • は、idが1のデータ更新操作を行い、戻り値がnullである.
  • idが1のデータクエリーを行い、このときidが1キャッシュで存在しないことを発見し、DBクエリーを行う.
  •     //  Redis  
        @Cacheable(value="Manager",key="#id")
        public User findById(Integer id) {
            System.out.println("---    DB-----");
            return userMapper.selectByPrimaryKey(id);
        }
    
        @CachePut(value="Manager",key="#manager.getId()")
        //@CacheEvict(value="Manager",key="#manager.getId()")//    
        public User update(User manager) {
            userMapper.updateByPrimaryKeySelective(manager);
            return userMapper.selectByPrimaryKey(manager.getId());
            //return null;
        }
  • まずデータidが1のクエリーを行い、次のクエリーidが1のデータがDBにクエリーされず、直接キャッシュされないことを発見した.
  • このときidが1のデータ更新操作を行い、戻り値はnullではない.
  • はidが1のデータ照会を行い、このときidが1で更新されたデータがキャッシュされ、DB照会操作が行われていないことを発見した.