Redis को बैकएंड एप्लिकेशन के पीछे एक सुरक्षित नेटवर्क पर काम करने के लिए डिज़ाइन किया गया है। क्लाइंट एप्लिकेशन को सीधे रेडिस से कनेक्ट नहीं करना चाहिए। यह 2-स्तरीय एप्लिकेशन के लिए Redis को एक खराब विकल्प बनाता है।
अब यदि आप इसके लिए अभी भी Redis का उपयोग करना चाहते हैं, तो आपके पास कई विकल्प हैं। आप HTTP इंटरफ़ेस में Redis सर्वर को इनकैप्सुलेट कर सकते हैं। यह वही है जो nginx redis2 मॉड्यूल प्रदान करता है। आप वेबडिस पर भी एक नज़र डालना चाहते हैं, जो समान है (और nginx पर निर्भर नहीं है)। Webdis कुछ अभिगम नियंत्रण तंत्र प्रदान करता है। दस्तावेज़ देखें।
एक अन्य उपाय एक सुरंग स्थापित करना है, जैसा आपने प्रस्तावित किया था। मैं इसके लिए nginx का उपयोग नहीं करूंगा, लेकिन सिर्फ सादा पुराना SSH। मान लें कि रेडिस सर्वर मशीन बी (पोर्ट 6379) पर चलता है और क्लाइंट मशीन ए पर चलता है।
मशीन A पर, मैं दौड़ सकता हूँ:
ssh [email protected]_B -L 7008:host_B:6379 -N
यह स्थानीय बंदरगाह 7008 (मनमाना विकल्प) से ए से बी तक एक सुरंग खोलेगा, और इंतजार कर रहा है। उपयोगकर्ता को होस्ट बी पर घोषित किया जाना चाहिए, और उसका पासवर्ड ज्ञात होना चाहिए। एक अन्य सत्र में, अभी भी होस्ट A पर, अब हम दौड़ सकते हैं:
redis-cli -p 7008 ping
कृपया ध्यान दें कि एक मानक रेडिस क्लाइंट का उपयोग किया जाता है। सुरंग क्लाइंट के लिए पारदर्शी तरीके से प्रमाणीकरण, एन्क्रिप्शन और वैकल्पिक रूप से संपीड़न को संभालती है।
अब, आपका क्लाइंट एक जावा एप्लिकेशन है, और आप शायद सुरंग को सेटअप करने के लिए SSH कमांड नहीं चलाना चाहते हैं। उम्मीद है, आप सीधे जावा से सुरंग खोलने के लिए Jsch पैकेज का उपयोग कर सकते हैं। यहां जेडिस के साथ एक उदाहरण दिया गया है:
import redis.clients.jedis.*;
import java.util.*;
import com.jcraft.jsch.*;
public class TestTunnel {
Jedis jedis;
Session session;
JSch jsch = new JSch();
int port;
// None of the following should be hardcoded
static String USER = "user"; // SSH user on the redis server host
static String PASSWD = "XXXXXXXX"; // SSH user password
static String HOST = "192.168.1.62"; // Redis server host
static int PORT = 6379; // Redis server port
public TestTunnel() {
try {
// Open the SSH session
session = jsch.getSession( USER, HOST, 22 );
session.setPassword( PASSWD );
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
config.put("Compression", "yes");
config.put("ConnectionAttempts","3");
session.setConfig(config);
session.connect();
// Setup port forwarding from localhost to the Redis server
// Local port is ephemeral (given by the OS)
// Jedis connects to localhost using the local port
port = session.setPortForwardingL( 0, HOST, PORT );
jedis = new Jedis( "127.0.0.1", port );
} catch ( JSchException e ) {
// Proper error handling omitted
System.out.println(e);
}
}
public void disconnect() {
jedis.disconnect();
try {
session.delPortForwardingL( port );
session.disconnect();
} catch ( JSchException e ) {
// Proper error handling omitted
System.out.println(e);
}
}
public void mytest( int n ) {
for ( int k = 0; k < n; k++) {
jedis.set("k" + k, "value"+k);
}
System.out.println("Read: "+jedis.get("k0") );
}
public static void main(String[] args) {
TestTunnel obj = new TestTunnel();
obj.mytest(10);
obj.disconnect();
}
}
यह ठीक काम करता है, लेकिन कृपया ध्यान दें कि सुरंग के कारण ओवरहेड है। नेटवर्क धीमा होने पर ओवरहेड बहुत कम होता है (उदाहरण के लिए इंटरनेट)। तेज़ LAN (1 GbE) पर, यह बहुत अधिक ध्यान देने योग्य है:सुरंग का उपयोग करने पर विलंबता को 3 तक गुणा किया जा सकता है। रेडिस सर्वर द्वारा बनाए रखा जा सकने वाला अधिकतम थ्रूपुट भी प्रभावित होता है। सर्वर-साइड पर, sshd डेमॉन कुछ CPU (Redis से अधिक) लेता है।
उस ने कहा, मुझे नहीं लगता कि 2-स्तरीय एप्लिकेशन के लिए कच्चा प्रदर्शन ज्यादा मायने रखता है।