redis-投票

  1 package redis.inaction;
  2 
  3 import redis.clients.jedis.Jedis;
  4 import redis.clients.jedis.ZParams;
  5 
  6 import java.util.*;
  7 
  8 public class Chapter01 {
  9     private static final int ONE_WEEK_IN_SECONDS = 7 * 86400;
 10     private static final int VOTE_SCORE = 432;
 11     private static final int ARTICLES_PER_PAGE = 25;
 12 
 13     public static final void main(String[] args) {
 14         new Chapter01().run();
 15     }
 16 
 17     public void run() {
 18         Jedis conn = new Jedis("192.168.7.146",6379);
 19         conn.select(15);
 20         conn.flushAll();
 21         String articleId = postArticle(
 22             conn, "username", "A title", "http://www.google.com");
 23         System.out.println("We posted a new article with id: " + articleId);
 24         System.out.println("Its HASH looks like:");
 25         Map<String,String> articleData = conn.hgetAll("article:" + articleId);
 26         for (Map.Entry<String,String> entry : articleData.entrySet()){
 27             System.out.println("  " + entry.getKey() + ": " + entry.getValue());
 28         }
 29 
 30         System.out.println();
 31 
 32         articleVote(conn, "other_user", "article:" + articleId);
 33         String votes = conn.hget("article:" + articleId, "votes");
 34         System.out.println("We voted for the article, it now has votes: " + votes);
 35         assert Integer.parseInt(votes) > 1;
 36 
 37         System.out.println("The currently highest-scoring articles are:");
 38         List<Map<String,String>> articles = getArticles(conn, 1);
 39         printArticles(articles);
 40         assert articles.size() >= 1;
 41 
 42         addGroups(conn, articleId, new String[]{"new-group"});
 43         System.out.println("We added the article to a new group, other articles include:");
 44         articles = getGroupArticles(conn, "new-group", 1);
 45         printArticles(articles);
 46         assert articles.size() >= 1;
 47     }
 48 
 49     public String postArticle(Jedis conn, String user, String title, String link) {
 50         String articleId = String.valueOf(conn.incr("article:"));
 51 
 52         String voted = "voted:" + articleId;
 53         conn.sadd(voted, user);
 54         conn.expire(voted, ONE_WEEK_IN_SECONDS);
 55 
 56         long now = System.currentTimeMillis() / 1000;
 57         String article = "article:" + articleId;
 58         HashMap<String,String> articleData = new HashMap<String,String>();
 59         articleData.put("title", title);
 60         articleData.put("link", link);
 61         articleData.put("user", user);
 62         articleData.put("now", String.valueOf(now));
 63         articleData.put("votes", "1");
 64         conn.hmset(article, articleData);
 65         conn.zadd("score:", now + VOTE_SCORE, article);
 66         conn.zadd("time:", now, article);
 67 
 68         return articleId;
 69     }
 70 
 71     public void articleVote(Jedis conn, String user, String article) {
 72         long cutoff = (System.currentTimeMillis() / 1000) - ONE_WEEK_IN_SECONDS;
 73         if (conn.zscore("time:", article) < cutoff){
 74             return;
 75         }
 76 
 77         String articleId = article.substring(article.indexOf(':') + 1);
 78         if (conn.sadd("voted:" + articleId, user) == 1) {
 79             conn.zincrby("score:", VOTE_SCORE, article);
 80             conn.hincrBy(article, "votes", 1);
 81         }
 82     }
 83 
 84 
 85     public List<Map<String,String>> getArticles(Jedis conn, int page) {
 86         return getArticles(conn, page, "score:");
 87     }
 88 
 89     public List<Map<String,String>> getArticles(Jedis conn, int page, String order) {
 90          int start = (page - 1) * ARTICLES_PER_PAGE;
 91         int end = start + ARTICLES_PER_PAGE - 1;
 92 
 93         Set<String> ids = conn.zrevrange(order, start, end);
 94         List<Map<String,String>> articles = new ArrayList<Map<String,String>>();
 95         for (String id : ids){
 96             Map<String,String> articleData = conn.hgetAll(id);
 97             articleData.put("id", id);
 98             articles.add(articleData);
 99         }
100 
101         return articles;
102     }
103 
104     public void addGroups(Jedis conn, String articleId, String[] toAdd) {
105         String article = "article:" + articleId;
106         for (String group : toAdd) {
107             conn.sadd("group:" + group, article);
108         }
109     }
110 
111     public List<Map<String,String>> getGroupArticles(Jedis conn, String group, int page) {
112         return getGroupArticles(conn, group, page, "score:");
113     }
114 
115     public List<Map<String,String>> getGroupArticles(Jedis conn, String group, int page, String order) {
116         String key = order + group;
117         if (!conn.exists(key)) {
118             ZParams params = new ZParams().aggregate(ZParams.Aggregate.MAX);
119             conn.zinterstore(key, params, "group:" + group, order);
120             conn.expire(key, 60);
121         }
122         return getArticles(conn, page, key);
123     }
124 
125     private void printArticles(List<Map<String,String>> articles){
126         for (Map<String,String> article : articles){
127             System.out.println("  id: " + article.get("id"));
128             for (Map.Entry<String,String> entry : article.entrySet()){
129                 if (entry.getKey().equals("id")){
130                     continue;
131                 }
132                 System.out.println("    " + entry.getKey() + ": " + entry.getValue());
133             }
134         }
135     }
136 }

package redis.inaction;
import redis.clients.jedis.Jedis;import redis.clients.jedis.ZParams;
import java.util.*;
public class Chapter01 {    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 static final void main(String[] args) {        new Chapter01().run();    }
    public void run() {        Jedis conn = new Jedis("192.168.7.146",6379);        conn.select(15);        conn.flushAll();        String articleId = postArticle(            conn, "username", "A title", "http://www.google.com");        System.out.println("We posted a new article with id: " + articleId);        System.out.println("Its HASH looks like:");        Map<String,String> articleData = conn.hgetAll("article:" + articleId);        for (Map.Entry<String,String> entry : articleData.entrySet()){            System.out.println("  " + entry.getKey() + ": " + entry.getValue());        }
        System.out.println();
        articleVote(conn, "other_user", "article:" + articleId);        String votes = conn.hget("article:" + articleId, "votes");        System.out.println("We voted for the article, it now has votes: " + votes);        assert Integer.parseInt(votes) > 1;
        System.out.println("The currently highest-scoring articles are:");        List<Map<String,String>> articles = getArticles(conn, 1);        printArticles(articles);        assert articles.size() >= 1;
        addGroups(conn, articleId, new String[]{"new-group"});        System.out.println("We added the article to a new group, other articles include:");        articles = getGroupArticles(conn, "new-group", 1);        printArticles(articles);        assert articles.size() >= 1;    }
    public String postArticle(Jedis conn, String user, String title, String link) {        String articleId = String.valueOf(conn.incr("article:"));
        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<String,String>();        articleData.put("title", title);        articleData.put("link", link);        articleData.put("user", user);        articleData.put("now", String.valueOf(now));        articleData.put("votes", "1");        conn.hmset(article, articleData);        conn.zadd("score:", now + VOTE_SCORE, article);        conn.zadd("time:", now, article);
        return articleId;    }
    public void articleVote(Jedis conn, String user, String article) {        long cutoff = (System.currentTimeMillis() / 1000) - ONE_WEEK_IN_SECONDS;        if (conn.zscore("time:", article) < cutoff){            return;        }
        String articleId = article.substring(article.indexOf(':') + 1);        if (conn.sadd("voted:" + articleId, user) == 1) {            conn.zincrby("score:", VOTE_SCORE, article);            conn.hincrBy(article, "votes", 1);        }    }

    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<Map<String,String>>();        for (String id : ids){            Map<String,String> articleData = conn.hgetAll(id);            articleData.put("id", id);            articles.add(articleData);        }
        return articles;    }
    public void addGroups(Jedis conn, String articleId, String[] toAdd) {        String article = "article:" + articleId;        for (String group : toAdd) {            conn.sadd("group:" + group, article);        }    }
    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());            }        }    }}

原文地址:https://www.cnblogs.com/cowshed/p/11397690.html