JetCacheまとめ

27358 ワード

とくせい
すべてのプロパティ:
  • 統一APIを介してCacheシステム
  • にアクセスする
  • 注釈によって宣言式の方法キャッシュを実現し、TTLと2段キャッシュ
  • をサポートする.
  • 注釈によるCacheインスタンス
  • の作成および構成
  • すべてのCacheインスタンスおよびメソッドキャッシュに対する自動統計
  • .
  • Keyの生成ポリシーとValueのシーケンス化ポリシーは、構成可能な
  • である.
  • 分散キャッシュ自動リフレッシュ、分散ロック(2.2+)
  • 非同期Cache API(2.2+,Redisのlettuceクライアントを使用する場合)
  • Spring Bootは
  • をサポート
    JetCache統合srpingboot構成
    maven構成
       
       
            org.springframework.boot
            spring-boot-starter-parent
            2.2.5.RELEASE
             
        
          
          
                com.alicp.jetcache
                jetcache-starter-redis
                2.6.0
            
            
            
         
           org.apache.maven.plugins
           maven-compiler-plugin
           3.8.0
           
           1.8
           1.8
           -parameters
           
          
    

    application.yml構成
    jetcache:
      statIntervalMinutes: 1
      areaInCacheName: false
      local:
        default:
          type: caffeine
          limit: 100
          keyConvertor: fastjson
      remote:
        default:
          type: redis
          keyConvertor: fastjson
          valueEncoder: java
          valueDecoder: java
          poolConfig:
            minIdle: 5
            maxIdle: 20
            maxTotal: 50
          host: 47.98.129.125
          port: 6379
          #password:***
          #sentinels: 127.0.0.1:26379 , 127.0.0.1:26380, 127.0.0.1:26381
          #masterName: mymaster
    

    JavaConfig構成の使用(アプリケーション.yml構成と2つ選択)
    @Configuration
    @EnableMethodCache(basePackages = "com.example.demo.cache")
    @EnableCreateCacheAnnotation
    public class JetCacheConfig {
    
        @Bean
        public Pool<Jedis> pool() {
            GenericObjectPoolConfig pc = new GenericObjectPoolConfig();
            pc.setMinIdle(2);
            pc.setMaxIdle(10);
            pc.setMaxTotal(10);
            return new JedisPool(pc, "47.98.129.125", 6379);
        }
    
        @Bean
        public ConfigProvider configProvider() {
            return new ConfigProvider();
        }
    
        @Bean
        public GlobalCacheConfig config( Pool<Jedis> pool) {
            Map localBuilders = new HashMap();
            EmbeddedCacheBuilder localBuilder = CaffeineCacheBuilder
                    .createCaffeineCacheBuilder()
                    .limit(100)
                    .keyConvertor(FastjsonKeyConvertor.INSTANCE);
    
            localBuilders.put(CacheConsts.DEFAULT_AREA, localBuilder);
    
            Map remoteBuilders = new HashMap();
            RedisCacheBuilder remoteCacheBuilder = RedisCacheBuilder.createRedisCacheBuilder()
                    .keyConvertor(FastjsonKeyConvertor.INSTANCE)
                    .valueEncoder(JavaValueEncoder.INSTANCE)
                    .valueDecoder(JavaValueDecoder.INSTANCE)
                    .jedisPool(pool);
            remoteBuilders.put(CacheConsts.DEFAULT_AREA, remoteCacheBuilder);
    
            GlobalCacheConfig globalCacheConfig = new GlobalCacheConfig();
            globalCacheConfig.setLocalCacheBuilders(localBuilders);
            globalCacheConfig.setRemoteCacheBuilders(remoteBuilders);
            globalCacheConfig.setStatIntervalMinutes(15);
            globalCacheConfig.setAreaInCacheName(false);
            return globalCacheConfig;
        }
    }
    

    よく使う注記
    起動クラスに注釈を付け、キャッシュをオンにします.
    @EnableMethodCache(proxyTargetClass = true,basePackages = "com.shinemo.migu.activity.thirdapi.core")
    @EnableCreateCacheAnnotation
    

    メソッド上の注記
    取得時:
    @Cached(name = "award.getById", key = "#id", cacheType = CacheType.LOCAL, expire = 300)
    

    変更時:
     @CacheUpdate(name="userCache-", key="#user.userId", value="#user")
     void updateUser(UserDO user);
    

    削除時:
    @CacheInvalidate(name = "userService2.getUserById", key = "#id")
    

    コードの例:
    @Service
    public class UserService2 {
    
        @Autowired
        private UserDao userDao;
    
        @Cached(name = "userService2.getUserById", key = "#id", cacheType = CacheType.BOTH, expire = 60*5)
        @CacheRefresh(refresh = 10, stopRefreshAfterLastAccess = 60)
        public UserDO getUserById(Integer id) {
            UserDO userDO = userDao.selectById(id);
            return userDO;
        }
    
        public void addUser(UserDO user) {
            userDao.insert(user);
        }
    
        @CacheUpdate(name = "userService2.getUserById", key = "#user.id",value = "#user" )
        public void updateUser(UserDO user) {
            userDao.updateById(user);
        }
    
        @CacheInvalidate(name = "userService2.getUserById", key = "#id")
        public void deleteUser(Integer id) {
            //userDao.deleteById(id);
        }
    }
    

    インスタンス変数の注記
    キャッシュインスタンスを作成するには
    @CreateCache(cacheType = CacheType.LOCAL, name = "jobActivityCache", timeUnit = TimeUnit.MINUTES, expire = 5)
    private Cache userCache;
    
    @CreateCache(name = "UserService.userCache", expire = 100, cacheType = CacheType.BOTH, localLimit = 50)
    private Cache userCache;
    

    コードの例:
    @Service
    public class UserService {
    
        @CreateCache(name = "UserService.userCache", cacheType = CacheType.REMOTE, localLimit = 50,expire = 60*5)
        private Cache<Integer, UserDO> userCache;
    
        @Autowired
        private UserDao userDao;
    
        public UserDO getUserById(Integer id) {
            UserDO userDO = userCache.get(id);
            if (userDO == null) {
                UserDO userDB = userDao.selectById(id);
                if (userDB == null) {
                    throw new RuntimeException("     ");
                }
                userCache.put(id, userDB);
                return userDB;
            }
            return userDO;
        }
    
        public void addUser(UserDO user) {
            userDao.insert(user);
        }
    
        public void updateUser(UserDO user) {
            userDao.updateById(user);
            userCache.put(user.getId(), user);
        }
    
        public void deleteUser(Integer id) {
            //userDao.deleteById(id);
            userCache.remove(id);
        }
    }
    

    キャッシュのリフレッシュ
    @CacheRefresh
    キャッシュをリフレッシュするには、メソッドに追加するか、インスタンスに追加します.
    @CacheRefresh(refresh = 60, stopRefreshAfterLastAccess = 300) //60     ,  300      ,     
    

    CacheTypeがREMOTEまたはBOTHの場合、リフレッシュ動作はグローバル一意であり、つまりアプリケーションサーバが1つのクラスタであっても、複数のサーバが同時に1つのkeyをリフレッシュすることはない.キーのリフレッシュタスクは、キーが初めてアクセスされてから初期化され、キーが長時間アクセスされない場合、stopRefreshAfterLastAccessで指定された時間後、関連するリフレッシュタスクが自動的に削除され、リソースの無駄なリフレッシュが回避されます.
    @CachePenetrationProtect
    @CachePenetrationProtectは、マルチスレッド環境でのデータの同期ロードを表します.
    高度なAPI
    非同期API
    CacheGetResult r = cache.GET(userId);
    CompletionStage<ResultData> future = r.future();
    future.thenRun(() -> {
        if(r.isSuccess()){
            System.out.println(r.getValue());
        }
    });
    

    ぶんさんロック
    cache.tryLockAndRun("key", 60, TimeUnit.SECONDS, () -> heavyDatabaseOperation());
    

    リーダの設定と自動リフレッシュ
        @CreateCache(name = "UserService3.userCache",timeUnit = TimeUnit.SECONDS,expire = 1000,cacheType = CacheType.BOTH)
        @CacheRefresh(timeUnit = TimeUnit.SECONDS, refresh = 30, stopRefreshAfterLastAccess = 600)
        @CachePenetrationProtect
        private Cache> userCache;
    
        @PostConstruct
        public void init(){
            userCache.config().setLoader(this::loadUser);
        }
        public List loadUser(String key) {
            List userDOS = userDao.selectList(null);
            return userDOS;
        }