Bạn có thể, nhưng nó không phải là tầm thường. Trước hết, Redis sử dụng dấu ngoặc nhọn trong khóa để xác định phần sharding của nó, vì vậy bạn có thể quyết định sửa đổi khóa và gửi nó đến một phân đoạn tùy ý.
Bây giờ, bạn cần hai thứ:
-
Bản đồ về phân đoạn hoặc phạm vi vị trí nằm trong phiên bản redis nào.
-
Một cách để biết chuỗi nào ánh xạ tới vị trí nào, vì vậy bạn có thể buộc một "chuỗi sharding" trên khóa của mình để định tuyến nó đến một phân đoạn cụ thể.
Cách đầu tiên rất dễ dàng - CLUSTER SLOTS
sẽ cung cấp cho bạn bản đồ đó, chỉ cần phân tích cú pháp.
Cái thứ hai phức tạp hơn - nhưng may mắn là tôi đã làm xong công việc này rồi. Tôi đã tạo một bảng ánh xạ chuỗi chữ và số ngắn nhất có thể tới từng khe trong số 16384 vị trí trong cụm Redis. Tôi ở trong C nhưng bạn có thể dễ dàng chuyển đổi nó thành bất cứ điều gì. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
Vì vậy, thuật toán của bạn sẽ được cung cấp một khóa và một nút mong muốn:
-
Nhìn vào bản đồ vị trí và lấy các phạm vi vị trí nằm trên nút đó.
-
Chọn một vị trí trong phạm vi của nút đó.
-
Tìm trong bảng sharding để biết mục nhập của vị trí đó.
-
Đánh vào chuỗi đó bằng dấu ngoặc nhọn trên phím. ví dụ. chuyển đổi
foo
tớifoo{e4x}
.
Và đó là nó! Bất kỳ lệnh nào sử dụng phím này sẽ được chuyển đến phân đoạn đó.
Phiên bản Pseudo-python của nó:
# Build this table from CLUSTER SLOTS or CLUSTER NODES
slots = {
'127.0.0.1:7000': [(0, 1045),(2000,2100)]
...
}
# Build this table from the C example:
sharding_table = ["06S", "Qi", "5L5", "4Iu", "4gY", ....]
def retarget_key(key, node):
ranges = slots[node]
sharding_key = shading_table[ranges[0][0]]
return '%s{%s}' % (key, sharding_key)