這裏使用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"} );
}
}