基于hiredis的投票系统实现

基于hiredis的投票系统实现

本系统主要实现了简单投票功能,比如:读者给自己喜欢的文章投票,书籍就能得到相应的投票,并且积分也能增长,可以为后续的推荐系统做基础。每一个用户只能投一票,多余的票无效。
对于文章,可以使用散列进行储存,假设有title,votes,scores,published_date四个key:

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对于double类型,直接转换为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)即可。

你可能感兴趣的:(hiredis)