복붙노트

[REDIS] (클라이언트 측) 자바 스크립트와 레디 스에 직접 연결?

REDIS

(클라이언트 측) 자바 스크립트와 레디 스에 직접 연결?

직접 클라이언트 측 (하지 Node.js를) 자바 스크립트를 사용하여 레디 스에 연결하는 방법이 있나요?

나는 이미 몇 가지 프로젝트를 성공적으로 Node.js를 + PHP + (클라이언트 용) 레디 스 + Socket.io를 사용하고 있습니다. 가 필요하지 않은 경우 오히려 사용하지 않는 게 좋을 또 다른 서버 인 Node.js를 서버를 복용 - 그러나, 나는 정말이 더 PHP + 레디 스 + 브라우저의 자바 스크립트 같은 것으로 간단하게 할 수 있다고 생각. 간단한 일을 위해, 나는 그것이 더 좋을 것이다 단지 자바 스크립트를 사용하여 레디 스에 직접 연결할 생각합니다.

해당 포트에 요청을 할 수있는 언어가 작동 할 수 있도록 내가 이해에서, 레디 스 그냥 포트를 통해 그 요청을 제공합니다. 이론적으로, 당신은 단지 클라이언트 측 자바 스크립트를 사용하여 레디 스 서버의 포트를 칠 수 없었다?

나는 대부분 또는 가능하지 않을 수 있습니다 발행 / 구독 기능에 관심이 있어요.

당신이 AJAX를 사용하여 비 포트 80 포트에 액세스 할 수 있는지 확실하지 않습니다,하지만 당신은 기술적으로 Nginx에 리버스 프록시 또는 무언가를 사용하여 포트 80 레디 스 '포트를 전달 할 수 있어야한다.

어떤 아이디어? 그냥 생각했다. 나는 나의 현재 솔루션에 매우 만족 해요,하지만 우리가 더 나은 또는 더 효율적으로이 작업을 수행 할 수 있다면 그것은 경이로 다치게하지 않습니다.

해결법

  1. ==============================

    1.당신은, 일부 브라우저에서 WebSocket을을 클라이언트 측 자바 스크립트로 HTTP 요청을 할 수 있습니다. 그러나 Webdis에 보일 것입니다. 그것은 레디 스에 쉽게 HTTP / JSON 레이어를 추가하고 정확하게 당신이 원하는 일을해야한다.

    당신은, 일부 브라우저에서 WebSocket을을 클라이언트 측 자바 스크립트로 HTTP 요청을 할 수 있습니다. 그러나 Webdis에 보일 것입니다. 그것은 레디 스에 쉽게 HTTP / JSON 레이어를 추가하고 정확하게 당신이 원하는 일을해야한다.

    편집 : 링크 고정.

  2. ==============================

    2.진짜 장애물은 브라우저에서 아약스 요청에 대한 비 포트 80/443 한계를 극복한다; 심지어 Webdis 솔루션, 그것은가 기본으로, t으로 포트 7379 떨어져 실행하고 아파치 또는 Nginx의 프로세스와 충돌 때문에 경우 포트 80 도망.

    진짜 장애물은 브라우저에서 아약스 요청에 대한 비 포트 80/443 한계를 극복한다; 심지어 Webdis 솔루션, 그것은가 기본으로, t으로 포트 7379 떨어져 실행하고 아파치 또는 Nginx의 프로세스와 충돌 때문에 경우 포트 80 도망.

    내 조언은 webdis 프로세스에 지점으로의 nginx proxy_pass을 사용하는 것입니다. 당신은 포트 80 트래픽을 리디렉션하고 성가신 보안 문제없이 아약스 요청을 수행 할 수 있습니다.

    다음은 나를 위해 트릭을 할 것 같다 샘플의 nginx 구성이다.

    upstream WebdisServerPool 
    {
        server 127.0.0.1:7379; #webdis server1
        server 192.168.1.1:7379; #webdis server 2
    }
    
    
    server {
    
        listen   80; #
        root /path/to/my/php/code/;
        index index.php;
        server_name yourServerName.com;
    
        location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
                expires max;
                log_not_found off;
        }
    
        location / {
                # Check if a file exists, or route it to index.php.
                try_files $uri $uri/ /index.php;
        }
    
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME /path/to/my/php/code/$fastcgi_script_name;
    
        }
    
        location /redis {
    
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                rewrite /(.*)/(.*)/(.*)$ /$2/$3 break; #ignore the /redis
                 proxy_redirect off;
                proxy_pass http://webdisServerPool;
        }
    }
    

    프런트 엔드 측면에서, 여기에 모든 키를 얻기의 예입니다. 모든 예를 들어 레디 스 / 요청을 통해 갈 것 레디 스 :

    $.ajax({ 
            url: "/redis/KEYS/*", 
            method: 'GET', 
            dataType: 'json', 
            success:function(data)
            {
                $each(data.KEYS,function(key,value){            
                    $('body').append(key+"=>"+value+" <br> ");
                });
            }
    });
    

    또는

    당신은 사용할 수 있습니다 :

    http://wiki.nginx.org/HttpRedis하고 응답을 직접 구문 분석합니다.

  3. ==============================

    3.내가 직접 레디 스 HTTP 인터페이스 술집 / 서브와 아주 잘 작동 또는 (작성 당시에)를 설정하기가 어렵하지 않는 것으로 나타났습니다.

    내가 직접 레디 스 HTTP 인터페이스 술집 / 서브와 아주 잘 작동 또는 (작성 당시에)를 설정하기가 어렵하지 않는 것으로 나타났습니다.

    여기에 predis 예에 따라 술집 / 하위 내 "해결 방법"입니다.

    http://bradleygoldsmith.tumblr.com/post/35601539836/quick-and-dirty-redis-subscribe-publish-notifications

  4. ==============================

    4.나는 미리 정의 된 레디 스 접근에서 PHP의 무리가 있고, 나는 jQuery로 $ .post 요청을 통해 클라이언트에서 사용할 수있는 '라우터'스타일 기능을 사용하십시오. 라우터는 단지 하나의 큰 스위치입니다 :

    나는 미리 정의 된 레디 스 접근에서 PHP의 무리가 있고, 나는 jQuery로 $ .post 요청을 통해 클라이언트에서 사용할 수있는 '라우터'스타일 기능을 사용하십시오. 라우터는 단지 하나의 큰 스위치입니다 :

     public function router() {
    $response = array();
    switch ($_POST['method']) {
    case 'get_whole_list': //is a convenience function with arg $list_key
      if ($_POST['list_key']) {//which will be provided by the POST request data
    $response = $this->get_whole_list($_POST['list_key']);
    break;
      } else {
    $response = (array('error' => 'must be passed with post key "list_key"'));
    break;
      } //and so on, until
    
    //it's time to send the response: 
    return json_encode(array('response' => $response));
    }
    

    그리고 당신은 단지) ($ myClass-> 라우터 에코

    내가 좋아하는 jQuery를 함께 액세스 :

    redgets.get_whole_list = function(key, callback) {
        $.post(redgets.router, //points to my php file
           {method: 'get_whole_list', //tells it what to do
           list_key: key}, //provides the required args
           function(data) {
               callback($.parseJSON(data).response); //parses the response
           });
    

    이 모든 벌금을 작동; 어쩌면 좋지 않은, 그러나 그것은 Node.js를 서버 중복을한다. 나는 아무도 이미이 스타일 범용 레디 스 인터페이스를하지 것을 놀라게하고있다.

  5. from https://stackoverflow.com/questions/6311984/connecting-directly-to-redis-with-client-side-javascript by cc-by-sa and MIT license