可以帮我优化下面的代码吗? 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(10, TimeUnit.SECONDS); try { // 完成阅读任务,并将用户已完成的阅读任务数加 1 ops.increment(readCountKey, 1); // 将计数器设置为过期 redisTemplate.expire(readCountKey, 1, TimeUnit.DAYS); } finally { // 释放分布式锁 lock.unlock(); } break; default:
时间: 2023-02-09 10:08:44 浏览: 99
这段代码的目的是在完成一个任务之前,先检查用户是否已经完成任务的数量是否已达到上限,如果已达到上限就不再执行完成任务的操作。
在这段代码中,似乎存在一些可以优化的地方:
1. 首先,你可以考虑将查询数据库的操作放在分布式锁的外面,这样可以避免锁的竞争。
2. 其次,你可以将 "taskRuleDetailMapper.selectTaskGroupListCode" 方法的返回值直接赋值给 "taskRuleDetails" 变量,而不是使用 "CollectionUtils.isEmpty" 方法判断是否为空。
3. 在没有获取到锁的情况下,你可以考虑使用 "tryLock" 方法来尝试获取锁,并在获取失败后直接返回。
4. 在完成任务后,你可以使用 "incr" 方法将用户已完成的任务数加 1,而不是使用 "increment" 方法。
5. 在处理完成任务的逻辑之后,你可以将分布式锁的释放放在 finally 块中,这样即使在处理过程中出现异常,锁也会被正常释放。
希望这些建议能够帮助你优化代码。
相关问题
写出这段代码优化后的示例// 用户完成阅读任务的上限 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(); }
优化后的代码示例如下:
```
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
阅读全文