背景:近期在同步数据的使用到了redis的对账方法,处理起来高效,便捷。
public class TestRedis {
@Autowired
private RedisTemplate redisTemplate;
public static final String hashNameA = "test-data-hashNameA";
public static final String hashNameB = "test-data-hashNameB";
public static final String setNameA = "test-data-setNameA";
public static final String setNameB = "test-data-setNameB";
public void test(){
List<MinioUploadDto> listA = new ArrayList<>();
List<MinioUploadDto> listB = new ArrayList<>();
SetOperations setA = redisTemplate.opsForSet();
SetOperations setB = redisTemplate.opsForSet();
//处理listA listB
for (MinioUploadDto minioUploadDto : listA) {
String keyA= minioUploadDto.getUrl() +"-" +minioUploadDto.getName();
//将每条数据放到hash中
redisTemplate.opsForHash().putIfAbsent(hashNameA,keyA,minioUploadDto);
// 将key放到set中
setA.add(setNameA,keyA);
}
for (MinioUploadDto minioUploadDto : listB) {
String keyB= minioUploadDto.getUrl() +"-" +minioUploadDto.getName();
//将每条数据放到hash中
redisTemplate.opsForHash().putIfAbsent(hashNameB,keyB,minioUploadDto);
// 将key放到set中
setB.add(setNameB,keyB);
}
/**
* redis的对账
*/
//得到listA中比listB多的数据
Set<String> diffA = redisTemplate.opsForSet().difference(setNameA, setNameB);
//得到listB中比listA多的数据
Set<String> diffB = redisTemplate.opsForSet().difference(setNameA, setNameB);
List<MinioUploadDto> addA = new ArrayList<>();
List<MinioUploadDto> addB= new ArrayList<>();
for (String s : diffA) {
MinioUploadDto minioUploadDtoA = (MinioUploadDto) redisTemplate.opsForHash().get(hashNameA, s);
addA.add(minioUploadDtoA);
}
for (String s : diffB) {
MinioUploadDto minioUploadDtoB = (MinioUploadDto) redisTemplate.opsForHash().get(hashNameB, s);
addA.add(minioUploadDtoB);
}
//END
}