Redis的对文章操作的HelloWorld

这里使用Redis实现发布文章,获取文章,对文章进行分组作为一个Redis的Helloworld

1.Redis发布文章功能实现

对于每一篇文章,程序都使用一个散列来存储,存储的内容包括:文章的标题,文章的链接

,发布文章的用户,文章发布的时间,投票数量等信息。

发布文章代码:

package com.helloredis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ZParams;

import java.util.*;

/**
 * FileName: 文章
 * Author:   sujinran
 * Date:     2018/6/16 20:37
 */
public class Article {
    //一天24小时,一小时60分,一分60秒,因此一天有:24*60*60=86400秒,一个星期有7天,因此一周有:7*86400
    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;

    /**
     * 发布文章
     *
     * @param conn  连接
     * @param user  网站用户
     * @param title 文章标题
     * @param link  文章链接
     * @return
     */
    public String post_Article(Jedis conn, String user, String title, String link) {
        //生成一个x[incr 命令将 key 中储存的数字值+1,String.valueOf()转换为字符串]
        String articleId = String.valueOf(conn.incr("article:"));
        //某个文章的投票:voted:文章编号
        String voted = "voted:" + articleId;
        //添加某个文章投票和投票的用户(sadd添加元素到集合sadd set-key item  )
        conn.sadd(voted, user);
        //名单过期时间设置为一周
        conn.expire(voted, ONE_WEEK_IN_SECONDS);
        long now = System.currentTimeMillis() / 1000;
        //文章:article:文章编号
        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");
        //Hmset 命令用于同时将多个 field-value (字段-值)对设置到哈希表中
        conn.hmset(article, articleData);
        //Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中zadd zset-key 728 member1
        conn.zadd("score:", now + VOTE_SCORE, article);
        conn.zadd("time:", now, article);
        return articleId;
    }
}

文章发布功能测试:

import com.helloredis.Article;
import redis.clients.jedis.Jedis;

import java.util.Map;

/**
 * FileName: 发布文章测试
 * Author:   sujinran
 * Date:     2018/6/16 22:07
 */
public class post_ArticleTest {
    public static void main(String[] args) {
        Article article = new Article();
        Jedis jedis = new Jedis("127.0.0.1");
        jedis.auth("123456");
        //发布文章
        String articleId = article.post_Article(jedis, "user:1", "redisArticle1", "https://blog.csdn.net/qq_35136982/article/details/80709093#t5");
        //遍历获取文章
        Map<String, String> articleData = jedis.hgetAll("article:" + articleId);
        for (Map.Entry<String, String> entry : articleData.entrySet()) {
            System.out.println("  " + entry.getKey() + ": " + entry.getValue());
        }
    }
}

2.Redis文章投票功能实现

使用有序集合来存储文章发布的时间和文章的评分.使用集合来存储已投票的用户

package com.helloredis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ZParams;

import java.util.*;

/**
 * FileName: 文章
 * Author:   sujinran
 * Date:     2018/6/16 20:37
 */
public class Article {
    //一天24小时,一小时60分,一分60秒,因此一天有:24*60*60=86400秒,一个星期有7天,因此一周有:7*86400
    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;

    /**
     * 投票功能实现
     *
     * @param conn    redis连接
     * @param user    用户
     * @param article 发布的文章
     */
    public void article_vote(Jedis conn, String user, String article) {
        //获得系统的时间,单位为毫秒(1秒=1000毫秒(ms)),转换为秒
        long cutoff = (System.currentTimeMillis() / 1000);
        ////判读文章是否过期:zscore 命令返回有序集中,成员的分数值
        if (conn.zscore("time:", article) + ONE_WEEK_IN_SECONDS < cutoff) {
            System.out.println("投票时间已截止");
            return;
        }
        //从article:id获得文章的ID:article.indexOf(":")转换为:分割的字符串 substring生成新的字符串
        String articleId = article.substring(article.indexOf(":") + 1);
        ////判读该用户是否对这篇文章投过票
        if (conn.sadd("voted:" + articleId, user) == 1) {
            //zincrby()命令对有序集合中指定成员的分数加上增量
            conn.zincrby("score:", VOTE_SCORE, article);////为score:表中的article自增分数
            //HINCRBY命令用于增加存储在字段中存储由增量键哈希的数量
            conn.hincrBy(article, "votes", 1);//为article:表中"votes"自增1
        }
    }
}

投票功能测试:

import com.helloredis.Article;
import redis.clients.jedis.Jedis;

/**
 * FileName: 投票功能测试
 * Author:   sujinran
 * Date:     2018/6/16 21:01
 */
public class article_voteTest {
    public static void main(String[] args) {
        Article article = new Article();
        Jedis jedis = new Jedis("127.0.0.1");
        jedis.auth("123456");
        //获取文章的票数,"article:" + 1="article:1"
        String votes1 = jedis.hget("article:" + 1, "votes");
        System.out.println("投票之前的票数是: " + votes1);
        //投票
        article.article_vote(jedis, "user:2", "article:" + 1);
        //投票之后
        String votes = jedis.hget("article:" + 1, "votes");
        System.out.println("我投票了,现在的票数是: " + votes);
        assert Integer.parseInt(votes) > 1;
    }
}

3.Redis获取文章功能实现

package com.helloredis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ZParams;

import java.util.*;

/**
 * FileName: 文章
 * Author:   sujinran
 * Date:     2018/6/16 20:37
 */
public class Article {
    //一天24小时,一小时60分,一分60秒,因此一天有:24*60*60=86400秒,一个星期有7天,因此一周有:7*86400
    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;
    /**
     * 获取文章
     *
     * @param conn
     * @param page
     * @param order
     * @return
     */
    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;
    }
    }

获取文章功能测试:

import com.helloredis.Article;
import redis.clients.jedis.Jedis;

import java.util.List;
import java.util.Map;

/**
 * FileName: 获取文章功能测试
 * Author:   sujinran
 * Date:     2018/6/17 13:44
 */
public class getArticlesTest {
    public static void main(String[] args) {
        Article article = new Article();
        Jedis jedis = new Jedis("127.0.0.1");
        jedis.auth("123456");
        List<Map<String, String>> articles = article.getArticles(jedis, 0, "score:");
        getArticlesTest getArticlesTest1 = new getArticlesTest();
        getArticlesTest1.printArticles(articles);

    }

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

4.Redis对文章进行分组功能

package com.helloredis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ZParams;

import java.util.*;

/**
 * FileName: 文章
 * Author:   sujinran
 * Date:     2018/6/16 20:37
 */
public class Article {
    //一天24小时,一小时60分,一分60秒,因此一天有:24*60*60=86400秒,一个星期有7天,因此一周有:7*86400
    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;

    /**
     * 对文章添加分组
     *
     * @param conn      连接
     * @param articleId 文章编号
     * @param toAdd
     */
    public void add_Group(Jedis conn, String articleId, String[] toAdd) {
        String article = "article:" + articleId;
        for (String group : toAdd) {
            conn.sadd("group:" + group, article);
        }
    }}

文章分组测试:

import com.helloredis.Article;
import redis.clients.jedis.Jedis;

/**
 * FileName: 添加文章分组
 * Author:   sujinran
 * Date:     2018/6/17 13:57
 */
public class add_GroupTest {
    public static void main(String[] args) {
        Article article = new Article();
        Jedis jedis = new Jedis("127.0.0.1");
        jedis.auth("123456");

        //发布文章
//        String articleId4 = article.post_Article(jedis, "user:4", "redisArticle4", "https://blog.csdn.net/qq_35136982/article/details/80709093#t5");
//        String articleId3 = article.post_Article(jedis, "user:3", "redisArticle3", "https://blog.csdn.net/qq_35136982/article/details/80709093#t5");
//        String articleId2 = article.post_Article(jedis, "user:2", "redisArticle2", "https://blog.csdn.net/qq_35136982/article/details/80709093#t5");
        article.add_Group(jedis,"article:" + 1,new String[]{"new-group1"} );
        article.add_Group(jedis,"article:" + 2,new String[]{"new-group1"} );

        article.add_Group(jedis,"article:" + 3,new String[]{"new-group2"} );
        article.add_Group(jedis,"article:" + 4,new String[]{"new-group2"} );
    }
}






猜你喜欢

转载自blog.csdn.net/qq_35136982/article/details/80714830
今日推荐