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」であることに注意してください。
キャッシュタイムアウト期間に関しては、指定する場所が複数あります。明確にしてください。
- putおよびその他の方法でタイムアウト時間が指定されている場合は、この時間が優先されます。
- putおよびその他のメソッドではタイムアウトが指定されておらず、Cacheインスタンスのデフォルトのタイムアウトが使用されます
- 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 + "】");
}
}
....
....
}