본문 바로가기

PROGRAMMING/Javascript,PHP

[REDIS] phpredis 로 key, value를 set/get 하기

  • 본서버에서 처리하는 데이터때문에 무거워진 메모리를 가볍게 덜어주기 위해 redis에 데이터를 넣고 빼기로 함
  • 본서버와 redis 서버는 물리적으로 분리된 곳에 위치시키기로 함
  • redis를 서버에 설치하고(Ubuntu16.04) php에서 접근하기 위해 phpredis 라이브러리도 설치

  phpredis 사용하기


프로세스 구상도
  • 본 서버에서 REDIS로 데이터를 주고 받는 창구 역할을 하는 함수가 들어있는 객체 파일을 생성
  • key와 value(소스코드에선 fragment)를 ajax로 REDIS 서버의 php 파일에 연결 

  소스 코드 - Javascript(ajax, 본서버)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
var REDIS = {
    setDataFragment: function(key,fragment){
        var formData=new FormData();
        formData.append("redis","setGridFragment"); //php POST 처리 구분
        formData.append("key",String(key)); //redis 처리 기본 data type : string,list,hash
        formData.append("fragment",String(fragment)); 
 
        var html ="";
 
        $.ajax({
            type:"POST",
            url:"url",
            data:formData,
            processData:false,
            contentType:false,
            success:function(data){
                //success function
                console.log("success");
            },
            error:function(){
                //error function
                console.log("error");
            }
        });
    },
    getDataFragment: function(key,fragment){
        var formData=new FormData();
        formData.append("redis","getGridFragment");
        formData.append("key",key);
        formData.append("fragment",fragment);
 
        var html ="";
 
        $.ajax({
            type:"POST",
            url:"url",
            data:formData,
            processData:false,
            contentType:false,
            success:function(data){
                //success function
                console.log("success");
            },
            error:function(){
                //error function
                console.log("error");
            }
        });
    }
}
 
cs


  • setDataFragment() : 엔진에서 넘어오는 의미있는 최소 기준의 데이터를 넘겨받아 REDIS 서버로 보내는 역할
  • getDataFragment() : 엔진에서의 마지막 데이터가 넘어오면 모든 데이터를 받아오는 역할

  소스 코드 - Javascript(event, 본서버)


1
2
3
4
5
6
7
8
9
10
11
12
...
_canvas.addEventListener("eventRedisData",function(e){
    if (e.flag == false){
        REDIS.setGridFragment(String(GRID.gridRedisKey),e.result);
        REDIS.getGridFragment();
        GRID.gridRedisKey = 0;
        return;
    }
    REDIS.setGridFragment(String(GRID.gridRedisKey),e.result);
    GRID.gridRedisKey++;
});
...
cs
  • 이벤트가 발생할때마다 엔진에서 넘겨주는 flag값을 검사해 마지막 flag(false)라면 REDIS 서버에서 데이터를 몽땅 가져올수 있도록 한다.

  소스 코드 - PHP(REDIS 서버)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
header("Access-Control-Allow-Origin: *");
 
$redis_host = "127.0.0.1";
$redis_port = 6379;
 
$resultData = array();
$resultData['resultCode'= "FAIL";
 
$totalListarray();
 
try {
    $redis = new Redis();
    $redis->connect($redis_host$redis_port);
    if($_POST['redis']=="setGridFragment"){
        $key = $_POST['key']; //키분류는 :(콜론)을 찍는게 일반적
        echo $key;
        $value = $_POST['fragment'];
        $redis -> set($key$value);
        $resultData['resultCode'= "SUCCESS";
    }else if($_POST['redis']=="getGridFragment"){
        $list = $redis->keys("*");
 
        //Optional: Sort Keys alphabetically
        sort($list);
        //Loop through list of keys
        foreach ($list as $key)
        {
            //Get Value of Key from Redis
            $value = $redis->get($key);
            $termList = explode(' '$value);
            
            for($i=1;$i<count($termList);$i++){
                $temp = explode(','$termList[$i]);
                $totalList[$i-1][0+= (int)$temp[0];
                $totalList[$i-1][1] .= $temp[1];
            }
        }
        $resultData['totalList'= $totalList;
        $resultData['resultCode'= "SUCCESS";
        $redis->flushAll(); //redis 비우기
    }
 
} catch(Exception $e) {
    die($e->getMessage());
}
 
echo json_encode($resultData);
?>
 
cs


  • setGridFragment 조건 만족시 REDIS 서버에 차곡차곡 저장한다(?).
  • getGridFragment 조건 만족시 REDIS 서버가 들고 있던 데이터를 key값 순서대로(25번line) 불러와 필요한 연산을 하고(33번line) 결과 변수에 담은뒤 redis 메모리를 비운다(41번line)


  결과

  • 엔진<->웹에서 바로 처리하는 방법보다 훨씬 속도가 빨라졌다.
  • 이 부분을 구현하면서 javascript Array가 들고 있을수 있는 용량에 대해 알아봤는데 약 500mb 정도, 크롬에서 들고 있을 수 있는 데이터 용량은 700mb 정도
  • local에서 돌아가게 해야된대서.. 나중에 local실행이 확정되면 REDIS서버를 windows로 옮기는 작업이 필요하다.