List<UserEo> userEoList = comDataComponent.getUserListByUid(); for (UserEo userEo : userEoList) { List<DataPermissionSchema> userDataPermissionSchema = getUserDataPermissionSchema(userEo.getUserUid(), userEo.getOrgCode()); //将当前用户的数据权限 存入redis key = SystemsConstant.DATA_PERMISSION_SCHEMA + UserUid redisTemplate.opsForValue().set(SystemsConstant.DATA_PERMISSION_SCHEMA + userEo.getUserUid(), ObjectUtil.toString(userDataPermissionSchema)); }优化代码
时间: 2024-02-03 08:03:33 浏览: 71
可以考虑将redis操作改为批量操作,减少网络通信开销,代码如下:
```
List<UserEo> userEoList = comDataComponent.getUserListByUid();
Map<String, String> dataPermissionMap = new HashMap<>();
for (UserEo userEo : userEoList) {
List<DataPermissionSchema> userDataPermissionSchema = getUserDataPermissionSchema(userEo.getUserUid(), userEo.getOrgCode());
String key = SystemsConstant.DATA_PERMISSION_SCHEMA + userEo.getUserUid();
dataPermissionMap.put(key, ObjectUtil.toString(userDataPermissionSchema));
}
redisTemplate.opsForValue().multiSet(dataPermissionMap);
```
使用`multiSet`方法进行批量设置redis中的key-value对,将所有需要设置的key-value对先存入Map中,然后一次性进行批量设置,减少了网络通信的开销。同时,将redis中key的拼接放到循环外面进行,也可以减少循环中的重复计算。
相关问题
List<UserEo> userEoList = comDataComponent.getUserListByUid(); for (UserEo userEo : userEoList) { List<DataPermissionSchema> userDataPermissionSchema = getUserDataPermissionSchema(userEo.getUserUid(), userEo.getOrgCode()); //将当前用户的数据权限 存入redis key = SystemsConstant.DATA_PERMISSION_SCHEMA + UserUid redisTemplate.opsForValue().set(SystemsConstant.DATA_PERMISSION_SCHEMA + userEo.getUserUid(), ObjectUtil.toString(userDataPermissionSchema)); }代码优化
可以考虑使用批量操作来提高效率,将获取的用户列表分批次进行处理,例如每次处理100个用户,可以使用分页查询或者按照用户ID范围查询来实现。同时,可以使用Redis的pipeline技术来进行批量写入,减少网络开销和Redis服务器的压力。
优化后的代码示例:
```java
int pageSize = 100; // 每页处理的用户数量
int pageNum = 1;
List<UserEo> userEoList = null;
do {
userEoList = comDataComponent.getUserListByUid(pageNum, pageSize);
List<String> redisKeys = new ArrayList<>(); // 存储Redis的Key
List<String> redisValues = new ArrayList<>(); // 存储Redis的Value
for (UserEo userEo : userEoList) {
List<DataPermissionSchema> userDataPermissionSchema = getUserDataPermissionSchema(userEo.getUserUid(), userEo.getOrgCode());
String redisKey = SystemsConstant.DATA_PERMISSION_SCHEMA + userEo.getUserUid();
String redisValue = ObjectUtil.toString(userDataPermissionSchema);
redisKeys.add(redisKey);
redisValues.add(redisValue);
}
if (!redisKeys.isEmpty()) {
redisTemplate.executePipelined(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
for (int i = 0; i < redisKeys.size(); i++) {
byte[] key = redisKeys.get(i).getBytes();
byte[] value = redisValues.get(i).getBytes();
connection.set(key, value);
}
return null;
}
});
}
pageNum++;
} while (userEoList.size() == pageSize);
```
上述代码中,使用了do-while循环对用户列表进行分页处理,每次处理pageSize个用户。使用了两个List分别存储Redis的Key和Value,然后使用Redis的pipeline技术批量写入Redis。注意,如果用户数量不是pageSize的整数倍,需要在最后一次处理时特别处理。
List<UserEo> userEoList = comDataComponent.getUserListByUid(); for (UserEo userEo : userEoList) { List<DataPermissionSchema> userDataPermissionSchema = getUserDataPermissionSchema(userEo.getUserUid(), userEo.getOrgCode()); //将当前用户的数据权限 存入redis key = SystemsConstant.DATA_PERMISSION_SCHEMA + UserUid redisTemplate.opsForValue().set(SystemsConstant.DATA_PERMISSION_SCHEMA + userEo.getUserUid(), ObjectUtil.toString(userDataPermissionSchema)); }userEoList数据量一万怎么优化代码
可以考虑使用多线程来提高代码的执行效率,将循环遍历的过程拆分成多个线程并行执行,可以采用线程池来管理线程的执行。具体实现如下:
1. 创建线程池
```
// 创建一个线程池,根据CPU核心数来创建
int corePoolSize = Runtime.getRuntime().availableProcessors();
ExecutorService executorService = Executors.newFixedThreadPool(corePoolSize);
```
2. 将任务拆分成多个子任务,并提交到线程池中执行
```
// 将任务拆分成多个子任务
List<List<UserEo>> subUserEoList = ListUtils.splitList(userEoList, corePoolSize);
// 提交子任务到线程池中执行
for (List<UserEo> subList : subUserEoList) {
executorService.execute(() -> {
for (UserEo userEo : subList) {
List<DataPermissionSchema> userDataPermissionSchema = getUserDataPermissionSchema(userEo.getUserUid(), userEo.getOrgCode());
redisTemplate.opsForValue().set(SystemsConstant.DATA_PERMISSION_SCHEMA + userEo.getUserUid(), ObjectUtil.toString(userDataPermissionSchema));
}
});
}
```
3. 关闭线程池
```
// 关闭线程池
executorService.shutdown();
```
其中,ListUtils.splitList() 可以使用 Apache Commons Collections 库中的工具类实现,可以将一个大的 List 拆分成多个子 List,每个子 List 的大小相等或者差不多相等。这样可以将任务平均分配到多个线程中执行,提高代码的执行效率。
阅读全文