Phần lớn các câu hỏi của bạn có sẵn trong tài liệu tham khảo Spring Data Redis.
Trước khi đào sâu vào Pipelining, một lần đa nhận được từ một Hash không yêu cầu Pipelining vì nó chỉ là một lệnh duy nhất. Pipelining sẽ không cải thiện hiệu suất / độ ổn định /… của tương tác Redis của bạn.
Pipelining được sắp xếp như một lệnh gọi lại và nhằm mục đích đưa ra nhiều lệnh mà không cần đợi kết quả ngay lập tức - hãy nghĩ về nó như một lô nơi bạn nhận được tất cả kết quả sau đó. Bởi vì pipelining đồng bộ hóa phản hồi ở cuối, bạn không nhận được giá trị kết quả trong lệnh gọi lại nhưng ở cuối, khi phiên pipelining được đồng bộ hóa và executePipelined(…)
chấm dứt.
Mã của bạn nên trông giống như sau:
List<Object> results = getRedisTemplate().executePipelined(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) {
connection.hMGet(key.getBytes(), params);
return null;
}
});
List<Object> hmget = (List<Object>) results.get(0);
Bạn phải chỉ sử dụng kết nối mà bạn nhận được làm đối số gọi lại vì kết nối đã vào chế độ pipelining. Lấy kết nối từ bên ngoài lệnh gọi lại (như template.getConnectionFactory().getConnection()
) sẽ mở một kết nối mới và thực hiện các lệnh Redis với các phản hồi đang chờ đợi - không có pipelining nào được áp dụng cho bất kỳ kết nối thu được bên ngoài nào.
Bạn cũng có thể sử dụng các phương thức của RedisTemplate
thay vì làm việc với kết nối đơn giản. executePipelined(…)
liên kết kết nối được sử dụng trong lệnh gọi lại với Luồng hiện tại và sử dụng lại kết nối bị ràng buộc đó nếu bạn gọi các phương thức API mẫu.
Về câu hỏi Lua của bạn:Các lệnh gọi mã / phương thức không được chuyển sang Lua.