redis 实例2 构建文章投票网站后端

 

1、限制条件

一、如果网站获得200张支持票,那么这篇文章被设置成有趣的文章

二、如果网站发布的文章中有一定数量被认定为有趣的文章,那么这些文章需要被设置在首页前一百至少一天。

三、不提供反对票功能。

2、程序需要随着时间不断减少评分,根据发布时间和当前时间来计算文章的评分  计算方法:文章得到的支持票数量乘以一个常量,然后加上文章发布时间。Unix时间。常量是432.这样文章没获得一票就可以加432分。

3、需要用redis存储各种数据,对于每篇文章来说,redis需要用一个散列来存储文章的标题,指向文章的网址,发布网文章的用户,文章的发布时间,文章得到的投票数量等信息。hash

4、需要用两个有序集合有序存储文章:第一个有序集合的成员为文章的ID,分值为文章的发布时间。第二个有序集合成员同样是文章的ID,分值是文章的评分。这样网站可以通过文章发布的前后顺序来展现文章也可以通过文章的评分高低展现。zset

5、网站需要对每篇文章记录一个已投票用户的名单来防止同一个用户多次投票。为此文章为每篇文章创建了一个集合,并使用集合存储所有已投票用户的ID。set

6、为了节约内存,规定文章发布满一周后不提供投票功能,文章的评分会被固定下来,而记录文章投票用户的名单也会被删除。

7、程序运行的过程::当用户尝试对一个文章进行投票的时候,程序使用ZSCORE命令检查记录文章发布时间的有序集合,判断发布时间有没有超过一周,如果时间仍出资按可投票的范围之内,那么程序将使用SADD命令,尝试将用户加入到记录文章已投票用户名单的集合里面去,如果添加动作执行成功的话,那么说明用户是第一次对文章进行投票,程序将执行ZINCRBY命令为文章评分增加432分(命令用于对有序集合成员的分值执行自增操作),并使用hincrby命令对散列记录的文章投票数量进行更新(hincrby命令用于对散列存储的值执行自增操作)。

源码是用hiredis实现的,如下:

#include <iostream>
#include<time.h>
#include<sys/timeb.h>
using namespace std;
#include"hiredis/hiredis.h"
#include<QtDebug>
#include<stdlib.h>

class Vote
{
private:
   long long time_last;
   const long long ONE_WEEK_IN_SECONDS = 7 * 86400;
   redisContext *c;
   redisReply *r;
public:

void Connect()
    {
       c = redisConnect("127.0.0.1",6379);
       if(c == NULL||c->err)
       {
           qDebug()<<"connect error:"<<c->errstr;
           redisFree(c);
       }
       else
       {
           cout<<"connect successfully!"<<endl;
       }
    }

void Judge_time(char* zset,char* article,char*user)
    {
        char* l;
        l = (char*)malloc((strlen("zscore ")+strlen(zset)+strlen(" article: ")+strlen(article))*sizeof(char)+1);
        time_last = time(NULL);
        long long cutoff;
        cutoff = time_last-ONE_WEEK_IN_SECONDS;
        strcat(l,"zscore ");
        strcat(l,zset);
        strcat(l," ");
        strcat(l,"article:");
        strcat(l,article);
        r = (redisReply*)redisCommand(c,l);
        free(l);
        if(r->type == REDIS_REPLY_STRING)
        {
            //cout<<r->str<<endl;
            float c = atof(r->str);
            freeReplyObject(r);
            if(c < cutoff)
            {
                Sadd(article,user);
            }
            else
            {
                cout<<"time out !!cannot vote!!"<<endl;
            }
            freeReplyObject(r);
        }
    }

void Sadd(char* article,char* user)
    {
        char* Sadd;
        Sadd = (char*)malloc((strlen("sadd ")+strlen("voted:")+strlen(article)+strlen(user)+strlen(" "))*sizeof(char)+1);
        memset(Sadd,0,20);
        strcat(Sadd,"sadd ");
        strcat(Sadd,"voted:");
        strcat(Sadd,article);
        strcat(Sadd," ");
        strcat(Sadd,user);
        r = (redisReply*)redisCommand(c,Sadd);
        free(Sadd);
        if(r->integer)
        {
            cout<<"vote successfully!"<<endl;
            Zincrby(article);

}
        else
        {
            cout<<"vote more than once.fail voting !!!"<<endl;
        }
    }

void Zincrby(char* article)
   {
       char* Zincrby;
       Zincrby = (char*)malloc((strlen("Zincrby ")+strlen("score ")+strlen("article:")+strlen(article)+strlen(" 432"))*sizeof(char)+1);

memset(Zincrby,0,20);
       strcat(Zincrby,"zincrby ");
       strcat(Zincrby,"score ");
       strcat(Zincrby,"432 ");
       strcat(Zincrby,"article:");
       strcat(Zincrby,article);
       r = (redisReply*)redisCommand(c,Zincrby);
       free(Zincrby);
   }

};

int main()
{
    Vote t;
    t.Connect();
    t.Judge_time("time","100408","13423");

return 0;
}

redis 实例2 构建文章投票网站后端的更多相关文章

  1. 使用Redis构建文章投票网站

    涉及到的key: 1. article_time, 记录文章的发布时间,zset结构 2. article_score, 记录文章的得分, zset结构 得分 = 发布时间 + 投票用户数 X 432 ...

  2. 使用redis构建文章投票系统

    首先,我得说明这篇博客基本上就是<<redis in action>>第一章内容的读书笔记. 需求 首先,说明一下,我们的需求 用户可以发表文章,发表时,自己就默认的给自己的文 ...

  3. Redis in Action 文章投票

    原书用 Python 与 Redis 进行交互,我用 PHP 来实现. 环境:LNMP(CentOS 6.6 + Nginx 1.8.0 + MySQL 5.6.23 + PHP 5.6.9)+ Re ...

  4. Redis实现文章投票功能

    Redis的具体操作这里就不说了,说一下需求和设计思路. 需求:自己实现一个文章投票的功能1.能够按照时间分页倒叙查看文章信息2.能够给文章投票,一个用户给一篇文章只能投票一次3.需要记录分值.每次投 ...

  5. Redis 实战 —— 02. Redis 简单实践 - 文章投票

    需求 功能: P15 发布文章 获取文章 文章分组 投支持票 数值及限制条件 P15 如果一篇文章获得了至少 200 张支持票,那么这篇文章就是一篇有趣的文章 如果这个网站每天有 50 篇有趣的文章, ...

  6. .Net Redis实战——实现文章投票并排序

    本系列文章为学习Redis实战一书记录的随笔. 软件和环境版本:Redis:5.0.7  .Net 5.0 文中不会对Redis基础概念做过多介绍. Redis数据类型和命令可在菜鸟教程学习:http ...

  7. php+redis 简易的实现文章发布系统(用户投票系统)

    /** * @data 文章发布 * 文章详情散列表中递增ID,讲文章发布者ID写入投票用户集合中,设置投票时间为一周 * 讲文章内容写入文章散列中,讲文章写入文章评分有序集合和文章发布有序集合中 * ...

  8. 利用django创建一个投票网站(一)

    这是教程的原始链接:http://django-intro-zh.readthedocs.io/zh_CN/latest/part1/ 创建你的第一个 Django 项目, 第一部分 来跟着实际项目学 ...

  9. Redis 实例排除步骤

    Redis 应用案例 - 在问题中不断成长 原创 2017-02-05 杜亦舒  本文翻译整理自 Andy Grunwald 发布的一篇文章,写的是作者所在公司使用 Redis 时遇到的问题,以及处理 ...

随机推荐

  1. MIT 计算机科学及编程导论 Python 笔记 1

    计算机科学及编程导论在 MIT 的课程编号是 6.00.1,是计算机科学及工程学院的经典课程.之前,课程一直使用 Scheme 作为教学语言,不过由于 Python 简单.易学等原因,近年来已经改用 ...

  2. 在线上服务器上无管理员权限下升级NodeJS版本

    前言 最近发现一个线上机器的问题,是因为node版本过低导致的,线上机器的node版本还是0.x版,遂打算升级node版本. 但是发现常规的npm包的n模块无法使用,提示没有权限创建文件夹,导致nod ...

  3. Apache Storm 1.1.0 发布概览

    写在前面的话 本人长期关注数据挖掘与机器学习相关前沿研究.欢迎和我交流,私人微信:846731084 我自己测试了一下这个版本,总的来说更加稳定,新增的特性并没有一一测试,仅凭kafk-client来 ...

  4. Linux云自动化运维第八课

    第十三单元 软件安装 一.软件名称识别 [abrt-addon-ccpp]-[2.1.11-19].[el7].[x86_64].rpm ###rpm结尾的适用与redhat操作系统 ||       ...

  5. 3.Java日志框架slf4j、jcl、jul、log4j1、log4j2、logback大总结

    一.slf4j.jcl.jul.log4j1.log4j2.logback JUL:JDK中的日志记录工具,也常称为JDKLog.jdk-logging. LOG4J1:一个具体的日志实现框架. LO ...

  6. js全选checkbox框

    html: <input  type="checkbox" id="checkbox1" value="1" onclick=&quo ...

  7. Mac系统-java环境搭建_01

    一.安装jdk 下载地址:http://www.oracle.com/technetwork/Java/javase/downloads/index-jsp-138363.html 1.傻瓜式安装下一 ...

  8. 跟着刚哥梳理java知识点——面向对象(八)

    面向对象的核心概念:类和对象. 类:对一类事物描述,是抽象的.概念上的定义. 对象:实际存在的该类事物的每个个体,因而也成为实例(Instance). Java类及类的成员:属性(成员变量Field) ...

  9. elasticsearch5.3安装插件head

    1.下载并配置nodejscd /usr/local/src/wget https://nodejs.org/dist/v6.9.5/node-v6.9.5-linux-x64.tar.xz & ...

  10. AOP中的ASPECTJ

    一.准备 1.架包 2.配置文件 二.注解的形式 UserDao.java package cn.itcast.spring.aspectj.annocation; public class User ...