hiredis 기반 투표 시스템 구현

3457 단어 hiredis
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)하면 된다.

좋은 웹페이지 즐겨찾기