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());
}
}
}
}

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());            }        }    }}

redis-投票的更多相关文章

  1. redis投票计数

    <?php /** * * 缓存利用测试,这里我们获取传过来的投票数据,每次加1,如果增加到了设定值,才将投票 * 次数写回mysql,这大大减轻了与mysql链接的开销,redis的使用由此可 ...

  2. Redis笔记5-redis高可用方案

    一.哨兵机制 有了主从复制的实现以后,如果想对主服务器进行监控,那么在redis2.6以后提供了一个"哨兵"的机制.顾名思义,哨兵的含义就是监控redis系统的运行状态.可以启动多 ...

  3. redis备忘录

    Redis 是一个基于内存的高性能key-value数据库.Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数 ...

  4. Redis in Action 文章投票

    原书用 Python 与 Redis 进行交互,我用 PHP 来实现. 环境:LNMP(CentOS 6.6 + Nginx 1.8.0 + MySQL 5.6.23 + PHP 5.6.9)+ Re ...

  5. php+redis 简易的实现文章发布系统(用户投票系统)

    /** * @data 文章发布 * 文章详情散列表中递增ID,讲文章发布者ID写入投票用户集合中,设置投票时间为一周 * 讲文章内容写入文章散列中,讲文章写入文章评分有序集合和文章发布有序集合中 * ...

  6. redis 实例2 构建文章投票网站后端

    redis 实例2 构建文章投票网站后端   1.限制条件 一.如果网站获得200张支持票,那么这篇文章被设置成有趣的文章 二.如果网站发布的文章中有一定数量被认定为有趣的文章,那么这些文章需要被设置 ...

  7. 使用redis构建文章投票系统

    首先,我得说明这篇博客基本上就是<<redis in action>>第一章内容的读书笔记. 需求 首先,说明一下,我们的需求 用户可以发表文章,发表时,自己就默认的给自己的文 ...

  8. Redis实现文章投票功能

    Redis的具体操作这里就不说了,说一下需求和设计思路. 需求:自己实现一个文章投票的功能1.能够按照时间分页倒叙查看文章信息2.能够给文章投票,一个用户给一篇文章只能投票一次3.需要记录分值.每次投 ...

  9. php与Redis实现一个100万用户的投票项目,如何实现实时查看投票情况?

    好了,什么是冷热数据交换呢? 很土的解释一下,冷数据就是之前使用的数据,有种过去式的感觉,而热数据就是当前的数据,理解为现在进行时吧.如何交换呢?就是将Redis的数据周期存储到mysql中! 整体的 ...

  10. php结合Redis实现100万用户投票项目,并实时查看到投票情况的案例

    场景:某网站需要对其项目做一个投票系统,投票项目上线后一小时之内预计有100万用户进行投票,希望用户投票完就能看到实时的投票情况 这个场景可以使用redis+mysql冷热数据交换来解决. 何为冷热数 ...

随机推荐

  1. react 兼容 ie11

    npm install core-js -D 在入口文件第一行引入import ‘core-js’ 在package.json做如下修改 加上ie 11

  2. WooyunWifi路由器

    WooyunWifi 初始化配置 为了开始使用您的WooyunWifi路由器,您需要对WooyunWifi进行初始化配置,这些配置主要位于Openwrt Luci管理界面中,如果您对Openwrt路由 ...

  3. WebSocket是什么原理,为什么可以实现持久连接

    本文摘抄自知乎,原文标题:WebSocket 是什么原理?为什么可以实现持久连接? Websocket只是协议而已. 一.WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化, ...

  4. java8学习之Collectors工厂类源码分析与实战

    如上一节[http://www.cnblogs.com/webor2006/p/8360232.html]在结尾处谈到的,彻底理解了Collector收集器之后,有必要对其系统Collectors实现 ...

  5. cmd命令行显示中文乱码

    cmd命令行显示中文乱码多数是由于字符编码不匹配导致. 1.查看cmd编码方式 方法一.打开cmd,输入chcp命令回车(显示默认编码:活动代码页:936指GBK) 方法二.打开cmd在标题栏单击鼠标 ...

  6. 【模板】manachar

    马拉车算法用于解决最长回文字串的一类问题,可以将时间复杂度降低为\(O(n)\),几乎达到了理论上的下界. 核心思想:将分奇偶讨论的情况转化成同一种情况(奇数). 下面介绍该算法需要用到的几点性质: ...

  7. Mac 安装RN android开发环境

    前言 前面介绍了MAC 安装,再来讲讲mac 安装 安卓的开发环境 首先貌似很多Mac自带安卓JDK ,你可以在终端上输入java -version 看是否已经有java开发环境. 如果没有java开 ...

  8. qt5--表格控件QTableWidget

    需要    #include <QTableWidget>      #include <QTableWidgetItem> #include "win.h" ...

  9. 前端接受base64的excel,点击立即下载

    由于使用框架的特殊性,后台返回的文件流进行了base64加密,所以返回的是base64格式,所以需要将其转变为blob,上代码

  10. vue-router嵌套路由,二级路由。

    如果全是用一级路由时,路由管理就变得很臃肿,有点乱,路由有父子关系的话,嵌套路由会更好.嵌套也就是路由中的路由的意思,组件中可以有自己的路由导航和路由容器(router-link.router-vie ...