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 21:03:33 浏览: 30
可以考虑将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数据量很大怎么优化代码
对于数据量很大的情况,可以考虑分批处理,即每次从数据库中取出一部分数据,处理完后再取下一批数据,直到所有数据都处理完成。这样可以减少一次性加载大量数据所带来的性能问题。
具体实现可以使用分页查询的方式,每次查询固定数量的数据,然后进行处理。示例代码如下:
```
int pageSize = 1000; // 每页查询的数据量
int pageNum = 1; // 当前页码
List<UserEo> userEoList = comDataComponent.getUserListByUid(pageNum, pageSize); // 分页查询数据
while (!userEoList.isEmpty()) {
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));
}
pageNum++;
userEoList = comDataComponent.getUserListByUid(pageNum, pageSize); // 分页查询下一页数据
}
```
需要注意的是,分页查询需要根据实际情况设置合理的pageSize,避免一次查询数据量过大,导致性能问题。同时,为了保证数据的一致性,需要在分批处理完成后,再进行后续的操作。