读redis in action 从https://github.com/josiahcarlson/redis-in-action这里下载了java代码,添加了一些注释,帮助记忆
/**
* 'article:'记录文章的数量,用来生成文章的ID<br>
* voted:ID set类型,记录投票人<br>
* article:ID HASH类型 ,记录文章的相关信息<br>
* score: ZSET类型 (article:ID ,得分) <br>
* time:ZSET类型 (article:ID ,创建时间)<br>
* group:组名 set类型 记录文章分组<br>
* */
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.154.129", 6379);
conn.auth("password");
conn.select(15);
// 初始化
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;
}
/**
* 初始化文章信息、得分,返回文章ID
*
* @param conn
* jedis的连接
* @param user
* 用户名
* @param title
* 标题
* @param link
* 文章链接
* @return 文章ID
*/
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;
}
/**
* 投一票操作
*
* @param user
* 投票人
* @param article
* 文章 'article:'+id
*/
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:");
}
/**
* 获取在ZSET类型的数据中,第page页的数据;从大到小排列;
*
* @param page
* 页数--从1开始
* @parma order SZET
* @return List<Map<String, String>>
*/
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);
}
// 打印,id在第一行
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());
}
}
}
}