Xem Spring Data Redis - 8.5. Chỉ mục phụ và:
- 8.6. Truy vấn bằng ví dụ
- 8.10. Truy vấn và phương thức truy vấn
Chú thích @Indexed
hướng dẫn Spring Data Redis (SDR) tạo một tập hợp được lập chỉ mục thứ cấp dưới dạng một tập hợp để lập chỉ mục trường băm.
Điều này có nghĩa là khi bạn chèn dữ liệu, SDR sẽ chạy bảy lệnh tới Redis:
HMSET "OrgWork:19315449-cda2-4f5c-b696-9cb8018fa1f9" "_class" "OrgWork"
"id" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
"CorpDetails" "CorpDetailsValueHere" "ContractType" "ContractTypeValueHere"
... "Country" "Costa Rica"
SADD "OrgWork" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
SADD "OrgWork:CorpDetails:CorpDetailsValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
SADD "OrgWork:ContractType:ContractTypeValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
...
SADD "OrgWork:Country:Costa Rica" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
Sử dụng truy vấn theo ví dụ:
Bạn muốn tạo một kho lưu trữ:
interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}
Và sau đó triển khai truy vấn như trong dịch vụ mẫu bên dưới:
class OrgWorkService {
@Autowired OrgWorkRepository orgWorkRepository;
List<OrgWork> findOrgWorks(OrgWork probe) {
return orgWorkRepository.findAll(Example.of(probe));
}
}
Và sử dụng như:
OrgWork orgWorkExample = new OrgWork();
orgWorkExample.setCorpDetails("CorpDetailsValueHere");
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);
Đằng sau hậu trường, SDR sẽ xử lý việc chuyển đổi lệnh này thành lệnh Redis để lấy dữ liệu của bạn, sử dụng kết hợp SINTER và HGETALL:
SINTER …:CorpDetails:CorpDetailsValueHere …:ContractType:ContractTypeValueHere ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3"
HGETALL ...
Đây là một quy trình gồm hai bước:
- Tìm nạp các khóa có trong giao điểm của các chỉ mục phụ, sử dụng
SINTER
- Tìm nạp từng khóa do <1> trả về riêng lẻ, sử dụng
HGETALL
Redis có thể quản lý khối lượng công việc 100.000 mỗi phút, giả sử bạn có một máy chủ chất lượng, kích thước tập dữ liệu hợp lý và các truy vấn ở mức trung bình hơi cụ thể.
SINTER
có độ phức tạp thời gian là O (N * M) trong trường hợp xấu nhất, trong đó N là tổng số của bộ nhỏ nhất và M là số bộ. Bạn có một bộ cho mọi thứ nguyên trong truy vấn của mình.
HGETALL
là O (N) trong đó N là kích thước của hàm băm, trong trường hợp của bạn là 7.
Như mọi khi, bạn nên thực hiện một số phép đo điểm chuẩn để kiểm tra xem bạn có đạt được hiệu suất mong muốn hay không và điều chỉnh nếu cần.