redis应用场景(1)一个文字投票网站

news/2024/5/12 13:54:51/文章来源:https://blog.csdn.net/weixin_34253539/article/details/89985584

构建一个文章投票网站,一般具备下面几个功能

发布文章

文章投票评分(按投票多少进行评分)

文章排序(按发布时间,按评分高低)

文章分组(如专题)

...

1.关系型数据库设计

wKiom1fan0agS4CnAABY5FZ2sxg721.png

其中用户,组两个表简单化处理了。业务实现起来也相当简单。不再赘述。重点是如何使用redis实现类似的业务逻辑。

由于redis是基于key-value管理,属于列式数据库。和关系型数据库实现方式差异较大,值得研究。

redis的设计,最重要的一部分工作就是key的命名以及键值数据类型的选择上。

2.Redis设计

关系型数据库属于二维,数据关系主要通过在行和列两者说明,而redis中的数据关系,则通过key键值描述,所以要求redis键值具备层次性。

wKioL1fasCOhQHGpAAGnU0tXoqM971.png

2.1文章发布

wKiom1fasF_z4RjwAABnwnUGKZQ300.png

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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<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;
}

2.2文章投票

wKiom1fatBODuYDCAABmTlxBGi8577.png

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
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", 1l);
    }
}


2.3返回文章列表

两种排序策略:按发布时间,按文章评分。

支持分页排序。

redis的实现排序方式和关系型数据库中的实现方式有很大差别,这也是key-value数据库的一大特点。

基于key操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
    //从排序集合中获取id列表
    Set<String> ids = conn.zrevrange(order, start, end);
    List<Map<String,String>> articles = new ArrayList<Map<String,String>>();
    //遍历id列表,逐条初始化
    for (String id : ids){
        Map<String,String> articleData = conn.hgetAll(id);
        articleData.put("id"id);
        articles.add(articleData);
    }
    //注意:返回的信息中,没有列表总数
    return articles;
}

2.4 文章分组

这一块逻辑相对独立,仅仅是文章的一个分析维度而已,操作起来相对简单。就是维护groups:${group}集合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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, 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秒的有效期,性能和实时性的平衡,需要具体情况具体分析
    }
    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)




本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/1853019,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_754467.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iis网站属性在哪_windows服务器,网站被挂黑页,简单快速应急处理

作为一个网站管理员&#xff0c;你采用开源CMS做网站&#xff0c;比如dedecms&#xff0c;但是有一天&#xff0c;你忽然发现不知何时&#xff0c;网站的友情链接模块被挂大量垃圾链接&#xff0c;网站出现了很多不该有的目录&#xff0c;里面全是博彩相关的网页。而且&#xf…

网站建设不再难 - 2018年最好用的网站设计工具集锦

2019独角兽企业重金招聘Python工程师标准>>> 由于代码技术的限制&#xff0c;普通大众往往在网站建设方面总是一站难求。但是&#xff0c;想要拥有一个自己的网站&#xff0c;真的必须由程序员通过代码实现&#xff1f;哼&#xff0c;在当今满满科技感的新时代&…

安装iis打开网站提示Microsoft JET Database Engine 错误 '80004005'解决办法

今天在魅力网络公司办公室的一个电脑安装iis服务器软件&#xff0c;在win7系统上按的&#xff0c;放上了asp程序&#xff0c;但打开会有错误提示&#xff0c;打开htm静态的文件没问题&#xff0c;原因找了找发现是权限的问题。iis要求电脑磁盘格式是fat32的&#xff0c;而魅力网…

创建一个动态的雾_python django创建一个属于自己的动态网站

您如何开始使用Python创建网站&#xff1f;好吧&#xff0c;你可以自己完成所有工作&#xff0c;并编写一个在Web服务器上运行的程序&#xff0c;接受页面请求并以HTML和其他资源的形式提供响应。然而&#xff0c;这是很多工作&#xff0c;那么为什么在有大量现有工具为您完成工…

help.hybris.com和help.sap.com网站的搜索实现

help.hybris.com 我使用help.hybris.com时&#xff0c;发现每次在搜索栏输入文字时&#xff0c;没有发出任何HTTP请求&#xff0c;那么这个自动完成的下拉框里的记录从哪里来的&#xff1f;我看了下实现&#xff0c;发现所有自动完成下拉框里的记录都是硬编码在searchsuggestio…

自建网站对接微信公众号

title: 自建网站对接微信公众号date: 2018-04-12 15:25tags: 微信公众号,PHPcodeignitercategories: 技术 平常我们有些写各种网站, 个人博客系统, 物流管理系统, 通信录管理系统, 校园二手网站. 我们都知道, 只需要租用一个服务器, 再配置一个备案好的域名, 就可以在浏览器上进…

用VS2012建立core2.1网站项目后引用Microsoft.AspNetCore.Session不了

用VS2012建立core2.1网站项目后引用Microsoft.AspNetCore.Session不了 做个.NET CORE的新项目&#xff0c;和往常一样&#xff0c;VS2017新建CORE项目&#xff08;CORE2.1&#xff09;&#xff0c;NUGET引入session&#xff0c;结果引入不了&#xff0c;说什么版本不对应的&…

hwpfdocument 获取第一页内容_浅谈:网站文章内容页的SEO排名技巧!

优化SEO的目的是获取搜索引擎的流量&#xff0c;但是在SEO执行过程中需要逐步循环&#xff0c;确保了SEO方案的可行性和SEO过程的可控性。为了引流目的反推SEO流程&#xff0c;获得搜索引擎流量需要关键词排名&#xff0c;获得关键词排名必须首先保证网站的收录。思维浅析对于新…

《机器学习与数据科学(基于R的统计学习方法)》——2.9 从网站中抓取数据...

本节书摘来异步社区《机器学习与数据科学&#xff08;基于R的统计学习方法&#xff09;》一书中的第2章&#xff0c;第2.9节&#xff0c;作者&#xff1a;【美】Daniel D. Gutierrez&#xff08;古铁雷斯&#xff09;&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众…

html怎么发布站点地图,新手如何掌握制作和提交网站地图?

网站地图作为根据网站的结构&#xff0c;框架&#xff0c;内容生成的导航网页文件。大多数人都知道网站地图对于提高用户体验有好处&#xff1a;它们为网站访问者指明方向&#xff0c;并帮助迷失的访问者找到他们想看的页面。那么什么是网站地图呢?在开始介绍网站地图的制作与…

利用dns解析来实现网站的负载均衡

当网站的访问量大了就会考虑负载均衡&#xff0c;这也是每一个架构师的基本功了&#xff0c;其基本地位就相当于相声里的说学逗唱&#xff0c;活好不好就看这个了 :)传统的负载均衡思路是单点的&#xff0c;不管你是硬件的还是软件的基本都是这样的原理对于一般的需求来说&…

给网站添加谷歌验证(我不是机器人)

2019独角兽企业重金招聘Python工程师标准>>> 1、去谷歌网站。(如果没有谷歌gmail,也许还要注册gmail并登陆) https://www.google.com/recaptcha/admin#list 2、注册要验证的网站。 Label中随意填写个标签。Choose the type of reCAPTCHA中选择验证类型。第一个是网站…

峰任策划:如何将网站推广做的更有效果

随着互联网的高速发展&#xff0c;互联网行业的竞争也是愈演愈烈。众多的中小企业也纷纷加入网络营销的行列中&#xff0c;建立起属于自家企业的网站&#xff0c;建立起以企业网站为核心的网络推广模式。那么如何来推广自己的网站&#xff0c;如何做好网站推广&#xff0c;目前…

十周后,62%的PHP网站将运行在一个不受支持的PHP版本上

根据W3Techs的统计数据&#xff0c;目前约有78.9&#xff05;的网站使用PHP开发。\\但是&#xff0c;PHP 5.6.x的安全支持将在2018年12月31日正式停止&#xff0c;这标志着对古老的PHP 5.x分支版本的支持都将结束。\\也就是说&#xff0c;从明年开始&#xff0c;大约62&#xf…

你的网站会投放这样的广告么?

我震惊了&#xff0c;钱要赚&#xff0c;但为了公司名誉以及社会影响&#xff0c;就算是广告&#xff0c;能不能有个底线的啊&#xff1f;

无懈可击的Web设计:使用HTML 5和CSS 3提高网站的灵活性与适应性(第3版)

《无懈可击的Web设计:使用HTML 5和CSS 3提高网站的灵活性与适应性(第3版)》基本信息原书名&#xff1a;Bulletproof Web Design&#xff1a;Improving flexibility and protecting against worst-case scenarios with HTML5 and CSS3, Third Edition 原出版社&#xff1a; New …

电商网站中购物车功能模块完善

主要有两方面的问题&#xff1a; 1、登录状态下添加商品到购物车 此时购物车是对应一个用户&#xff0c;很简单&#xff0c;就是将商品的数据插入数据库中即可&#xff0c;但是如果读写频繁的时候&#xff0c;就存在压力问题&#xff0c;此时我们可以使用Redis担任读的部分功能…

thinkphp5项目--企业单车网站(八)(文章板块要点)(删除图片)

thinkphp5项目--企业单车网站&#xff08;八&#xff09;&#xff08;文章板块要点&#xff09;&#xff08;删除图片&#xff09; 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise Websitehttps://github.com/fry404006308/BicycleEnterpriseWebsite 一、…

云计算及其对您的SEO的影响

云计算及其对您的SEO的影响 互联网对商业世界的影响不容低估&#xff0c;经常使用“革命化”和“提升”等词语来描述当前的气候。过去三十年来&#xff0c;企业逐渐适应互联网&#xff0c;并在网上开展越来越多的业务。互联网技术的进步使得企业竞相跟上&#xff0c;以便他们能…

网站另类推广玩法心得

互联网营销&#xff0c;越来越多的个人或是企业希望通过网上营销将自己的产品或服务推广出去&#xff0c;但是这些站的具体运营呢&#xff0c;多数仅仅停留在把站做起来&#xff0c;而没有太好的推广手段&#xff0c;而如何有访问呢?人们首先想到的就是 SEO&#xff0c;因为通…