这里使用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"} );
}
}