आपके अधिकांश प्रश्न स्प्रिंग डेटा रेडिस संदर्भ दस्तावेज़ में उपलब्ध हैं।
पाइपलाइनिंग में खुदाई करने से पहले, एक हैश से एकल मल्टी-गेट को पाइपलाइनिंग की आवश्यकता नहीं होती है क्योंकि यह केवल एक ही कमांड है। पाइपलाइनिंग आपके Redis इंटरैक्शन के प्रदर्शन/स्थिरता/… में सुधार नहीं करेगी।
पाइपलाइनिंग को कॉलबैक के रूप में व्यवस्थित किया जाता है और तुरंत परिणाम की प्रतीक्षा किए बिना कई कमांड जारी करने का इरादा है - इसे एक बैच के रूप में सोचें जहां आपको बाद में सभी परिणाम मिलते हैं। क्योंकि पाइपलाइनिंग प्रतिक्रियाओं को बहुत अंत में सिंक्रनाइज़ करता है, आपको कॉलबैक के भीतर परिणाम मान प्राप्त नहीं होते हैं, लेकिन बहुत अंत में, जब पाइपलाइनिंग सत्र सिंक्रनाइज़ किया जाता है और executePipelined(…)
समाप्त होता है।
आपका कोड इस तरह दिखना चाहिए:
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);
आपको केवल उस कनेक्शन का उपयोग करना होगा जो आपको कॉलबैक तर्क के रूप में प्राप्त होता है क्योंकि कनेक्शन पाइपलाइनिंग मोड में प्रवेश कर चुका है। कॉलबैक के बाहर से कनेक्शन प्राप्त करना (जैसे template.getConnectionFactory().getConnection()
) एक नया कनेक्शन खोलेगा और प्रतीक्षारत प्रतिक्रियाओं के साथ रेडिस कमांड निष्पादित करेगा - किसी भी बाहरी प्राप्त कनेक्शन पर कोई पाइपलाइनिंग लागू नहीं होती है।
आप RedisTemplate
. की विधियों का भी उपयोग कर सकते हैं सादे कनेक्शन के साथ काम करने के बजाय। executePipelined(…)
कॉलबैक में उपयोग किए गए कनेक्शन को वर्तमान थ्रेड से बांधता है और यदि आप टेम्पलेट API विधियों को कॉल करते हैं तो उस बाध्य कनेक्शन का पुन:उपयोग करता है।
आपके लुआ प्रश्न के संबंध में:कोड/विधि कॉल लुआ में स्थानांतरित नहीं होते हैं।