用redis实现一个投票(java版)
来源:互联网 发布:mac怎么删除应用程序 编辑:程序博客网 时间:2024/05/22 11:40
代码
import java.util.*;import redis.clients.jedis.Jedis;import redis.clients.jedis.ZParams;public class Vote { private static final int ONE_WEEK_IN_SECONDS = 7 * 86400; private static final int VOTE_SCORE = 432; private static final int ARTICLES_PER_PAGE = 25; public String postArticle(Jedis conn,String user,String title,String link){//发表文章 String articleId=String.valueOf(conn.incr("article:"));//自动匹配一个文章id号 String voted="voted:"+articleId; conn.sadd(voted, user); //表示该用户已为这篇文章投票。 conn.expire(voted, ONE_WEEK_IN_SECONDS);//给这篇文章设定投票期限 long now=System.currentTimeMillis()/1000; String article="article:"+articleId; HashMap<String, String> articleData=new HashMap<>();//对文章的信息进行封装 articleData.put("title",title); articleData.put("link", link); articleData.put("user", user); articleData.put("now", String.valueOf(now)); articleData.put("votes", "1"); articleData.put("againsts", "0"); conn.hmset(article, articleData);//hmset用于同时将多个键值对存储于一个哈希表内 conn.zadd("score:", now+VOTE_SCORE,article);//将文章添加到根据评分排序的有序集合 conn.zadd("time:", now, article);//将文章添加到根据时间排序的有序集合中 return articleId; } public void articleVote(Jedis conn,String user,String article,boolean against){//投票或者投反对票 long cutoff=(System.currentTimeMillis()/1000);// if(conn.zscore("time:", article)+ONE_WEEK_IN_SECONDS<cutoff){//判读文章是否过期 return; } String articleId=article.substring(article.indexOf(":")+1); if(against){ //投反对票 if(conn.sadd("against:"+articleId, user)==1){ conn.hincrBy(article, "against", 1); //给反对票数组自增1 } } else if(conn.sadd("voted:"+articleId, user)==1){//判读该用户是否对这篇文章投过票 conn.zincrby("score:", VOTE_SCORE, article);//为score:表中的article自增分数 conn.hincrBy(article, "votes", 1);//为article:表中"votes"自增1 } } public void addGroups(Jedis conn,String articleId,String[] toAdd){ String article="article:"+articleId; for(String group:toAdd){ conn.sadd("group:"+group, article); } } public void removeGroups(Jedis conn,String articleId,String[] toRemove){ String article="article:"+articleId; for(String group:toRemove){ conn.srem("group:"+group, article); } } public List<Map<String, String>> getArticles(Jedis conn,int page){ return getArticles(conn, page, "score:"); } public List<Map<String, String>> getArticles(Jedis conn,int page,String order){//根据页数和排序方式返回所有文章 int start=(page-1)*ARTICLES_PER_PAGE; int end=start+ARTICLES_PER_PAGE-1; Set<String> ids=conn.zrevrange(order, start, end);//获取从大到小的顺序的集合 List<Map<String, String>> articles=new ArrayList<>(); for(String id:ids){ Map<String, String> articleData=conn.hgetAll(id); articleData.put("id", id); articles.add(articleData); } return articles; } public List<Map<String, String>> getGroupArticles(Jedis conn,String group,int page){ return getGroupArticles(conn, group, page, "score:"); } public List<Map<String, String>> getGroupArticles(Jedis conn,String group,int page,String order){ String key=order+group; if(!conn.exists(key)){ ZParams params=new ZParams().aggregate(ZParams.Aggregate.MAX); conn.zinterstore(key, params,"group:"+group,order); conn.expire(key, 60); } return getArticles(conn, page, key); } private void printArticles(List<Map<String, String>> articles){ for(Map<String, String> article:articles){ System.out.println(" id: "+article.get("id")); for(Map.Entry<String, String> entry:article.entrySet()){ if(entry.getKey().equals("id")) continue; System.out.println(" "+entry.getKey()+": "+entry.getValue()); } } }}
阅读全文
0 0
- 用redis实现一个投票(java版)
- ZendFrame实现一个投票模块
- 用JSP+Javabean+Servlet实现一个投票系统
- 用JSP+Javabean+Servlet实现一个投票系统
- 一个微信投票系统的投票限制实现
- Java投票代码界面版
- Redis系列-JAVA与redis整合-Spring Data Redis实现一个订阅/发布系统
- JSP+MySql实现的一个简单投票系统
- JSP+MySql实现的一个简单投票系统
- 一个实现不记名投票的小程序
- 一个Redis Cache实现
- 用cookies实现防止重复投票
- 用linux的curl实现自动投票
- 投票系统原代码(JSP实现)
- 投票系统原代码(JSP实现)
- Androd 实现投票的功能(问卷调查)
- 求一个网上投票系统的JSP java 文件
- redis投票系统--学习准备
- mysql.service failed because the control process exited with error code问题
- PAT乙级 1055. 集体照 (25)
- Android Base64处理数据
- 以博客系统为例的数据库分析与设计之设计篇1
- Python探索记(04)——运算符
- 用redis实现一个投票(java版)
- 毕设系列之Linux V4L2(图形图像采集篇)
- bzoj[1855] [Scoi2010]股票交易 ,[2826]Minecraft的世界末日
- Android Base64Encoder
- VB.net计算二维数组的行列式
- Python数据分析——基于CART决策树的用户识别
- jQuery页面加载初始化的3种方法
- Atcoder ARC 077 D
- 动态规划:硬币凑值