構(gòu)建一個(gè)文章投票網(wǎng)站,一般具備下面幾個(gè)功能
成都創(chuàng)新互聯(lián)總部坐落于成都市區(qū),致力網(wǎng)站建設(shè)服務(wù)有網(wǎng)站建設(shè)、
成都做網(wǎng)站、網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站維護(hù)、公眾號(hào)搭建、
小程序開(kāi)發(fā)、軟件開(kāi)發(fā)等為企業(yè)提供一整套的信息化建設(shè)解決方案。創(chuàng)造真正意義上的網(wǎng)站建設(shè),為互聯(lián)網(wǎng)品牌在互動(dòng)行銷(xiāo)領(lǐng)域創(chuàng)造價(jià)值而不懈努力!
發(fā)布文章
文章投票評(píng)分(按投票多少進(jìn)行評(píng)分)
文章排序(按發(fā)布時(shí)間,按評(píng)分高低)
文章分組(如專(zhuān)題)
...
1.關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)
其中用戶,組兩個(gè)表簡(jiǎn)單化處理了。業(yè)務(wù)實(shí)現(xiàn)起來(lái)也相當(dāng)簡(jiǎn)單。不再贅述。重點(diǎn)是如何使用redis實(shí)現(xiàn)類(lèi)似的業(yè)務(wù)邏輯。
由于redis是基于key-value管理,屬于列式數(shù)據(jù)庫(kù)。和關(guān)系型數(shù)據(jù)庫(kù)實(shí)現(xiàn)方式差異較大,值得研究。
redis的設(shè)計(jì),最重要的一部分工作就是key的命名以及鍵值數(shù)據(jù)類(lèi)型的選擇上。
2.Redis設(shè)計(jì)
關(guān)系型數(shù)據(jù)庫(kù)屬于二維,數(shù)據(jù)關(guān)系主要通過(guò)在行和列兩者說(shuō)明,而redis中的數(shù)據(jù)關(guān)系,則通過(guò)key鍵值描述,所以要求redis鍵值具備層次性。
2.1文章發(fā)布
實(shí)現(xiàn)代碼
private static final int ONE_WEEK_IN_SECONDS = 7 * 86400;
private static final int VOTE_SCORE = 432;
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
articleData = new HashMap();
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);
//維護(hù)兩個(gè)排序集合,是為了解決文章排序的兩種方式
//如果還有三種排序方式,對(duì)不起,還需要另外維護(hù)一個(gè)排序集合
conn.zadd("score:", now + VOTE_SCORE, article);//維護(hù)文章的評(píng)分信息
conn.zadd("time:", now, article);//維護(hù)文章的發(fā)布時(shí)間信息
return articleId;
}2.2文章投票
實(shí)現(xiàn)代碼
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);
//維護(hù)投票的一次性
if (conn.sadd("voted:" + articleId, user) == 1) {
conn.zincrby("score:", VOTE_SCORE, article);
conn.hincrBy(article, "votes", 1l);
}
}2.3返回文章列表
兩種排序策略:按發(fā)布時(shí)間,按文章評(píng)分。
支持分頁(yè)排序。
redis的實(shí)現(xiàn)排序方式和關(guān)系型數(shù)據(jù)庫(kù)中的實(shí)現(xiàn)方式有很大差別,這也是key-value數(shù)據(jù)庫(kù)的一大特點(diǎn)。
基于key操作。
public List