给 shop 项目瘦身,减少打包大小

This commit is contained in:
Jack 2025-09-12 10:56:57 +08:00
parent 90b9f793a4
commit 52e5f24913
3 changed files with 160 additions and 48 deletions

View File

@ -131,25 +131,25 @@
<artifactId>restful-sdk</artifactId> <artifactId>restful-sdk</artifactId>
<version>1.0.0.6</version> <version>1.0.0.6</version>
</dependency> </dependency>
<!-- JavaCV库 --> <!-- &lt;!&ndash; JavaCV库 &ndash;&gt;-->
<dependency> <!-- <dependency>-->
<groupId>org.bytedeco</groupId> <!-- <groupId>org.bytedeco</groupId>-->
<artifactId>javacv</artifactId> <!-- <artifactId>javacv</artifactId>-->
<version>1.5.6</version> <!-- <version>1.5.6</version>-->
</dependency> <!-- </dependency>-->
<!-- JavaCV库 --> <!-- &lt;!&ndash; JavaCV库 &ndash;&gt;-->
<dependency> <!-- <dependency>-->
<groupId>org.bytedeco</groupId> <!-- <groupId>org.bytedeco</groupId>-->
<artifactId>javacv-platform</artifactId> <!-- <artifactId>javacv-platform</artifactId>-->
<version>1.5.6</version> <!-- <version>1.5.6</version>-->
</dependency> <!-- </dependency>-->
<!-- FFmpeg平台依赖 --> <!-- &lt;!&ndash; FFmpeg平台依赖 &ndash;&gt;-->
<dependency> <!-- <dependency>-->
<groupId>org.bytedeco</groupId> <!-- <groupId>org.bytedeco</groupId>-->
<artifactId>ffmpeg-platform</artifactId> <!-- <artifactId>ffmpeg-platform</artifactId>-->
<version>4.4-1.5.6</version> <!-- <version>4.4-1.5.6</version>-->
</dependency> <!-- </dependency>-->
<!-- rabbitMQ消息队列 --> <!-- rabbitMQ消息队列 -->
<dependency> <dependency>
@ -325,6 +325,21 @@
<activation> <activation>
<activeByDefault>true</activeByDefault> <activeByDefault>true</activeByDefault>
</activation> </activation>
<dependencies>
<!-- 开发环境使用多平台依赖 -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.4-1.5.6</version>
</dependency>
</dependencies>
</profile> </profile>
<!--开发环境 --> <!--开发环境 -->
<profile> <profile>
@ -335,6 +350,22 @@
<activation> <activation>
<activeByDefault>false</activeByDefault> <activeByDefault>false</activeByDefault>
</activation> </activation>
<dependencies>
<!-- 开发环境使用多平台依赖 -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.4-1.5.6</version>
</dependency>
</dependencies>
</profile> </profile>
<!--测试环境 --> <!--测试环境 -->
<profile> <profile>
@ -342,6 +373,22 @@
<properties> <properties>
<profiles.active>test</profiles.active> <profiles.active>test</profiles.active>
</properties> </properties>
<dependencies>
<!-- 开发环境使用多平台依赖 -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.4-1.5.6</version>
</dependency>
</dependencies>
</profile> </profile>
<!--uat环境 --> <!--uat环境 -->
<profile> <profile>
@ -349,6 +396,22 @@
<properties> <properties>
<profiles.active>uat</profiles.active> <profiles.active>uat</profiles.active>
</properties> </properties>
<dependencies>
<!-- 开发环境使用多平台依赖 -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.4-1.5.6</version>
</dependency>
</dependencies>
</profile> </profile>
<!--生产环境 --> <!--生产环境 -->
<profile> <profile>
@ -356,6 +419,24 @@
<properties> <properties>
<profiles.active>prod</profiles.active> <profiles.active>prod</profiles.active>
</properties> </properties>
<dependencies>
<!-- 生产环境仅包含Linux平台依赖 -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.5.6</version>
</dependency>
<!-- Linux平台的FFmpeg -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<version>4.4-1.5.6</version>
<classifier>linux-x86_64</classifier>
</dependency>
</dependencies>
</profile> </profile>
</profiles> </profiles>

View File

@ -45,6 +45,7 @@ import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.*; import java.util.*;
//import java.util.concurrent.TimeUnit; //import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -74,8 +75,8 @@ public class SnsUserMessageServiceImpl extends BaseServiceImpl<SnsUserMessageMap
private SnsUserFriendService snsUserFriendService; private SnsUserFriendService snsUserFriendService;
@Autowired @Autowired
private ImService imService; private ImService imService;
// @Autowired @Autowired
// private RedisTemplate<String, Object> redisTemplate; private RedisTemplate<String, Object> redisTemplate;
@Override @Override
public Map getMsgCount() { public Map getMsgCount() {
@ -87,22 +88,30 @@ public class SnsUserMessageServiceImpl extends BaseServiceImpl<SnsUserMessageMap
} }
Integer userId = user.getId(); Integer userId = user.getId();
// String cacheKey = "sns:user:message:unread:" + userId; String cacheKey = "sns:user:message:unread:" + userId;
String counterKey = "sns:user:message:unread:counter:" + userId;
// // 尝试从Redis缓存中获取数据 // 尝试从Redis缓存中获取数据
// Map cachedResult = (Map) redisTemplate.opsForValue().get(cacheKey); Map cachedResult = (Map) redisTemplate.opsForValue().get(cacheKey);
// if (cachedResult != null) { if (cachedResult != null) {
// return cachedResult; return cachedResult;
// } }
QueryWrapper<SnsUserMessage> queryWrapper = new QueryWrapper<>(); // 使用计数器方式提高性能避免每次都count数据库
queryWrapper.eq("user_id", userId).eq("message_kind", 2).eq("message_is_read", 0); Long unreadCount = redisTemplate.opsForValue().increment(counterKey, 0);
long num = count(queryWrapper); if (unreadCount == null) {
// 如果计数器不存在则从数据库查询并初始化计数器
QueryWrapper<SnsUserMessage> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", userId).eq("message_kind", 2).eq("message_is_read", 0);
unreadCount = count(queryWrapper);
// 设置计数器过期时间1小时
redisTemplate.opsForValue().set(counterKey, unreadCount, 3600, TimeUnit.SECONDS);
}
rs.put("num", num); rs.put("num", unreadCount);
// 构造最后一个用户聊天网址 // 构造最后一个用户聊天网址
if (num > 0) { if (unreadCount > 0) {
QueryWrapper<SnsUserMessage> messageQuery = new QueryWrapper<>(); QueryWrapper<SnsUserMessage> messageQuery = new QueryWrapper<>();
messageQuery.orderByAsc("message_is_read").orderByDesc("message_time") messageQuery.orderByAsc("message_is_read").orderByDesc("message_time")
.eq("user_id", userId).eq("message_is_read", 0).eq("message_kind", 2); .eq("user_id", userId).eq("message_is_read", 0).eq("message_kind", 2);
@ -123,8 +132,8 @@ public class SnsUserMessageServiceImpl extends BaseServiceImpl<SnsUserMessageMap
} }
} }
// // 将结果缓存到Redis缓存10秒 // 将结果缓存到Redis缓存5秒以提高高并发下的性能
// redisTemplate.opsForValue().set(cacheKey, rs, 45, TimeUnit.SECONDS); redisTemplate.opsForValue().set(cacheKey, rs, 5, TimeUnit.SECONDS);
return rs; return rs;
} }
@ -320,13 +329,10 @@ public class SnsUserMessageServiceImpl extends BaseServiceImpl<SnsUserMessageMap
} }
/** /**
* 设置为已读 * 重写setRead方法在设置消息为已读时更新未读计数器
*
* @return
*/ */
@Override @Override
public boolean setRead() { public boolean setRead() {
// 权限判断 // 权限判断
UserDto user = ContextUtil.getCurrentUser(); UserDto user = ContextUtil.getCurrentUser();
if (user == null) { if (user == null) {
@ -346,10 +352,29 @@ public class SnsUserMessageServiceImpl extends BaseServiceImpl<SnsUserMessageMap
if (CheckUtil.isNotEmpty(user_other_id)) { if (CheckUtil.isNotEmpty(user_other_id)) {
queryWrapper.eq("user_other_id", user_other_id); queryWrapper.eq("user_other_id", user_other_id);
} }
// 查询需要更新的消息数量
List<SnsUserMessage> messagesToUpdate = find(queryWrapper);
long unreadToUpdate = messagesToUpdate.stream()
.filter(m -> m.getMessage_is_read() == 0)
.count();
SnsUserMessage userMessage = new SnsUserMessage(); SnsUserMessage userMessage = new SnsUserMessage();
userMessage.setMessage_is_read(1); userMessage.setMessage_is_read(1);
saveOrUpdate(userMessage, queryWrapper); boolean result = saveOrUpdate(userMessage, queryWrapper);
return true;
// 更新未读计数器和缓存
if (result && unreadToUpdate > 0) {
String counterKey = "sns:user:message:unread:counter:" + user_id;
String cacheKey = "sns:user:message:unread:" + user_id;
// 减少计数器
redisTemplate.opsForValue().increment(counterKey, -unreadToUpdate);
// 删除缓存下次请求会重新生成
redisTemplate.delete(cacheKey);
}
return result;
} }
@Override @Override
@ -712,14 +737,11 @@ public class SnsUserMessageServiceImpl extends BaseServiceImpl<SnsUserMessageMap
} }
/** /**
* 添加短消息 * 重写addMessage方法在添加新消息时更新未读计数器
*
* @return
*/ */
@Override @Override
@Transactional @Transactional
public Map addMessage() { public Map addMessage() {
UserDto user = ContextUtil.getCurrentUser(); UserDto user = ContextUtil.getCurrentUser();
if (user == null) { if (user == null) {
throw new ApiException(ResultCode.NEED_LOGIN); throw new ApiException(ResultCode.NEED_LOGIN);
@ -818,8 +840,18 @@ public class SnsUserMessageServiceImpl extends BaseServiceImpl<SnsUserMessageMap
if (!saveOrUpdate(other)) { if (!saveOrUpdate(other)) {
throw new ApiException(I18nUtil._("保存收件箱失败data=") + other); throw new ApiException(I18nUtil._("保存收件箱失败data=") + other);
} }
result.put("message_id", data.getMessage_id()); result.put("message_id", data.getMessage_id());
result.put("message_other_id", other.getMessage_id()); result.put("message_other_id", other.getMessage_id());
// 新消息添加后更新接收者的未读计数器和缓存
String counterKey = "sns:user:message:unread:counter:" + user_other_row.getUser_id();
String cacheKey = "sns:user:message:unread:" + user_other_row.getUser_id();
// 增加计数器
redisTemplate.opsForValue().increment(counterKey, 1);
// 删除缓存下次请求会重新生成
redisTemplate.delete(cacheKey);
} }
return result; return result;
} }

View File

@ -569,11 +569,10 @@
<!--推送镜像仓库校验安全证书,无安全证书无法推送--> <!--推送镜像仓库校验安全证书,无安全证书无法推送-->
<dockerCertPath>${docker.ca}</dockerCertPath> <dockerCertPath>${docker.ca}</dockerCertPath>
<!-- 添加清理命令来过滤无用文件 --> <!-- 添加额外的Dockerfile指令来清理不必要的文件 -->
<!-- <runs>--> <runs>
<!-- &lt;!&ndash; 合并所有清理命令到单个RUN指令 &ndash;&gt;--> <run>rm -rf /root/.m2 &amp;&amp; rm -rf /tmp/* &amp;&amp; rm -rf /var/cache/*</run>
<!-- <run>rm -rf /var/cache/apk/* &amp;&amp; rm -rf /root/.m2 &amp;&amp; find / -name "*.log" -type f -delete 2&gt;/dev/null || true &amp;&amp; find / -name "*test*" -type f -delete 2&gt;/dev/null || true &amp;&amp; find / -name "*.md" -type f -delete 2&gt;/dev/null || true &amp;&amp; rm -rf /tmp/* /var/tmp/* &amp;&amp; rm -rf /usr/share/doc/* /usr/share/man/* /usr/share/info/* &amp;&amp; rm -rf /var/cache/yum/* /var/cache/dnf/* 2&gt;/dev/null || true &amp;&amp; rm -rf /tmp/*.tar.gz /tmp/*.zip /app/*.tar.gz 2&gt;/dev/null || true &amp;&amp; apk del &#45;&#45;purge vim curl wget tar gzip 2&gt;/dev/null || true &amp;&amp; rm -rf /root/.java /tmp/hsperfdata_* 2&gt;/dev/null || true &amp;&amp; find / -type d -empty -delete 2&gt;/dev/null || true</run>--> </runs>
<!-- </runs>-->
<resources> <resources>
<resource> <resource>