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数据量很大怎么优化代码
时间: 2023-08-03 09:05:45 浏览: 31
可以考虑使用分页查询,将用户数据分成多个批次进行处理,以减少一次性处理大量数据的压力。
例如,每次查询1000条用户数据进行处理,代码可以改为:
```
int pageSize = 1000;
int totalSize = userEoList.size();
for (int i = 0; i < totalSize; i += pageSize) {
int endIndex = i + pageSize;
if (endIndex > totalSize) {
endIndex = totalSize;
}
List<UserEo> subList = userEoList.subList(i, endIndex);
for (UserEo userEo : subList) {
// 进行数据处理
}
}
```
这样可以将大量数据分批处理,提高代码的性能。
相关问题
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)); }优化代码
可以考虑将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的拼接放到循环外面进行,也可以减少循环中的重复计算。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)