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






發佈了40 篇原創文章 · 獲贊 27 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章