基于Redis的String实现文章PV统计

本文介绍了如何利用Redis的String数据结构和incr命令来实现文章的页面浏览量(PV)统计。通过设置文章ID为Key,每次访问 incr 命令累加1,实现动态更新并持久化的浏览次数记录。
摘要由CSDN通过智能技术生成

基于Redis的String实现文章PV统计

1、场景分析

使用redis的计数器来完成文章的统计计数

  • 新浪的文章访问
  • 微信公众号的文章访问

都有一个浏览数、评论数、转发数等,数量的统计,可以使用string数据结构中的命令incr来进行处理和累加。

2、具体实现分析

  • 每篇文章都有一个文章ID :可以用作为的key
  • 值就是每篇文章的浏览数即可
redisTemplate.incrment("文章ID")

3、具体实现

3.1 使用Redis的计数命令 incr key
  • 采用incr命令 ,每次累加1
  • 如果key不存在,那么初始化的值是0,后面执行incr操作都会递增1
127.0.0.1:6379> incr bbs:1
(integer) 2
127.0.0.1:6379> incr bbs:1
(integer) 3
127.0.0.1:6379> incr bbs:1
(integer) 4
127.0.0.1:6379> incr bbs:1
(integer) 5
3.2 实现incr增加文章浏览量
package com.example.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

@Controller
public class ContentController {
   

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * @Author
     * @Description 同步页面渲染
     * @Date 10:52 2021/8/9
     * @Param [id, modelMap]
     * @return java.lang.String
    **/
    @GetMapping("/content/detail2/{id}")
    public String contentDetail2(@PathVariable("id") Integer id, ModelMap modelMap) {
   
        // redis是一个基于key-value内存数据库
        String key = "content:" + id;
        // 给每篇文章添加浏览数
        Long viewCount = redisTemplate.opsForValue().increment(key);
        modelMap.put("viewCount", viewCount);
        return "content/detail2";
    }


    /**
     * @Author
     * @Description 异步处理
     * @Date 10:52 2021/8/9
     * @Param [id, modelMap]
     * @return java.lang.String
    **/
    @GetMapping("/content/detail/{id}")
    public String contentDetail(@PathVariable("id") Integer id, ModelMap modelMap) {
   
        modelMap.put("contentid", id);
        return "content/detail";
    }

    /**
     * @return java.lang.String
     * @Author
     * @Description 给文章添加的浏览数
     * @Date 10:52 2021/8/9
     * @Param [contentId]
     **/
    @ResponseBody
    @PostMapping("/content/viewscount")
    public Long contentView(String contentId) {
   
        // redis是一个基于key-value内存数据库
        String key = "content:" + contentId;
        // 给每篇文章添加浏览数
        Long viewCount = redisTemplate.opsForValue().increment(key);
        // 返回给浏览器
        return viewCount;
    }
}

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>文章明细</title>
        <link th:href="@{/css/article.css}" rel="stylesheet">
        <link th:href="@{/css/new.css}" rel="stylesheet">
        <link th:href="@{/css/avatar.css}" rel="stylesheet">
        <script th:src="@{/js/jquery-3.5.1.min.js}"></script>
    </head>
    <body th:data-contentId="${contentId}">
        <div id="article-web-app"></div>
        <div id="app">
            <div class="article-detail">
                <div class="fixed-top-header" style="">
                    <div class="inner">
                        <p title="那些拼命考上研究生的普通二本学生,后来都怎么样了?" class="inner-title">那些拼命考上研究生的普通二本学生,后来都怎么样了?</p>
                        <div class="inner-right">
                            <a href="//space.bilibili.com/552226898" target="_blank" class="up-info">
                                <div class="card-image author-face" style="width:28px;height:28px;border-radius:28px;" data-v-b1d802ec="">
                                    <div class="card-image__image" data-v-b1d802ec="" style="background-image: url(&quot;//i2.hdslb.com/bfs/face/c578448ea06f314fa51d80bbb22fa750a366bb63.jpg@56w_56h.webp&quot;); border-radius: 28px;"></div>
                                </div>
                                <span title="留学小助手" class="up-info__name">留学小助手</span>
                            </a>
                            <div style="width:73px;height:26px;" data-v-14fe49dd="">
                                <span class="follow-btn unfollow" data-v-14fe49dd="">
                                    <i class="iconfont icon-add" data-v-14fe49dd=""></i>
                                    关注
                                </span>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="article-breadcrumb">
                    <a href="//www.bilibili.com/read/home?from=articleDetail" target="_self" class="breadcrumb-name">专栏</a>
                    <span class="slash">/</span>
                    <a href="//www.bilibili.com/read/life?from=articleDetail" target="_self" class="breadcrumb-name">生活</a>
                    <span class="slash">/</span>
                    <a href="//www.bilibili.com/read/life#rid=15?from=articleDetail" target="_self" class="breadcrumb-name">日常</a>
                    <span class="slash">/</span>
                    <span class="breadcrumb-name breadcrumb-title">那些拼命考上研究生的普通二本学生,后来都怎么样了?</span>
                </div>
                <div class="article-container">
                    <div class="article-container__content">
                        <div class="title-container">
                            <h1 class="title">那些拼命考上研究生的普通二本学生,后来都怎么样了?</h1>
                            <div class="article-read-panel" data-v-39eb8e7f="">
                                <div class="article-read-info" data-v-39eb8e7f="">
                                    <a target="_blank" href="//www.bilibili.com/read/life#rid=15?from=articleDetail" class="category-name" data-v-39eb8e7f="">日常</a>
                                    <span class="publish-text" data-v-39eb8e7f="">8-6</span>
                                    <span data-v-39eb8e7f="" class="example-viewCountNum"></span>
                                    <span data-v-39eb8e7f="">阅读</span> ·
                                    <span data-v-39eb8e7f="">1喜欢</span> ·
                                    <span data-v-39eb8e7f="">8评论</span>
                                </div>
                            </div>
                        </div>
                        <div class="article-up-info" data-v-2724bf84="">
                            <div class="up-left" data-v-2724bf84="">
                                <div class="avatar-container" data-v-2724bf84="">
                                    <a href="//space.bilibili.com/552226898" target="_blank" data-v-2724bf84="">
                                        <div class="bili-avatar">
                                            <img class="bili-avatar-img bili-avatar-face bili-avatar-img-radius" data-src="https://i2.hdslb.com/bfs/face/c578448ea06f314fa51d80bbb22fa750a366bb63.jpg@96w_96h_1c_1s.webp" alt="" src="https://i2.hdslb.com/bfs/face/c578448ea06f314fa51d80bbb22fa750a366bb63.jpg@96w_96h_1c_1s.webp">
                                            <span class="bili-avatar-icon"></span>
                                        </div>
                                    </a>
                                </div>
                                <div data-v-2724bf84="">
                                    <div class="up-name-pannel" data-v-2724bf84="">
                                        <a href="//space.bilibili.com/552226898" target="_blank" class="up-name" data-v-2724bf84="">留学小助手</a>
                                        <span data-v-2724bf84="" class="level l2"></span>
                                    </div>
                                    <div class="avatar-info-pannel" data-v-2724bf84="">
                                        <span class="fans" data-v-2724bf84="">粉丝:</span>
                                        <span class="fans-num" data-v-2724bf84="">143</span>
                                        <span class="view" data-v-2724bf84="">文章:</span>
                                        <span class="view-num" data-v-2724bf84="">346</span>
                                    </div>
                                </div>
                            </div>
                            <div class="up-btn" style="width:128px;height:32px;" data-v-14fe49dd="" data-v-2724bf84="">
                                <span class="follow-btn unfollow" data-v-14fe49dd="">
                                    <i class="iconfont icon-add" data-v-14fe49dd=""></i>
                                    关注
                                </span>
                            </div>
                        </div>
                        <div class="title-line"></div>
                        <div id="article-content" class="article-content">
                            <div id="read-article-holder" class="normal-article-holder read-article-holder">
                                <p style="text-align: left;">在新时代的学历大潮中,“考研”的趋势不可阻挡,七八年前听说身边的考研成功的学长不是985就是211,高等院校成就高等学历似乎更理所应当。</p>
                                <p style="text-align: left;"><br></p>
                                <p style="text-align: left;">而现在却有更多微妙的变化,普通二三本或者说双非的考生逆袭成为了考研主力军(其实就是考研集体中普通本科生的报考增速超过了考研大军的整体增速)。</p>
                                <p style="text-align: left;"><br></p>
                                <p style="text-align: left;">根据中国教育在线调查显示,报考的考生中,83%左右的考生本科院校为非“双一流”。</p>
                                <p style="text-align: left;"><br></p>
                                <p style="text-align: left;">大家每个人都有自己的出发点,有的是为了更好地找工作、有的是都想通过这次考试弥补高考的遗憾、有的为了提升自己的素质能力……</p>
                                <p style="text-align: left;"><br>在漫漫的考研大军中当然也会有质疑的声音,考上到底会带给自己什么?你现在是不是特别想知道后来的他们怎样了:</p>
                                <p>“当年那些拼尽全力才努力上岸的普通二本学生,后来都怎么样了?”</p>
                                <p><br></p>
                                <p style="text-align: center;"><strong>后来的他们怎么样了?</strong></p>
                                <p><br></p>
                                <p>本科省内二本,考研到上海Top2的985(笔试第一名)。考上985后,我去了自己喜欢的城市、喜欢的学校,遇到了很多很优秀的人,他们也无形中影响了我,曾经一度觉得自己也属于那类人。</p>
                                <p><br>研二参加了一年的国外项目,已经回国,现在准备毕业去工作。在找工作中,我发现研究生985学历确实给我排除了90%的障碍,包括之前投实习的时候,都给我开绿灯。但不可否认的是,有的公司单位也会因为自己本科不好而有所迟疑。</p>
                                <p><br>不过优秀的公司单位还是会给年轻人机会,你如果有优秀的经历或者能力,也会被青睐。我想说的是,直到现在,我仍然羡慕那些本科就是985甚至在国外名校读书的人,4 年本科是塑造一个人的价值观、世界观等最重要的时间。</p>
                                <p><br>在学校做一些活动或者参加一些会议活动时,明显可以感受到他们之前4年所接受的资源已经把我甩了很远。</p>
                                <p><br>总之,人生很长,我们有机会去走得更远,最重要的是,不要自我放弃。</p>
                                <p><br></p>
                                <p><strong>「考生二」</strong></p>
                                <p><br></p>
                                <p>本科大学是一个不怎么好的医学院,曾经一直以为,像我这种从小镇来的年轻人,能回到家乡所在的市区市医院工作,就谢天谢地了。</p>
                                <p><br>后来我觉得人生不该这样随便。2013年我考研进了浙江大学医学院,然后2015转成硕博连读,2017年的时候我拿到了国家留学基金委的奖学金。</p>
                                <p><br></p>
                                <p>我很理解很多二本院校出身同学的不安,感觉很像6年前那个在一个二本院校中不安的自己,一直碌碌无为却又无法真正放下自己的理想和对未来的憧憬。</p>
                                <p><br></p><p>我想说的就是,每个人可能都会有那么一瞬间的顿悟,请珍惜这种感觉。</p>
                                <p><br>那一瞬间会给你一种向上奋斗的力量,请用半年、一年的时间去彻底执行它。等考研这段时间过后,你会发生后面的路就像一次又一次地回放当年,每一次就都能咬牙冲过。</p>
                                <p><strong>「考生三」</strong></p>
                                <p><br>考了三次,执着于华科是因为高考失利,导致本科是个普通的二本。</p>
                                <p><br>读研之后我特别珍惜这难得的机会。因为这之前我爸已经给我计划让我留在我们县城,然后买房子找对象,一辈子就这样过了。考研打破了老爸对我的人生规划,我走出了新的道路。</p>
                                <p><br></p><p>研一暑假我报了学校的日语班,学习了除了英语之外的另外一门语言。读研期间我在学院对外办公室当了一年助管,加上补助,我就再也没有跟家里要过钱。</p>
                                <p><br>研二的时候导师给我们安排到公司实习,帮导师做项目。由于一直在研会担任学生工作,然后参与了导师的国家项目,加上我本身成绩还可以,因此我在研二拿到了国家一等奖学金2万元。</p>
                                <p><br>研二下学期我在一个留学生创业园实习了半年,研三的九月份校招开始,经过笔试面试等考验,我拿到了武汉一个证券公司的offer。</p>
                                <p><br>目前已经成功毕业答辩,等待入职。公司待遇还不错,第一年大概有16万。</p>
                                <p><br>在读研之前我只在本省内活动,读研期间我去过凤凰、青岛、成都、都江堰、厦门、金门、宁波等地,所有的费用都是自己挣的,考研期间便经济独立了。</p>
                                <p><br>2017 年我毕业了,回顾一下自己读研的历程,发现我通过自己的努力改变了自己的人生轨迹。</p>
                                <p><br></p><p><strong>「考生四」</strong></p><p><br>本人女,本科毕业于一所普通到再也不能普通的二本院校,是那种你只要刚刚过了二本线就能进去的那种。</p>
                                <p><br></p><p>那时宿舍里有五个女生,其中有三个是天天追剧,上课也是能不去就不去,反正考试之前有划重点,也没有挂科。</p>
                                <p><br></p>
                                <p>宿舍的环境除了看剧的声音,就是各种外卖饭盒放置好几天腐烂的味道,不知道有多少次你睡得正香,却被突然袭来的喧闹声吵醒。</p>
                                <p><br>后来,实在忍无可忍,就搬出去租房子自己住了,那时距离考研只剩下三个月。由于已经患有严重的睡眠障碍,导致每晚只能睡着二三个小时,其他时间就再也睡不着了。</p
                                ><p><br></p>
                                <p>到了白天昏昏沉沉,学习效率低下,脑子什么也记不住。那年考研,自然没有考上,但除了高数其他的科目都过线了。</p>
                                <p><br></p>
                                <p>后来大学毕业不好找工作,回到老家,托各种关系勉强找到一份跟专业毫不相关的工作。一天到晚坐办公室没啥事干,基本是在瞌睡中度过,月工资2500。</p>
                                <p><br></p>
                                <p>就这样过了3个月,觉得自己离曾经的梦想渐行渐远,有些不甘心,于是准备开始二战考研。终于,在2015年9月如愿开始上研究生,专业和本科时的一样,软件工程。2017年10月工作定了下来,月薪15000。</p>
                                <p><br></p>
                                <p style="text-align: center;">
                                    <strong>“出身不好”读研有希望吗?</strong>
                                </p>
                                <p><br></p>
                                <p>因为备考过程很磨炼心性,一般耐得住寂寞、禁得住诱惑的人才会撑到最后;它也锻炼了一个人的学习能力、认知能力,可以帮助自己在今后的人生里解决各种各样的问题。</p>
                                <p><br></p>
                                <p>不过,读研前景虽然是诱人的,但我们不得不面对一个事实,就是高淘汰率,考研作为选拔性考试,近三年都会有7成的遗憾落榜者。即便拼尽全力千军万马过独木桥的考研,也不一定就能考上国内的重点院校……</p>
                                <p><br></p>
                                <p>如果条件允许,“出国留学”或许可以提供一种深造的解决思路,为未来提供更多选择与保障。<br></p>
                                <p><br></p>
                                <p><span style="text-decoration-line: underline;">不清楚考研留学如何同步安排?</span></p>
                                <p><span style="text-decoration-line: underline;">想知道相似条件的学长学姐最终选择了哪所学校?</span></p>
                                <p><span style="text-decoration-line: underline;">想了解留学费用、院校选择、专业前景?</span></p>
                                <p><br></p><p>CAUTION!</p>
                                <p>本周六(8月7日)晚20:00,我们邀请到985本科,获得耶鲁大学机械与材料科学博士全奖录取学子来做线上分享,感兴趣的同学可以来听听~</p>
                            </div>
                        </div>
                        <div class="article-footer-box">
                            <span class="footer-text">本文禁止转载或摘编</span>
                            <div class="article-tags">
                                <i class="iconfont icon-tag"></i>
                                <a href="//search.bilibili.com/article?keyword=留学&amp;from_source=article" target="_blank" class="tag-item">留学</a>
                                <a href="//search.bilibili.com/article?keyword=考研&amp;from_source=article" target="_blank" class="tag-item">考研</a>
                            </div>
                        </div>
                    </div>
                    <div viewinfo="[object Object]" class="interaction-info">
                        <div class="toolbar">
                            <div class="share-box">
                                分享到:
                                <ul class="share-list">
                                    <li title="动态" data-type="dynamic" class="hover-item share-item">
                                        <a href="javascript:void(0);" target="_self" class="dis-evt">
                                            <i class="van-icon-share_news_default"></i>
                                        </a>
                                    </li>
                                    <li title="新浪微博" data-type="weibo" class="hover-item share-item">
                                        <a href="http://service.weibo.com/share/share.php?appkey=2841902482&amp;language=zh_cn&amp;url=https%3A%2F%2Fwww.bilibili.com%2Fread%2Fcv12519373%3Ffrom%3Dcategory_0&amp;title=%23bilibili%E4%B8%93%E6%A0%8F%23%20undefined%20-%20%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9%E4%B8%93%E6%A0%8F&amp;pic=https%3A%2F%2Fstatic.hdslb.com%2Fmobile%2Fimg%2Fapp_logo.png&amp;pics=https%3A%2F%2Fstatic.hdslb.com%2Fmobile%2Fimg%2Fapp_logo.png&amp;site=&amp;summary=&amp;searchPic=true" target="_blank" class="">
                                            <i class="van-icon-share_weibo_default"></i>
                                        </a>
                                    </li>
                                    <li data-type="wechat" class="hover-item share-item has-qrcode-item">
                                        <a href="javascript:void(0);" target="_self" class="dis-evt">
                                            <i class="van-icon-share_wechat_default"></i>
                                        </a>
                                        <div class="qrcode-box">
                                            <p class="qrcode-tit">微信扫一扫分享</p>
                                            <div id="wechat-qrcode" class="qrcode-ctnr">
                                                <div class="van-qrcode">
                                                    <canvas width="132" height="132"></canvas>
                                                </div>
                                            </div>
                                        </div>
                                    </li>
                                    <li title="QQ空间" data-type="qzone" class="hover-item share-item">
                                        <a href="http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?style=203&amp;width=98&amp;height=22&amp;otype=share&amp;url=https%3A%2F%2Fwww.bilibili.com%2Fread%2Fcv12519373%3Ffrom%3Dcategory_0&amp;title=&amp;pic=https%3A%2F%2Fstatic.hdslb.com%2Fmobile%2Fimg%2Fapp_logo.png&amp;pics=https%3A%2F%2Fstatic.hdslb.com%2Fmobile%2Fimg%2Fapp_logo.png&amp;site=&amp;summary=&amp;searchPic=true" target="_blank" class="">
                                            <i class="van-icon-share_qzone_default"></i>
                                        </a>
                                    </li>
                                    <li title="QQ好友" data-type="qq" class="hover-item share-item">
                                        <a href="http://connect.qq.com/widget/shareqq/index.html?url=https%3A%2F%2Fwww.bilibili.com%2Fread%2Fcv12519373%3Ffrom%3Dcategory_0&amp;title=&amp;pic=https%3A%2F%2Fstatic.hdslb.com%2Fmobile%2Fimg%2Fapp_logo.png&amp;pics=https%3A%2F%2Fstatic.hdslb.com%2Fmobile%2Fimg%2Fapp_logo.png&amp;site=&amp;summary=&amp;searchPic=true" target="_blank" class="">
                                            <i class="van-icon-share_qq_default"></i>
                                        </a>
                                    </li>
                                </ul>
                            </div>
                        </div>
                        <span class="hover-item advice-item">投诉或建议</span>
                    </div>
                </div>
                <div id="readRecommendInfo" class="recommend-list report-wrap-module">
                    <div class="recommend-header">
                        <div class="title">推荐文章</div>
                        <a target="_blank" href="//www.bilibili.com/read/home" class="more">
                            <span>更多精彩内容</span>
                            <i class="iconfont icon-top"></i>
                        </a>
                    </div>
                    <div class="recommend-article-list">
                        <a target="_blank" href="//www.bilibili.com/read/cv12516046?from=articleDetail" class="article-item">
                            <div class="left-panel">
                                <div title="这所大学名列全美前20,还能让你吃好住好学好玩好!别再搞混它的名字了!" class="article-title">这所大学名列全美前20,还能让你吃好住好学好玩好!别再搞混它的名字了!</div>
                                <div title="点击进入查看全文>" class="article-desc">点击进入查看全文&gt;</div>
                                <div class="article-info"><span class="article-info--up">
                                    <div class="card-image article-info--cover" style="width:24px;height:24px;border-radius:24px;" data-v-b1d802ec="">
                                        <div class="card-image__image" data-v-b1d802ec="" style="background-image: url(&quot;//i0.hdslb.com/bfs/face/c161791c8ee101d4b57c24d4a45b6dd6df21e271.jpg@48w_48h.webp&quot;); border-radius: 24px;"></div>
                                    </div>
                                    <span>新航道西安学校</span>
                                </span>
                                    <div class="article-info--stats">
                                        <span target="_blank" class="stats-categroy">日常</span>
                                        <span class="stats-item"><i class="iconfont icon-zhuanlanka_yueduliang"></i>6</span>
                                        <span class="stats-item"><i class="iconfont icon-zhuanlanka_xihuan"></i>0</span>
                                        <span class="stats-item"><i class="iconfont icon-zhuanlanka_pinglun"></i>0
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫拾壹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值