Có ít nhất 3 cách khác nhau để làm điều đó, mỗi cách đều có ưu và nhược điểm riêng.
Cách tiếp cận đầu tiên là sử dụng tính năng quét đặc biệt không nguyên tử của cây để xác định và làm mất hiệu lực (xóa) cấp 2 của cây (tập hợp tùy chỉnh đầu tiên). Để làm điều đó, hãy sử dụng lược đồ đặt tên phân cấp cho các trường trong Hash của bạn và lặp lại chúng bằng cách sử dụng HSCAN
. Ví dụ:giả sử rằng tên khóa Hash của bạn là ID của sản phẩm (ví dụ:ProductA), bạn sẽ sử dụng tên trường như '0001:0001' làm tên trường cho phiên bản đầu tiên của tùy chỉnh đầu tiên, '0001:0002' cho phiên bản thứ hai và vân vân. Tương tự, '0002:0001' sẽ là phiên bản đầu tiên tùy chỉnh thứ 2, v.v. Sau đó, tìm tất cả các phiên bản của tùy chỉnh 42, sử dụng HSCAN ProductA 0 MATCH 0042:*
, HDEL
các trường trong câu trả lời và lặp lại cho đến khi con trỏ bằng 0.
Cách tiếp cận ngược lại là chủ động "lập chỉ mục" từng phiên bản của tùy chỉnh để bạn có thể tìm nạp chúng một cách hiệu quả thay vì thực hiện quét toàn bộ Hash. Cách để thực hiện điều đó là sử dụng Bộ của Redis - bạn giữ một Bộ với tất cả các tên trường cho phiên bản của sản phẩm nhất định. Các phiên bản có thể là tuần tự (như trong ví dụ của tôi) hoặc bất kỳ thứ gì khác miễn là chúng là duy nhất. Chi phí duy trì các chỉ số này - bất cứ khi nào bạn thêm hoặc xóa tùy chỉnh và / hoặc phiên bản của sản phẩm, bạn sẽ cần duy trì tính nhất quán với các Bộ này. Ví dụ:việc tạo một phiên bản sẽ giống như sau:
HSET ProductA 0001:0001 "<customization 1 version 1 JSON payload"
SADD ProductA:0001 0001
Lưu ý rằng hai hoạt động này phải nằm trong một giao dịch duy nhất (tức là sử dụng MULTI\EXEC
khối hoặc EVAL
a Lua script). Khi bạn đã thiết lập điều này, việc vô hiệu hóa một tùy chỉnh chỉ là vấn đề gọi SMEMBERS
trên Set có liên quan và xóa các phiên bản trong đó khỏi Hash (và cả chính Set). Tuy nhiên, điều quan trọng cần lưu ý là việc đọc tất cả các thành viên từ một Tập hợp lớn có thể tốn thời gian - 1K thành viên không phải là quá tệ, nhưng đối với các Tập hợp lớn hơn thì có SSCAN
.
Cuối cùng, bạn có thể cân nhắc sử dụng Tập hợp đã sắp xếp thay vì Băm. Mặc dù có lẽ ít trực quan hơn trong trường hợp sử dụng này, nhưng Tập hợp đã sắp xếp sẽ cho phép bạn thực hiện tất cả các thao tác bạn cần. Tuy nhiên, cái giá phải trả cho việc sử dụng nó là sự phức tạp tăng lên của O (logN) để thêm / bớt / đọc so với Hash's O (1), nhưng với các con số, sự khác biệt không đáng kể.
Để giải phóng sức mạnh của Nhóm sắp xếp, bạn sẽ sử dụng thứ tự từ vựng để tất cả các thành viên của Nhóm được sắp xếp phải có cùng số điểm (ví dụ:sử dụng 0). Mỗi sản phẩm sẽ được đại diện bởi một Tập hợp được sắp xếp, giống như với Băm. Các thành viên của Tập hợp là tương đương của trường Hash, cụ thể là các phiên bản tùy chỉnh. "Mánh khóe" là xây dựng các thành viên theo cách cho phép bạn thực hiện tìm kiếm theo phạm vi (hoặc vô hiệu cấp 2 nếu bạn muốn). Đây là một ví dụ về cách nó trông như thế nào (lưu ý rằng ở đây ProductA chính không phải là Hash mà là một Tập hợp được sắp xếp):
ZADD ProductA 0 0001:0001:<JSON>
Để đọc phiên bản tùy chỉnh, hãy sử dụng ZRANGEBYLEX ProductA [0001:0001: [0001:0001:\xff
và tách JSON khỏi câu trả lời và để xóa toàn bộ tùy chỉnh, hãy sử dụng ZREMRANGEBYLEX
.