写出这段代码优化后的示例// 用户完成阅读任务的上限 List<TaskRuleDetail> taskRuleDetails = taskRuleDetailMapper.selectTaskGroupListCode(taskDTO.getGroupCode(), taskDTO.getTaskCode()); if (CollectionUtils.isEmpty(taskRuleDetails)) { throw new BusinessRuntimeException(ErrorCodeConstant._3004010.getCode(), ErrorCodeConstant._3004010.getMessage()); } List<Map<String, Object>> result = getResult(taskRuleDetails); int READING_TASK_LIMIT = 0; Map<String, Object> map = result.get(0); String userId = crmId + ":" + getDate(); String taskLockKey = "task:lock" + userId; String readCountKey = "task:user:" + "count:" + userId; Object articlePlatformShared = map.get("reading_article_platform_shared"); if(articlePlatformShared!=null){ //获取当天最大完成量 READING_TASK_LIMIT= (Integer) map.get("day_complete_task_max"); if(!"1".equals(articlePlatformShared)){ readCountKey+=":"+taskDTO.getAppCode(); } } // 使用 RedisTemplate 获取用户已完成的阅读任务数 ValueOperations<String, String> ops = redisTemplate.opsForValue(); String dayCount = ops.get(readCountKey); if (StringUtils.isEmpty(dayCount)) { dayCount = "0"; } // 如果用户已完成的阅读任务数达到上限,则不再完成任务 int anInt = Integer.parseInt(dayCount); if (anInt >= READING_TASK_LIMIT) { log.warn("警告用户完成任务上限后再次完成"); return; } // 使用 Redission 获取分布式锁 RLock lock = redissonClient.getLock(taskLockKey); lock.lock(); try { // 完成阅读任务,并将用户已完成的阅读任务数加 1 ops.increment(readCountKey, 1); // 将计数器设置为过期 redisTemplate.expire(readCountKey, 1, TimeUnit.DAYS); } finally { // 释放分布式锁 lock.unlock(); }
时间: 2023-02-09 15:08:45 浏览: 135
优化后的代码示例如下:
```
List<TaskRuleDetail> taskRuleDetails = taskRuleDetailMapper.selectTaskGroupListCode(taskDTO.getGroupCode(), taskDTO.getTaskCode());
if (CollectionUtils.isEmpty(taskRuleDetails)) {
throw new BusinessRuntimeException(ErrorCodeConstant._3004010.getCode(), ErrorCodeConstant._3004010.getMessage());
}
List<Map<String, Object>> result = getResult(taskRuleDetails);
Map<String, Object> map = result.get(0);
// 定义用户 ID
String userId = crmId + ":" + getDate();
// 定义分布式锁的 key
String taskLockKey = "task:lock:" + userId;
// 定义计数器的 key
String readCountKey = "task:user:count:" + userId;
Object articlePlatformShared = map.get("reading_article_platform_shared");
if (articlePlatformShared != null) {
// 获取当天最大完成量
int READING_TASK_LIMIT = (Integer) map.get("day_complete_task_max");
// 如果文章平台未共享,则添加 appCode 作为计数器的后缀
if (!"1".equals(articlePlatformShared)) {
readCountKey += ":" + taskDTO.getAppCode();
}
}
// 使用 RedisTemplate 获取用户已完成的阅读任务数
ValueOperations<String, String> ops = redisTemplate.opsForValue();
String dayCount = ops.get(readCountKey);
// 如果计数器不存在,则设为 0
if (StringUtils.isEmpty(dayCount)) {
dayCount = "0";
}
// 如果用户已完成的阅读任务数达到上限,则不再完成任务
int anInt = Integer.parseInt(dayCount);
if (anInt >= READING_TASK_LIMIT) {
log.warn("警告用户完成任务上限后再次完成");
return;
}
// 使用 Redisson 获取分布式锁
RLock lock = redissonClient.getLock(taskLockKey);
lock.lock();
try {
// 完成阅读任务,并将用户已完成的阅读任务数加 1
ops
阅读全文