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 构建文章投票网站后端的更多相关文章
- 使用Redis构建文章投票网站
涉及到的key: 1. article_time, 记录文章的发布时间,zset结构 2. article_score, 记录文章的得分, zset结构 得分 = 发布时间 + 投票用户数 X 432 ...
- 使用redis构建文章投票系统
首先,我得说明这篇博客基本上就是<<redis in action>>第一章内容的读书笔记. 需求 首先,说明一下,我们的需求 用户可以发表文章,发表时,自己就默认的给自己的文 ...
- Redis in Action 文章投票
原书用 Python 与 Redis 进行交互,我用 PHP 来实现. 环境:LNMP(CentOS 6.6 + Nginx 1.8.0 + MySQL 5.6.23 + PHP 5.6.9)+ Re ...
- Redis实现文章投票功能
Redis的具体操作这里就不说了,说一下需求和设计思路. 需求:自己实现一个文章投票的功能1.能够按照时间分页倒叙查看文章信息2.能够给文章投票,一个用户给一篇文章只能投票一次3.需要记录分值.每次投 ...
- Redis 实战 —— 02. Redis 简单实践 - 文章投票
需求 功能: P15 发布文章 获取文章 文章分组 投支持票 数值及限制条件 P15 如果一篇文章获得了至少 200 张支持票,那么这篇文章就是一篇有趣的文章 如果这个网站每天有 50 篇有趣的文章, ...
- .Net Redis实战——实现文章投票并排序
本系列文章为学习Redis实战一书记录的随笔. 软件和环境版本:Redis:5.0.7 .Net 5.0 文中不会对Redis基础概念做过多介绍. Redis数据类型和命令可在菜鸟教程学习:http ...
- php+redis 简易的实现文章发布系统(用户投票系统)
/** * @data 文章发布 * 文章详情散列表中递增ID,讲文章发布者ID写入投票用户集合中,设置投票时间为一周 * 讲文章内容写入文章散列中,讲文章写入文章评分有序集合和文章发布有序集合中 * ...
- 利用django创建一个投票网站(一)
这是教程的原始链接:http://django-intro-zh.readthedocs.io/zh_CN/latest/part1/ 创建你的第一个 Django 项目, 第一部分 来跟着实际项目学 ...
- Redis 实例排除步骤
Redis 应用案例 - 在问题中不断成长 原创 2017-02-05 杜亦舒 本文翻译整理自 Andy Grunwald 发布的一篇文章,写的是作者所在公司使用 Redis 时遇到的问题,以及处理 ...
随机推荐
- 解决Chrome动画”卡顿”的办法
为动画DOM元素添加CSS3样式-webkit-transform:transition3d(0,0,0)或-webkit-transform:translateZ(0);,这两个属性都会开启GPU硬 ...
- 【CNMP系列】VIM编辑器详解
缘起 大学的时候做过Linux内核驱动程序研发,之前写C语言就是用的Vim编辑器,当年的Vim还不如今天之强大,当时的插件也没有现在这么多,只是觉得这个编辑器能满足我想要的所有,查看Linux内核代码 ...
- C++移位运算符详解
移位运算符包括左移"<<"和右移">>" 左移运算符<<: 1.无符号 语法格式:需要移位的数字<<移位的次数n ...
- vueJS 获取后台数据 绑定data
//vue 环境安装http://blog.csdn.net/u013182762/article/details/53021374 一开始使用安装环境配置一些东西 ,后来发现太麻烦了 . 直接CD ...
- JS页面打开方式丶对话框及页面跳转方式
一.js页面的三种打开方式 1. window.open 2. window.navigate("url") 跳转到目标页面 3. window.location.href=&qu ...
- 在腾讯云上部署Hexo博客
推荐理由 ----搭建个人的空间博客目前深受个人开发者的追捧,然而博客的种类和平台有很多,Hexo是一个开源的静态博客生成器.相比于其他博客而言它只要是web容器就能用.除了闷头专研技术之外,程序员还 ...
- 函数调用过程&生成器解释
摘自马哥解答,感谢. 函数调用过程: 假设程序是单进程,单执行流,在某一时刻,能运行的程序流只能有一个.但函数调用会打开新的执行上下文,因此,为了确保main函数可以恢复现场,在main函数调用其它函 ...
- iOS9,10没有问题,iOS8上面一登录就崩溃,原因Assets的问题
在项目中开发中,打包成一个ipa的包,发现iOS9,10,运行非常流畅,iOS8上面一运行就崩溃,找了好久,才找到原因竟然是Assets的问题,一开始我把ipa包放在蒲公英上面托管扫码下载的,用iTu ...
- Knockout Mvc Compoment FrameSet
Knockout Mvc Compoment FrameSet 框架文件结构 01- 网站(表现层),mvc主要作用视图展示. 02- 模型(Model),主要作用承载视图数据结构,网站前后台 ...
- 老李分享:Uber究竟是用什么开发语言? 1
老李分享:Uber究竟是用什么开发语言? poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9 ...