Spring Bootはjetcacheを統合して、注釈付きキャッシングを実装します

1つは、jetcacheの依存関係を追加する

  <dependency>
                <groupId>com.alicp.jetcache</groupId>
                <artifactId>jetcache-starter-redis-lettuce</artifactId>
                <version>${jetcache.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alicp.jetcache</groupId>
                <artifactId>jetcache-starter-redis</artifactId>
                <version>${jetcache.version}</version>
            </dependency>

2つ目は、構成アイテムを追加することです。

jetcache:
  statIntervalMinutes: 15
  areaInCacheName: false
  local:
    default:
      type: linkedhashmap
      keyConvertor: fastjson
  remote:
    default:
      keyConvertor: fastjson
      valueEncoder: kryo
      valueDecoder: kryo
# redis
#      type: redis
#      host: 10.2.140.31
#      port: 32263
#      password: 123456
#      database: 7
# lettuce
      type: redis.lettuce
      uri: redis://[email protected]:32263/7?timeout=5s
      poolConfig:
        minIdle: 5
        maxIdle: 20
        maxTotal: 50
属性 デフォルト 説明
jetcache.statIntervalMinutes 0 統計間隔、0は統計がないことを意味します
jetcache.areaInCacheName true jetcache-annoはリモートキャッシュキープレフィックスとしてcacheNameを使用します。2.4.3より前のバージョンでは常にareaNameがcacheNameに追加されるため、areaNameもキープレフィックスに表示されます。2.4.4以降で構成できます。リモートキーの互換性を維持するために、デフォルト値はtrueですが、新しいプロジェクトではfalseの方が合理的です。
jetcache.hiddenPackages 番号 @Cachedおよび@CreateCacheが名前を自動的に生成する場合、名前が長くなりすぎないようにするために、hiddenPackagesで指定されたパッケージ名プレフィックスは切り捨てられます。
jetcache。[local | remote]。$ {area} .type 番号 キャッシュタイプ。tairとredisは現在サポートされているリモートキャッシュです。linkedhashmapとcaffeineは現在サポートされているローカルキャッシュタイプです。
jetcache。[local | remote]。$ {area} .keyConvertor 番号 コンバーターのキーグローバル構成は、現在、keyConvertorを達成したのは1つだけですfastjson@CreateCacheが使用され、キャッシュタイプがLOCALの場合にのみ指定できますnone。このとき、equalsメソッドを使用してキーを識別します。メソッドキャッシュはkeyConvertorを指定する必要があります
jetcache。[local | remote]。$ {area} .valueEncoder java シリアライザーのグローバル構成。リモートタイプのキャッシュのみを指定する必要があります。javaとkryoはオプションです。
jetcache。[local | remote]。$ {area} .valueDecoder java シリアライザーのグローバル構成。リモートタイプのキャッシュのみを指定する必要があります。javaとkryoはオプションです。
jetcache。[local | remote]。$ {area} .limit 100 各キャッシュインスタンスの最大要素のグローバル構成。ローカルタイプのキャッシュのみを指定する必要があります。すべてではなく、各キャッシュインスタンスの制限は、たとえばここで100を指定し、@ CreateCacheを使用して2つのキャッシュインスタンスを作成する(そしてlocalLimit属性がアノテーションに設定されていない)場合、各キャッシュインスタンスの制限は次のようになります。 100
jetcache。[local | remote]。$ {area} .expireAfterWriteInMillis 巨大 タイムアウト期間をミリ秒単位で指定するグローバル構成(以前のdefaultExpireInMillis)
jetcache.local。$ {area} .expireAfterAccessInMillis 0 jetcache2.2以上が必要です。ミリ秒単位で、キャッシュを無効にするためのアクセスがない時間を指定します。現在、ローカルキャッシュのみがサポートしています。0は、この関数が使用されていないことを意味します。

上記の表で、$ {area}は@Cachedと@CreateCacheのエリア属性に対応しています。注釈で領域が指定されていない場合、デフォルト値は「default」であることに注意してください。

キャッシュタイムアウト期間に関しては、指定する場所が複数あります。明確にしてください。

  1. putおよびその他の方法でタイムアウト時間が指定されている場合は、この時間が優先されます。
  2. putおよびその他のメソッドではタイムアウトが指定されておらず、Cacheインスタンスのデフォルトのタイムアウトが使用されます
  3. Cacheインスタンスのデフォルトのタイムアウト時間は、@ CreateCacheと@Cachedのexpire属性で指定されます。指定されていない場合は、ymlで定義されたグローバル構成が使用されます。たとえば、@ Cached(cacheType = local)はjetcache.local.defaultを使用します。 .expireAfterWriteInMillis、それでも指定されていない場合は無限大

 3、注釈キャッシュを有効にします

@EnableMethodCache(basePackages = "com.hikvision.smbg.content")
@EnableCreateCacheAnnotation
@Configuration
public class JetCacheConfig {
}

第四に、キャッシュ定数クラス

public class CacheConst {

    public static class ContentDetail {
        public static final String redisKeyPrefix = "content:detail:";
        public static final int expire = 60 * 60 * 24;
    }

    public static class Content {
        public static final int sign = 0;
        public static final String redisKeyPrefix = "content:user:like:";
    }

    public static class Comment {
        public static final int sign = 1;
        public static final String redisKeyPrefix = "comment:user:like:";
    }

    public static class CommentReply {
        public static final int sign = 2;
        public static final String redisKeyPrefix = "commentReply:user:like:";
    }

    public static class CommentLike {
        public static final String redisKeyPrefix = "comment:like:";
        public static final int expire = 60;
    }

    public static class ContentView {
        public static final String redisKeyPrefix = "content:view:";
        public static final int expire = 60;
    }

    public static class ContentLike {
        public static final String redisKeyPrefix = "content:like:";
        public static final int expire = 60;
    }

    public static class ContentFavourite {
        public static final String redisKeyPrefix = "content:favourite:";
        public static final int expire = 60;
    }
}

5、注釈キャッシュの使用

(1)通常、@ Cachedアノテーションは、詳細リストの取得、redisでのデータのキャッシュ、キーの指定、有効期限など、頻繁に変更されない大きなデータインターフェイスにキャッシュを作成するために使用されます。

@Cached(name = CacheConst.ContentDetail.redisKeyPrefix, key = "#response.contentId",
            expire = CacheConst.ContentDetail.expire, timeUnit = TimeUnit.DAYS)
    @Override
    public ContentBaseResponse assembleDetail(ContentBaseResponse response) {
        // 获取兴趣标签
        List<Long> labelIds = this.listLabelIdsByContentId(response.getContentId());
        response.setLabelIds(labelIds);

        // 获取案例轮播图
        List<String> picUrls = this.listPicUrlsByContentIdAndPicType(response.getContentId(), PicTypeEnum.MAIN.getCode());
        response.setPicUrls(picUrls);

        // 获取产品清单
        List<GoodsResponse> goods = this.listGoodsByContentId(response.getContentId());
        response.setGoods(goods);

        // 获取附件列表
        List<AttachResponse> attachs = this.listAttachByContentId(response.getContentId());
        response.setAttachs(attachs);

        // 获取评论
//        List<CommentResponse> comments = this.listCommentByContentId(response.getContentId());
//        response.setComments(comments);

        return response;
    }

 4.クエリするビッグデータの詳細とリストを更新するときは、@ CacheInvalidateアノテーションを追加して削除(破棄)し、クエリ中に最新のデータがredisに再度キャッシュされるようにします。

このようにして、データベースの究極の一貫性が保証されます

 @CacheInvalidate(name = CacheConst.ContentDetail.redisKeyPrefix, key = "#contentId")
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void update(CaseUpdateRequest request, Long contentId) {
        // 获取客户案例
        CaseDO dataobject = getDataobjectByContentId(contentId);

        // 客户案例权限校验
        if (ContentFromEnum.MERCHANT.getCode().equals(dataobject.getCaseFrom())) {
            String creator = dataobject.getCreator();
            String modifier = request.getModifier();
            if (!StringUtils.equals(creator, modifier)) {
                throw new ContentCenterException(100002, "平台或商家【" + modifier + "】没有权限编辑客户案例【" + contentId + "】");
            }
        }
      ....
      ....
   }

 

おすすめ

転載: blog.csdn.net/qq_31905135/article/details/110390056