Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Chuyển tiếp cổng với nginx từ java

Redis được thiết kế để hoạt động trên một mạng an toàn, đằng sau một ứng dụng phụ trợ. Các ứng dụng khách không được kết nối trực tiếp với Redis. Nó khiến Redis trở thành một lựa chọn tồi cho một ứng dụng 2 tầng.

Bây giờ nếu bạn vẫn muốn sử dụng Redis cho việc này, bạn có một số tùy chọn. Bạn có thể đóng gói máy chủ Redis trong giao diện HTTP. Đây là những gì mô-đun nginx redis2 cung cấp. Bạn cũng có thể muốn xem webdis, tương tự (và không phụ thuộc vào nginx). Webdis cung cấp một số cơ chế kiểm soát truy cập. Xem tài liệu.

Một giải pháp khác là thiết lập một đường hầm, như bạn đã đề xuất. Tôi sẽ không sử dụng nginx cho việc này, mà chỉ sử dụng SSH cũ đơn thuần. Giả sử máy chủ Redis chạy trên máy B (cổng 6379) và máy khách chạy trên máy A.

Trên máy A, tôi có thể chạy:

ssh [email protected]_B -L 7008:host_B:6379 -N

Nó sẽ mở một đường hầm từ A đến B từ cổng địa phương 7008 (lựa chọn tùy ý) và chờ đợi. Người dùng phải được khai báo trên máy chủ B và mật khẩu của máy chủ này được biết. Trong một phiên khác, vẫn trên máy chủ A, giờ chúng ta có thể chạy:

redis-cli -p 7008 ping

Xin lưu ý rằng khách hàng Redis tiêu chuẩn được sử dụng. Đường hầm xử lý xác thực, mã hóa và tùy chọn nén theo cách minh bạch cho ứng dụng khách.

Bây giờ, ứng dụng khách của bạn là một ứng dụng Java và bạn có thể không muốn chạy các lệnh SSH để thiết lập đường hầm. Hy vọng rằng bạn có thể sử dụng gói Jsch để mở đường hầm trực tiếp từ Java. Đây là một ví dụ với Jedis:

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();
    }
 }

Nó hoạt động tốt, nhưng xin lưu ý rằng có một phần trên cao do đường hầm. Chi phí rất thấp khi mạng chậm (Internet chẳng hạn). Trên mạng LAN nhanh (1 GbE), điều đáng chú ý hơn nhiều:độ trễ có thể nhân lên đến 3 khi sử dụng đường hầm. Thông lượng tối đa mà máy chủ Redis có thể duy trì cũng bị ảnh hưởng. Ở phía máy chủ, trình nền sshd chiếm một số CPU (nhiều hơn chính Redis).

Điều đó nói rằng, tôi không nghĩ hiệu suất thô quan trọng nhiều đối với ứng dụng 2 tầng.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách sử dụng Redis Sorted Lists

  2. Cách cài đặt Redis

  3. Chuyển đổi DataFrame sang RDD [(Chuỗi, Chuỗi)]

  4. Đẩy đến hàng đợi Laravel từ bên ngoài Laravel (NodeJS)

  5. Làm cách nào để sử dụng sadd với nhiều phần tử trong Redis bằng Python API?