Sự khác biệt giữa sync() và syncAndReturnAll() trong ShardedJedisPipeline

Giải thích từ tài liệu chính thức

Đồng bộ hóa pipeline bằng cách đọc tất cả các phản hồi. Hoạt động này sẽ đóng pipeline. Để lấy giá trị trả về từ các lệnh pipeline, hãy bắt các đối tượng Response khác nhau đã thực thi.

Đồng bộ hóa pipeline bằng cách đọc tất cả các phản hồi. Hoạt động này sẽ đóng pipeline. Cố gắng tránh sử dụng phiên bản này và sử dụng ShardedJedisPipeline.sync() thay vào đó, vì nó không duyệt qua tất cả các phản hồi và tạo ra các kiểu phản hồi chính xác (thường là lãng phí thời gian).

Nếu không yêu cầu thứ tự trả về, nên sử dụng sync()

Dưới đây là triển khai lấy dữ liệu từ cache qua pipeline:

/**
     * Lấy dữ liệu theo batch thông qua key
     *
     * @param keys  danh sách key, đây là key cache, map trả về cũng sử dụng key này
     * @param clazz kiểu đối tượng cần chuyển đổi
     * @param <T>   dữ liệu map tương ứng với key
     * @return
     */
    @RunTimeLog
    public <T> Map<String, T> layDuLieuTheoBatch(List<String> keys, Class<T> clazz) {
        //tạo đối tượng nhận kết quả
        Map<String, T> ketQua = Maps.newHashMap();
        Map<String, Response<String>> mapGiaTriRedis = Maps.newHashMap();
        try {
            ShardedJedisPipeline pip = redisClient.pipeline();
            keys.stream().filter(key -> CommonUtils.kiemTraKhongRong(key)).forEach(key -> mapGiaTriRedis.put(key, pip.get(key)));
            //Đồng bộ hóa pipeline bằng cách đọc tất cả các phản hồi. Hoạt động này sẽ đóng pipeline. Để lấy giá trị trả về từ các lệnh pipeline, hãy bắt các đối tượng Response khác nhau đã thực thi.
            pip.sync();
            //Đồng bộ hóa pipeline bằng cách đọc tất cả các phản hồi. Hoạt động này sẽ đóng pipeline. Cố gắng tránh sử dụng phiên bản này và sử dụng ShardedJedisPipeline.sync() thay vào đó, vì nó không duyệt qua tất cả các phản hồi và tạo ra các kiểu phản hồi chính xác (thường là lãng phí thời gian).
            //pip.syncAndReturnAll();
            mapGiaTriRedis.keySet().forEach(key -> ketQua.put(key, JSON.parseObject(mapGiaTriRedis.get(key).get(), clazz)));
        } catch (Exception ex) {
            LOGGER.error("lỗi:{}", ex);
        }
        return ketQua;
    }
/**<br></br> * Lấy dữ liệu theo batch qua key, nếu không lấy được sẽ dùng key để truy vấn trong hàm tham số, chủ yếu dùng khi cache không có, sau đó truy vấn lại trong database<br></br> *<br></br> * @param keys  danh sách key, đây là key cache, map trả về cũng sử dụng key này<br></br> * @param clazz kiểu đối tượng cần chuyển đổi<br></br> * @param <T>   dữ liệu map tương ứng với key<br></br> * @return<br></br> */<br></br>public synchronized <T> Map<String, T> layDuLieuTheoBatch(List<String> keys, Class<T> clazz, Function<String, T> hamXuLy) {<br></br>    Map<String, T> ketQua = this.layDuLieuTheoBatch(keys, clazz);<br></br>    List<String> danhSachKeyXoa= Lists.newArrayList();<br></br>    try {<br></br>        ketQua.keySet().forEach(key -> {<br></br>            if (ketQua.get(key) == null) {<br></br>                T t = hamXuLy.apply(key);<br></br>                if (t != null) {<br></br>                    ketQua.put(key, t);<br></br>                }else{<br></br>                    danhSachKeyXoa.add(key);<br></br>                }<br></br>            }<br></br>        });<br></br>        danhSachKeyXoa.forEach(key->{<br></br>            ketQua.remove(key);<br></br>        });<br></br>    } catch (Exception ex) {<br></br>        LOGGER.error("lỗi:{}", ex);<br></br>    }<br></br>    return ketQua;<br></br>}
<em> </em>

Thẻ: Redis Java ShardedJedis pipeline Cache

Đăng vào ngày 7 tháng 6 lúc 04:00