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 22:03:53 浏览: 77
可以考虑使用批量操作来提高效率,将获取的用户列表分批次进行处理,例如每次处理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的整数倍,需要在最后一次处理时特别处理。
阅读全文