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 时遇到的问题,以及处理 ...
随机推荐
- 【PHP实现】高效使用印象笔记之命令行快速保存
一.功能 脑袋中冒出一个想法时,命令行(Terminal)中输入一条命令快速保存到Evernote. 注:这里适用于保存简短的内容 不喜欢听絮叨的,直接文末找Github地址吧. 二.想法来源 一直使 ...
- win10+vs2010+cuda7.5安装及配置
http://blog.csdn.net/u011821462/article/details/50145221 这篇博客已经写得很详细了.
- 5种方法推导Normal Equation
引言: Normal Equation 是最基础的最小二乘方法.在Andrew Ng的课程中给出了矩阵推到形式,本文将重点提供几种推导方式以便于全方位帮助Machine Learning用户学习. N ...
- GWT开端
这篇文章是转载的,原地址:GWT开端 以前的基于GWT的项目中广泛使用的还是gwt-windows-1.5.3这个版本的. 1.下载地址:http://code.google.com/webtoolk ...
- [SinGuLaRiTy] COCI 2011~2012 #2
[SinGuLaRiTy-1008] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 测试题目 对于所有的题目:Time Limit:1s ...
- 【转】Eclipse 如何添加Android SDK
问题描述: 如何为Eclipse编程软件添加Android SDK功能,使其能进行Android开发. 解决方法: 软件版本:Eclipse 3.7,installer_r18-windows.e ...
- CSS基础布局--居中对齐,左侧定宽右侧自适应
CSS页面布局是web前端开发的最基本的技能,本文将介绍一些常见的布局方法,涉及到盒子布局,column布局,flex布局等内容.本文中,你可以看到一些水平垂直居中的方法,左侧固定宽度,右侧自适应的一 ...
- android开发之-数据存储Map、HashMap、Hashtable、concurenthashmap区别
选择一个map进行软件基础数据初始化操作,要求第一次初始化后,不修改数据,可能会出现静态类被回收,然后在进行初始化操作? 1.Map :接口 /** * A {@code Map} is a data ...
- Ecplise 中 加载JDBC 连接 Mysql 数据库读取数据
准备工作 首先下载 JDBC 驱动,下载地址https://www.mysql.com/products/connector/ 将压缩包解压得到文件 mysql-connector-java-5.1. ...
- mui 页面间传值得2种方式
通过最近得工作开发刚接触mui框架,用到了页面间得传值, 第一种:通过url进行传值 父页面代码: mui.openWindow({ id:'子页面.html', url:'子页面.html?para ...