hiredis 기반 투표 시스템 구현
3457 단어 hiredis
이 시스템은 주로 간단한 투표 기능을 실현했다. 예를 들어 독자가 자신이 좋아하는 글에 투표하면 책은 상응하는 투표를 받을 수 있고 포인트도 증가하여 후속 추천 시스템에 기반을 다질 수 있다.모든 사용자는 한 표만 투표할 수 있고, 남은 표는 무효다.문장에 대해 산열을 사용하여 저장할 수 있으며, title,votes,scores,published 가 있다고 가정하면date 4키:
article:id
title
votes
scores
published_date
모든 독자가 한 표만 투표할 수 있는 제한을 실현하기 위해서는 이미 투표한 독자를 하나의 집합(SET)으로 저장해야 한다.
voted:article:id
article:id
reader
우선, 독자가 투표할 때voted:article:id 집합을 보고 이 독자가 이미 투표했는지 확인해야 한다.
char *command = (char*)malloc(sizeof(char)*256);
sprintf(command,"SMEMBERS voted:%s",article:id);
redisReply *reply = (redisReply*)redisCommand(conn,command);
int size = reply->elements; //
int i = 0;
while(i<size)
{
redisReply r = reply->element[i++][0];
if(!strcmp(reader,r.str))// ,
{
break;
}
else
{
if(i!=size)
continue;
else // ,
{
//
}
}
}
독자가 표를 던진 후, 산열article:id에 저장된votes와scores의 값은 모두 바뀌어야 하고,Redis는 더블 형식에 대해 sds 형식으로 직접 전환하여 조작하고,votes의 형식은 int로 코드량을 줄이기 위해 같은 함수로votes와scores의 값을 가져옵니다.
char* findValue(redisContext *conn, char *article, char *key)
{
char *command = (char*)malloc(sizeof(char)*256);
sprinf(command,"HGET %s %s",article,key);
redisReply *reply = redisCommand(conn,command);
if(reply->type==REDIS_REPLY_STRING)
return reply->str;
else if(reply->type==REDIS_REPLY_INTEGER) // ,
{
char *str = (char*)malloc(sizeof(char)*999999);
sprintf(str,"%l",reply->integer);
return str;
}
}
투표 부분만 간단해 투표한 이용자(SADD)를 집합에 넣고, votes는 증가(HINCRBY), scores는 증가(HSET)하면 된다.