Windows/C++ Redis 설치

게임 서버 프로그래밍

2020. 9. 15. 22:18

우욱 이거하다가 토할뻔 했습니다.

뭐 이렇게 복잡한지 모르겠네요 ㅠㅠ..

일단 제가 까먹지않기 위해서 포스팅 하겠습니다.

 

1. Redis 설치

github.com/microsoftarchive/redis/releases

 

Releases · microsoftarchive/redis

Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis

github.com

최신 버젼 다운 받으시면 됩니다.

 

2. Cmake/hiredis 설치

cmake

cmake.org/download/

 

Download | CMake

Current development distribution Each night binaries are created as part of the testing process. Other than passing all of the tests in CMake, this version of CMake should not be expected to work in a production environment. It is being produced so that us

cmake.org

빨간색 친 것을 다운 받아 주세요!

 

hiredis

github.com/Microsoft/hiredis

 

microsoft/hiredis

Minimalistic C client for Redis >= 1.2. Contribute to microsoft/hiredis development by creating an account on GitHub.

github.com

3. hiredis Make

 

빨간색 박스에 hiredis 다운 후 압축을 푼 폴더의 경로를 넣어줍니다.

파란색 박스에는 make된 파일들이 담길 임시 폴더를 만들어 넣어줍니다.

그러고나서 Configure->Generate를 차례로 눌러줍니다.

 

지정해둔 임시 폴더에 다음과 같이 Sln 파일들이 보일거에요.

 

hiredis 솔루션을 열어 줍시다.

 

Debug/Release 두 버젼으로 빌드 해 준다.

 

 

각각 dll/lib 파일을 빼내서 redis를 사용할 프로젝트로 옮긴다.

주의할 점은 dll 파일 같은 경우에 프로젝트 실행 파일과 경로가 같아야 한다!

 

그리고 프로젝트에서 lib/dll 설정 및 src 폴더 설정을 해준다.

 

경우에따라서 Release/Debug dll을 따로 설정도 해주어야 할 것 같지만.. 

기회가 되면 다음에 한 번 해봐야겠습니다..

 

추가 포함 디렉터리에 아까 임시로 만들어둔 redis 폴더 경로를 넣어줍니다.

저는 redis를 사용할 프로젝트의 하위에 폴더를 옮겨두었습니다.

 

추가 라이브러리 디렉터리는 Make 결과로 생긴 lib 파일의 경로로 지정해줍니다.

저는 따로 lib 폴더를 프로젝트 하위에 생성하여 거기에 넣어두었습니다.

 

마지막으로 추가 종속성에 hiredis.lib를 넣으면 끝..

아래는 테스트 할 example 코드입니다.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis.h>

#ifdef _MSC_VER
#include <winsock2.h> /* For struct timeval */
#endif

int main(int argc, char** argv) {
	unsigned int j, isunix = 0;
	redisContext* c;
	redisReply* reply;
	const char* hostname = (argc > 1) ? argv[1] : "127.0.0.1";

	if (argc > 2) {
		if (*argv[2] == 'u' || *argv[2] == 'U') {
			isunix = 1;
			/* in this case, host is the path to the unix socket */
			printf("Will connect to unix socket @%s\n", hostname);
		}
	}

	int port = (argc > 2) ? atoi(argv[2]) : 6379;

	struct timeval timeout = { 1, 500000 }; // 1.5 seconds
	if (isunix) {
		c = redisConnectUnixWithTimeout(hostname, timeout);
	}
	else {
		c = redisConnectWithTimeout(hostname, port, timeout);
	}
	if (c == NULL || c->err) {
		if (c) {
			printf("Connection error: %s\n", c->errstr);
			redisFree(c);
		}
		else {
			printf("Connection error: can't allocate redis context\n");
		}
		exit(1);
	}

	/* PING server */
	reply = (redisReply*)redisCommand(c, "PING");
	printf("PING: %s\n", reply->str);
	freeReplyObject(reply);

	/* Set a key */
	reply = (redisReply*)redisCommand(c, "SET %s %s", "foo", "hello world");
	printf("SET: %s\n", reply->str);
	freeReplyObject(reply);

	/* Set a key using binary safe API */
	reply = (redisReply*)redisCommand(c, "SET %b %b", "bar", (size_t)3, "hello", (size_t)5);
	printf("SET (binary API): %s\n", reply->str);
	freeReplyObject(reply);

	/* Try a GET and two INCR */
	reply = (redisReply*)redisCommand(c, "GET foo");
	printf("GET foo: %s\n", reply->str);
	freeReplyObject(reply);

	reply = (redisReply*)redisCommand(c, "INCR counter");
	printf("INCR counter: %lld\n", reply->integer);
	freeReplyObject(reply);
	/* again ... */
	reply = (redisReply*)redisCommand(c, "INCR counter");
	printf("INCR counter: %lld\n", reply->integer);
	freeReplyObject(reply);

	/* Create a list of numbers, from 0 to 9 */
	reply = (redisReply*)redisCommand(c, "DEL mylist");
	freeReplyObject(reply);
	for (j = 0; j < 10; j++) {
		char buf[64];

		snprintf(buf, 64, "%u", j);
		reply = (redisReply*)redisCommand(c, "LPUSH mylist element-%s", buf);
		freeReplyObject(reply);
	}

	/* Let's check what we have inside the list */
	reply = (redisReply*)redisCommand(c, "LRANGE mylist 0 -1");
	if (reply->type == REDIS_REPLY_ARRAY) {
		for (j = 0; j < reply->elements; j++) {
			printf("%u) %s\n", j, reply->element[j]->str);
		}
	}
	freeReplyObject(reply);

	/* Disconnects and frees the context */
	redisFree(c);

	return 0;
}

 

결과

 

 

환경설정도 굉장히 복잡하네요.. 옆동네는 그냥 명령어 몇번에 끝나던데 ㅋㅋ..

아직 문법도 라이브러리 함수들도 잘 몰라서 그냥 예제 코드 긁어와서 확인만 했습니다.

hiredis 라이브러리 뿐만 아니라 다양하게 라이브러리가 존재하며

hiredis에 추가적인 라이브러리도 존재하더라구요.. 

일단은.. 내일이나 모레 여유가 생기면 데이터 read/write 정도만 끄적여 봐야겠습니다.

 

'게임 서버 프로그래밍' 카테고리의 다른 글

RedisManager  (0) 2020.09.16