C++
[Redis] 새로 추가한 mysql 명령어로 db 연동
POWERUMC
2014. 4. 21. 00:45
데이터베이스로 데이터를 조회하는 데, 성능을 꾀하기 위해 redis와 연동을 한다. 신규 기능에 적용하는 것은 어렵지 않을 것 같다. 하지만 기존 legacy 코드를 db에서 redis로 변경 한다면 새로운 전략이 필요할 것이다.
이런 경우가 얼마나 많겠냐마는 때때로 미션 크리티컬한 시스템 문제가 발생하면 한 번쯤 고려해 볼 만한 시나리오다.
db에서 redis로 변경한다면
- redis client 코드로 db 데이터를 조회하고 redis 데이터를 조회하여 결과 셋을 조합
- proxy 객체를 생성하여 db/redis 중 데이터 조회
- redis 명령 추가
위의 몇 가지 전략 중 성능이 가장 좋은 것은 3 > 2 > 1 이 될 것이고, 수정해야 할 legacy 코드의 양은 2 > 3> 1 순서가 될 것이라 짐작된다.
필자는 prototyping으로 redis 명령을 추가하는 방법을 구현해 보았다.
이름하여 ’MyRedis’라고 이름을 붙였고, 필자의 github 저장소에 commit 해 놓았다..
MyRedis
기존 Redis에서 ‘mysql’ 명령을 추가하였고, 이 명령은 mysql 데이터베이스에서 query 결과를 반환한다.
테스트로 'temp_table'
테이블을 생성하여 다음과 같은 데이터를 넣었다.
id | username | age |
---|---|---|
1 | Junil Um | 25 |
2 | Coupang | 3 |
3 | POWERUMC | 35 |
아래는 MyRedis로 ‘mysql’ 명령을 이용하여 데이터베이스에서 결과를 조회하는 redis-cli 결과 화면이다.
127.0.0.1:6379> mysql "select * from temp_table"
1) "1"
2) "Junil Um"
3) "25"
4) "2"
5) "Coupang"
6) "3"
7) "3"
8) "POWERUMC"
9) "35"
아직 구현 못한 부분이 있으나 더 구현한다면 이런 모습이 되지 않을까 한다.
127.0.0.1:6379> set mysql.host "localhost"
127.0.0.1:6379> set mysql.user "umc"
127.0.0.1:6379> set mysql.password "!@#$%"
127.0.0.1:6379> set mysql.db "db_name"
127.0.0.1:6379> mysql query dbresult 3600 "select * from temp_table;" # key expired query
127.0.0.1:6379> mysql lock
127.0.0.1:6379> mysql query "update temp_table set age=1 where ...생략..."
127.0.0.1:6379> mysql unlock