真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

redis應(yīng)用場(chǎng)景(1)一個(gè)文字投票網(wǎng)站-創(chuàng)新互聯(lián)

構(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ì)

redis應(yīng)用場(chǎng)景(1)一個(gè)文字投票網(wǎng)站

其中用戶,組兩個(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鍵值具備層次性。

redis應(yīng)用場(chǎng)景(1)一個(gè)文字投票網(wǎng)站

2.1文章發(fā)布

redis應(yīng)用場(chǎng)景(1)一個(gè)文字投票網(wǎng)站

實(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文章投票

redis應(yīng)用場(chǎng)景(1)一個(gè)文字投票網(wǎng)站

實(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> getArticles(Jedis conn, int page, String order) {     int start = (page - 1) * ARTICLES_PER_PAGE;     int end = start + ARTICLES_PER_PAGE - 1;     //從排序集合中獲取id列表     Set ids = conn.zrevrange(order, start, end);     List> articles = new ArrayList>();     //遍歷id列表,逐條初始化     for (String id : ids){         Map articleData = conn.hgetAll(id);         articleData.put("id", id);         articles.add(articleData);     }     //注意:返回的信息中,沒(méi)有列表總數(shù)     return articles; }

2.4 文章分組

這一塊邏輯相對(duì)獨(dú)立,僅僅是文章的一個(gè)分析維度而已,操作起來(lái)相對(duì)簡(jiǎn)單。就是維護(hù)groups:${group}集合。

public void addGroups(Jedis conn, String articleId, String[] toAdd) {     String article = "article:" + articleId;     for (String group : toAdd) {         conn.sadd("group:" + group, article);     } } //排序麻煩些 public List> getGroupArticles(Jedis conn, String group, int page, String order) {     String key = order + group; //60秒的有效期    if (!conn.exists(key)) {         ZParams params = new ZParams().aggregate(ZParams.Aggregate.MAX);         conn.zinterstore(key, params, "group:" + group, order);         //有序集合,與group的交集,生成新的集合         conn.expire(key, 60);         //60秒的有效期,性能和實(shí)時(shí)性的平衡,需要具體情況具體分析     }     return getArticles(conn, page, key); }

zinterstore API

public java.lang.Long zinterstore(java.lang.String dstkey,
                                 redis.clients.jedis.ZParams params,
                                 java.lang.String... sets)

參照資源

《redis in action》

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


網(wǎng)頁(yè)標(biāo)題:redis應(yīng)用場(chǎng)景(1)一個(gè)文字投票網(wǎng)站-創(chuàng)新互聯(lián)
URL標(biāo)題:http://weahome.cn/article/ipeds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部