आप कर सकते हैं, लेकिन यह तुच्छ नहीं है। सबसे पहले, रेडिस इसके शार्डिंग भाग को निर्धारित करने के लिए कुंजी में घुंघराले ब्रेसिज़ का उपयोग करता है, इसलिए आप एक कुंजी को संशोधित करने और इसे मनमाने ढंग से भेजने का निर्णय ले सकते हैं।
अब, आपको दो चीज़ें चाहिए:
-
रेडिस इंस्टेंस में किस शार्ड या स्लॉट-रेंज का नक्शा रहता है।
-
यह जानने का एक तरीका है कि कौन सा स्ट्रिंग किस स्लॉट में मैप करता है, ताकि आप अपनी कुंजी पर "शार्डिंग स्ट्रिंग" को एक विशिष्ट शार्ड पर रूट करने के लिए बाध्य कर सकें।
पहला आसान है - CLUSTER SLOTS
आपको वह नक्शा देगा, बस इसे पार्स करें।
दूसरा वाला अधिक मुश्किल है - लेकिन सौभाग्य से मैंने यह काम पहले ही कर लिया है। मैंने रेडिस क्लस्टर में 16384 स्लॉट्स में से प्रत्येक के लिए कम से कम संभव अल्फ़ान्यूमेरिक स्ट्रिंग मैपिंग की एक तालिका बनाई है। मैं सी में नहीं हूं लेकिन आप इसे आसानी से जो कुछ भी परिवर्तित कर सकते हैं। https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e
तो आपका एल्गोरिदम एक कुंजी और वांछित नोड दिया जाएगा:
-
स्लॉट मैप को देखें और उस नोड पर रहने वाली स्लॉट रेंज लें।
-
उस नोड की सीमा के भीतर एक स्लॉट का चयन करें।
-
उस स्लॉट की प्रविष्टि के लिए शार्डिंग टेबल में देखें।
-
उस स्ट्रिंग को कुंजी पर घुंघराले ब्रेसिज़ के साथ थप्पड़ मारो। जैसे कन्वर्ट
foo
करने के लिएfoo{e4x}
.
और बस! इस कुंजी का उपयोग करने वाला कोई भी आदेश उस शार्ड पर भेजा जाएगा।
इसका छद्म-अजगर संस्करण:
# 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)