Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Penerusan port dengan nginx dari java

Redis dirancang untuk bekerja pada jaringan yang aman, di belakang aplikasi backend. Aplikasi klien tidak seharusnya terhubung langsung ke Redis. Itu membuat Redis menjadi pilihan yang buruk untuk aplikasi 2 tingkat.

Sekarang jika Anda masih ingin menggunakan Redis untuk ini, Anda memiliki beberapa opsi. Anda dapat merangkum server Redis dalam antarmuka HTTP. Inilah yang disediakan modul nginx redis2. Anda mungkin juga ingin melihat webdis, yang serupa (dan tidak bergantung pada nginx). Webdis menawarkan beberapa mekanisme kontrol akses. Lihat dokumentasinya.

Solusi lain adalah membuat terowongan, seperti yang Anda usulkan. Saya tidak akan menggunakan nginx untuk ini, tetapi hanya SSH lama. Misalkan server Redis berjalan di mesin B (port 6379) dan klien berjalan di mesin A.

Di mesin A, saya dapat menjalankan:

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

Ini akan membuka terowongan dari A ke B dari port lokal 7008 (pilihan sewenang-wenang), dan menunggu. Pengguna harus dideklarasikan di host B, dan kata sandinya diketahui. Di sesi lain, masih di host A, sekarang kita dapat menjalankan:

redis-cli -p 7008 ping

Harap dicatat klien Redis standar digunakan. Tunnel menangani otentikasi, enkripsi, dan kompresi opsional dengan cara yang transparan untuk klien.

Sekarang, klien Anda adalah aplikasi Java, dan Anda mungkin tidak ingin menjalankan perintah SSH untuk mengatur terowongan. Mudah-mudahan, Anda dapat menggunakan paket Jsch untuk membuka terowongan langsung dari Java. Berikut adalah contoh dengan 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();
    }
 }

Ini berfungsi dengan baik, tetapi harap dicatat ada overhead karena terowongan. Overhead sangat rendah ketika jaringan lambat (Internet misalnya). Pada LAN cepat (1 GbE), ini jauh lebih terlihat:latensi dapat dikalikan hingga 3 saat terowongan digunakan. Throughput maksimum yang dapat dipertahankan server Redis juga terpengaruh. Di sisi server, daemon sshd membutuhkan beberapa CPU (lebih dari Redis itu sendiri).

Meskipun demikian, menurut saya performa mentah tidak terlalu penting untuk aplikasi 2 tingkat.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Gunakan redis untuk membangun obrolan waktu nyata dengan socket.io dan NodeJs

  2. Cara mengatur kedaluwarsa kunci hash di redis sesuai dengan keberadaan kunci

  3. Kegagalan sementara dalam redis resolusi nama

  4. Menjalankan Redis di Travis CI

  5. Bagaimana cara magento memunculkan nama kunci cache?