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 时遇到的问题,以及处理 ...
随机推荐
- apply()
apply() 1.apply和call的区别在哪里 2.什么情况下用apply,什么情况下用call 3.apply的其他巧妙用法(一般在什么情况下可以使用apply) apply:方法能劫持另外一 ...
- 关于Trie KMP AC自动机
个人认为trie,KMP,AC自动机是思想非常明确的,AC自动机的性质是与KMP算法的思想类似的(失配后跳转) 而KMP是线性的,AC自动机是在tire树上跑KMP,为方便那些不会用指针的小朋友(我也 ...
- ad_封装_ads828
module ad_ctrl( clk,rst_n,ad_clk, ad_data,value_x,value_y,q_sig,wren,r_addr,w_addr ); input clk; inp ...
- iOS开发之视频播放
1.如何播放视频 iOS提供了MPMoviePlayerController.MPMoviePlayerViewController两个类,可以用来轻松播放视频和网络流媒体\网络音频. 提示:网络音频 ...
- 使用Python对Access读写操作
学习Python的过程中,我们会遇到Access的读写问题,这时我们可以利用win32.client模块的COM组件访问功能,通过ADODB操作Access的文件. 1.导入模块 import win ...
- 将ROS中的/sensor_msgs/NavSatFix数据导入google earth显示轨迹
将ros中的gps_msg数据导入google earth显示轨迹 [TOC] 1. 获取GPS数据 将ros中发布的gps topic输出到文本中 rostopic echo -p /gpsData ...
- 手机自动化测试:搭建appium手机自动化测试开发环境
手机自动化测试:搭建appium手机自动化测试开发环境 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大 ...
- 测试开发Python培训:实现屌丝的图片收藏愿望(小插曲)
测试开发Python培训:实现屌丝的图片收藏愿望(小插曲) 男学员在学习python的自动化过程中对于爬虫很感兴趣,有些学员就想能收藏一些图片,供自己欣赏.作为讲师只能是满足愿望,帮助大家实现对美的追 ...
- JAVA加密算法系列-DESCoder
package ***; import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher ...
- POST与GET
面试如果被问到这个问题,相信很多人都是会心一笑,答案随口而来: 1.GET在浏览器回退时是无害的,而POST会再次提交请求. 2.GET请求会被浏览器主动cache,而POST不会,除非手动设置. 3 ...