您的位置:首页 > 数据库 > Redis

基于hiredis的投票系统实现

2016-05-04 19:47 661 查看

基于hiredis的投票系统实现

本系统主要实现了简单投票功能,比如:读者给自己喜欢的文章投票,书籍就能得到相应的投票,并且积分也能增长,可以为后续的推荐系统做基础。每一个用户只能投一票,多余的票无效。

对于文章,可以使用散列进行储存,假设有title,votes,scores,published_date四个key:

article:id
titlevotesscorespublished_date
为了实现每个读者只能投一票的限制,需要使用一个集合(SET)来存储已经投票的读者:

voted:article:id
article:idreader
首先,当读者在投票时,需要查看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