- 본서버에서 처리하는 데이터때문에 무거워진 메모리를 가볍게 덜어주기 위해 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"; $totalList= array(); 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로 옮기는 작업이 필요하다.
'PROGRAMMING > Javascript,PHP' 카테고리의 다른 글
[JQUERY] 상위 tr의 이벤트를 한개 td에서는 제외시키기 (2) | 2019.07.15 |
---|---|
[Javascript]FileReader 같은 데이터 연속으로 올리기 (1) | 2019.03.13 |
[Javascript]for문 안에 setInterval(+clearInterval) 쓰기 (0) | 2019.02.12 |