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 时遇到的问题,以及处理 ...
随机推荐
- https单向认证和双向认证区别
关于证书 1.每个人都可以使用一些证书生成工具为自己的站点生成证书(比如jdk的keytool),大家称它为“自签名证书”,但是自己生成的证书是不被互联网承认的,所以浏览器会报安全提示,要求你手动安装 ...
- extern “ C”的含义
见博客:http://www.cnblogs.com/xulei/archive/2006/11/12/558139.html
- android中在java代码中设置Button按钮的背景颜色
android中在java代码中设置Button按钮的背景颜色 1.设置背景图片,图片来源于drawable: flightInfoPanel.setBackgroundDrawable(getRes ...
- calling c++ from golang with swig--windows dll 二
Name mangling && Name demangling 在讲述golang如何利用swig调用windows dll之前,需要了解一个概念:Name Mangling (或者 ...
- Nagios工作原理
图解Nagios的工作原理 Nagios的主动模式和被动模式 被动模式:就如同上图所显示的那样,客户端起nrpe进程,服务端通过check_nrpe插件向客户端发送命令,客户端根据服务端的指示来调用相 ...
- 【C#】组件分享:FormDragger-窗体拖拽器
适用:.net2.0+ winform项目 介绍: 类似QQ.迅雷等讲究UI体验的软件,都支持在窗口内多处地方拖动窗口,而不必老实巴交的去顶部标题栏拖,这个组件就是让winform也能这样随性拖拽,随 ...
- 自适应滤波:最小均方误差滤波器(LMS、NLMS)
作者:桂. 时间:2017-04-02 08:08:31 链接:http://www.cnblogs.com/xingshansi/p/6658203.html 声明:欢迎被转载,不过记得注明出处哦 ...
- QTP自动化测试培训:描述编程之WebElement
QTP自动化测试培训:描述编程之WebElement 通过描述性编程技术,来描述出来输入框: set po=browser("creationtime:=0").page(&q ...
- poj 1721 CARDS (置换群)
题意:给你一个数列,第i号位置的数位a[i],现在将数列进行交换,交换规则为a[i]=a[a[i]]:已知交换s次之后的序列,求原先序列 思路:置换的问题必然存在一个循环节,使一个数列交换n次回到原来 ...
- (iOS)谈谈关于使用category的静态库(原创)
最近在一个项目中使用了一个包含catecategory 的静态库,但是此项目在运行过程中,该静态库调用 category 增加的方法处,却报 selector not recognized 异常,会直 ...