diff --git a/src/main/java/com/imyeyu/api/modules/common/mapper/AttachmentVariantMapper.java b/src/main/java/com/imyeyu/api/modules/common/mapper/AttachmentVariantMapper.java index a4f2ab5..1e84ba3 100644 --- a/src/main/java/com/imyeyu/api/modules/common/mapper/AttachmentVariantMapper.java +++ b/src/main/java/com/imyeyu/api/modules/common/mapper/AttachmentVariantMapper.java @@ -71,6 +71,14 @@ public interface AttachmentVariantMapper { /// @param variant 变体 void insert(AttachmentVariant variant); + /// 延长缩略图变体的过期时间 + /// + /// @param id 变体 ID + /// @param now 当前时间 + /// @param expireAt 新的过期时间 + /// @return 更新记录数 + int updateExpireAt(@Param("id") String id, @Param("now") long now, @Param("expireAt") long expireAt); + /// 删除变体 /// /// @param id 变体 ID diff --git a/src/main/java/com/imyeyu/api/modules/common/service/implement/AttachmentVariantServiceImplement.java b/src/main/java/com/imyeyu/api/modules/common/service/implement/AttachmentVariantServiceImplement.java index a6520df..fe0bb3e 100644 --- a/src/main/java/com/imyeyu/api/modules/common/service/implement/AttachmentVariantServiceImplement.java +++ b/src/main/java/com/imyeyu/api/modules/common/service/implement/AttachmentVariantServiceImplement.java @@ -112,7 +112,10 @@ public class AttachmentVariantServiceImplement implements AttachmentVariantServi now ); if (cached != null) { - return cached; + Attachment refreshed = refreshCachedThumb(cached); + if (refreshed != null) { + return refreshed; + } } String lockKey = buildThumbLockKey(source, width, height, fitMode); @@ -131,7 +134,10 @@ public class AttachmentVariantServiceImplement implements AttachmentVariantServi Time.now() ); if (cached != null) { - return cached; + Attachment refreshed = refreshCachedThumb(cached); + if (refreshed != null) { + return refreshed; + } } AttachmentVariant oldVariant = variantMapper.selectByKey( source.getId(), @@ -197,7 +203,10 @@ public class AttachmentVariantServiceImplement implements AttachmentVariantServi Time.now() ); if (concurrent != null) { - return concurrent; + Attachment refreshed = refreshCachedThumb(concurrent); + if (refreshed != null) { + return refreshed; + } } throw e; } @@ -223,6 +232,20 @@ public class AttachmentVariantServiceImplement implements AttachmentVariantServi } } + /// 延长已命中缩略图缓存的有效期 + /// + /// @param cached 已命中的缩略图 + /// @return 更新成功时返回刷新后的缩略图,记录已不存在或已过期时返回 `null` + private Attachment refreshCachedThumb(Attachment cached) { + long now = Time.now(); + long expireAt = now + THUMB_CACHE_TTL; + if (!(0 < variantMapper.updateExpireAt(cached.getId(), now, expireAt))) { + return null; + } + cached.setDestroyAt(expireAt); + return cached; + } + private String buildThumbLockKey(Attachment source, int width, int height, ThumbnailFitMode fitMode) { return "%s%s:%s:%s:%s:%s".formatted( THUMB_LOCK_KEY_PREFIX, diff --git a/src/main/resources/mapper/timi-server/common/AttachmentVariantMapper.xml b/src/main/resources/mapper/timi-server/common/AttachmentVariantMapper.xml index 625fd59..9c5a4ee 100644 --- a/src/main/resources/mapper/timi-server/common/AttachmentVariantMapper.xml +++ b/src/main/resources/mapper/timi-server/common/AttachmentVariantMapper.xml @@ -98,6 +98,13 @@ ) + + UPDATE `attachment_variant` + SET `expire_at` = #{expireAt} + WHERE `id` = #{id} + AND `expire_at` > #{now} + + DELETE FROM `attachment_variant` WHERE `id` = #{id}