mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/per-boe/java-servers.git
synced 2025-12-09 19:06:49 +08:00
Merge remote-tracking branch 'yx/master-20250227-lyc' into release-20250328-master
This commit is contained in:
@@ -10,6 +10,8 @@ import org.springframework.data.redis.core.ScanOptions;
|
|||||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@@ -33,7 +35,7 @@ public class StudyCourseTask {
|
|||||||
public void saveStudyCourseItemLastTime() {
|
public void saveStudyCourseItemLastTime() {
|
||||||
// 1. 定义匹配模式(匹配所有目标key)
|
// 1. 定义匹配模式(匹配所有目标key)
|
||||||
final String KEY_PATTERN = "studyContentId:*:last_active";
|
final String KEY_PATTERN = "studyContentId:*:last_active";
|
||||||
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
|
||||||
// 2. 使用SCAN安全遍历(避免阻塞)
|
// 2. 使用SCAN安全遍历(避免阻塞)
|
||||||
ScanOptions options = ScanOptions.scanOptions()
|
ScanOptions options = ScanOptions.scanOptions()
|
||||||
.match(KEY_PATTERN)
|
.match(KEY_PATTERN)
|
||||||
@@ -59,12 +61,17 @@ public class StudyCourseTask {
|
|||||||
String studyContentId = parts[1];
|
String studyContentId = parts[1];
|
||||||
|
|
||||||
// 7. 获取存储的时间点(示例逻辑)
|
// 7. 获取存储的时间点(示例逻辑)
|
||||||
String lastStudyTimeStr = redisTemplate.opsForValue().get(redisKey);
|
String redisValue = redisTemplate.opsForValue().get(redisKey);
|
||||||
if (lastStudyTimeStr == null) continue;
|
if (redisValue == null) continue;
|
||||||
int lastStudyTime = Integer.parseInt(lastStudyTimeStr);
|
String[] partValues = redisValue.split("&");
|
||||||
|
int lastStudyTime = Integer.parseInt(partValues[0]);
|
||||||
|
LocalDateTime timestamp = null;
|
||||||
|
if (partValues.length >= 2){
|
||||||
|
timestamp = LocalDateTime.parse(partValues[1], formatter);
|
||||||
|
}
|
||||||
|
|
||||||
// 8. 更新数据库(调用已有服务方法)
|
// 8. 更新数据库(调用已有服务方法)
|
||||||
studyService.updateStudyCourseItemLastTime(studyContentId, lastStudyTime, "system_job");
|
studyService.updateStudyCourseItemLastTime(studyContentId, lastStudyTime, timestamp);
|
||||||
|
|
||||||
// 9. 删除Redis键(原子操作)
|
// 9. 删除Redis键(原子操作)
|
||||||
redisTemplate.delete(redisKey);
|
redisTemplate.delete(redisKey);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.xboe.school.study.service;
|
package com.xboe.school.study.service;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -99,5 +100,5 @@ public interface IStudyService {
|
|||||||
|
|
||||||
List<StudyCourseItem> getList(String courseId, String contentId, String name, Integer status);
|
List<StudyCourseItem> getList(String courseId, String contentId, String name, Integer status);
|
||||||
|
|
||||||
void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime, String systemJob);
|
void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime, LocalDateTime timestamp);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -330,19 +330,25 @@ public class StudyServiceImpl implements IStudyService{
|
|||||||
// 更新 前端传输已学习时长
|
// 更新 前端传输已学习时长
|
||||||
@Override
|
@Override
|
||||||
public void updateLastTime(String studyContentId, int lastStudyTime,String aid) {
|
public void updateLastTime(String studyContentId, int lastStudyTime,String aid) {
|
||||||
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
|
||||||
|
String value = lastStudyTime + "&" + now.format(formatter); // 使用ISO8601时间格式
|
||||||
|
log.info("-study-video-time-----value = " + value);
|
||||||
// 20250303 优化 多次更新改一次更新
|
// 20250303 优化 多次更新改一次更新
|
||||||
// 更新Redis中的最后活跃时间(带30秒过期)
|
// 更新Redis中的最后活跃时间(带30秒过期)
|
||||||
redisTemplate.opsForValue().set(
|
redisTemplate.opsForValue().set(
|
||||||
"studyContentId:" + studyContentId + ":last_active",
|
"studyContentId:" + studyContentId + ":last_active",
|
||||||
String.valueOf(lastStudyTime),
|
value,
|
||||||
Duration.ofSeconds(2592000)
|
Duration.ofSeconds(2592000)
|
||||||
);
|
);
|
||||||
|
log.info("-study-video-time-redis保存---value = " + value);
|
||||||
// Duration.ofDays(30) 也就是 2592000秒
|
// Duration.ofDays(30) 也就是 2592000秒
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime,String aid) {
|
public void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime,LocalDateTime timestamp) {
|
||||||
|
log.info("-study-video-time-定时---studyContentId = " + studyContentId + ",lastStudyTime = " + lastStudyTime + ", timestamp = " + timestamp);
|
||||||
// 更新最后的学习时间点
|
// 更新最后的学习时间点
|
||||||
LocalDateTime now=LocalDateTime.now();
|
LocalDateTime now=LocalDateTime.now();
|
||||||
UpdateBuilder update=UpdateBuilder.from(StudyCourseItem.class);
|
UpdateBuilder update=UpdateBuilder.from(StudyCourseItem.class);
|
||||||
@@ -350,8 +356,9 @@ public class StudyServiceImpl implements IStudyService{
|
|||||||
//只记录时间长的时候的处理
|
//只记录时间长的时候的处理
|
||||||
update.addFilter(FieldFilters.lt("lastStudyTime", lastStudyTime));
|
update.addFilter(FieldFilters.lt("lastStudyTime", lastStudyTime));
|
||||||
update.addUpdateField("lastStudyTime", lastStudyTime);
|
update.addUpdateField("lastStudyTime", lastStudyTime);
|
||||||
update.addUpdateField("lastTime", now);
|
update.addUpdateField("lastTime", timestamp==null ? now : timestamp);
|
||||||
scItemDao.update(update.builder());
|
scItemDao.update(update.builder());
|
||||||
|
log.info("-study-video-time-mysql保存---studyContentId = " + studyContentId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user