使用Redis实现文章阅读量、收藏、点赞数量记录功能

目录

    • 一、前言
    • 二、业务分析
    • 三、Redis数据结构选择分析和实现
      • 3.1、三个数据缓存都分别使用 字符串 结构计数器存储对应数量值
      • 3.2、三个数据缓存使用一个 Hash 结构存储
      • 3.3、阅读量使用字符串结构计算器,收藏和点赞分别使用 Set 集合存储
    • 四、总结

一、前言

      在博客中会显示文章阅读量、收藏、点赞数量这些值都是经常变化的,收藏和点赞用户还是可以取消的会记录用户标记状态。如果每一次用户查看博客都从数据库中检索这些数据那数据库开销是非常大的,这个时候就需要使用到缓存来存储这些信息。
在这里插入图片描述

需要看Redis命令可以查看:
Redis常用命令集:https://blog.csdn.net/weixin_44606481/article/details/133672258

二、业务分析

      在这三个数据中,阅读量和用户没有关系不用存储用户和文章的关系,但是收藏和点赞和用户就是有关的,每个用户对同一篇文章只能收藏一次和点赞一次,并且可以取消,是有状态的数据,针对这两种不同类型的业务选择的数据结构也不同,实现方法也有很多种这里分析其中几个。

三、Redis数据结构选择分析和实现

      这里不会过多分析数据库相关方面设计,重点分析Redis中应该如何存储这些数据可以高效使用,阅读量是一个持续自增的值和其它业务无关,在数据表中用一个字段记录即可,但是收藏和点赞需要一个对应业务和用户的关联表来记录关系,每次查询时都要查询关联表统计出文章被多少用户收藏和点赞,还要判断当前查看文章的用户是否有收藏和点赞,当然数量信息我们也可以存储某个记录表中,但是每次查询都打到数据库压力还是挺大的,数据库资源很宝贵,这些信息统计好后存储在缓存中会是一个不错的选择。

3.1、三个数据缓存都分别使用 字符串 结构计数器存储对应数量值

鉴于上面所说,这里我们将阅读量、收藏、点赞数量使用三个字符串结构存储,不同业务操作对应key即可,还要注意这些数据入数据库操作。

  • 1、Key定义规则

    • 阅读量key:article:readcount:文章id
    • 收藏数量key:article:collectcount:文章id
    • 点赞数量key:article:likecount:文章id
  • 2、代码实现
    这里直接使用计数器操作即可,每次有对应操作只要对具体key做自增或者自减即可,假设文章id=1

    ## 文章每次被阅读,文章阅读量自增1
    127.0.0.1:6379> incr article:readcount:1
    ## 文章每次被收藏,文章收藏数量自增1
    127.0.0.1:6379> incr article:collectcount:1
    ## 文章每次被点赞,文章点赞数量自增1
    127.0.0.1:6379> incr article:likecount:1
    
    ## 文章每次被取消收藏,文章收藏数量自减1
    127.0.0.1:6379> decr article:collectcount:1
    ## 文章每次被取消点赞,文章点赞数量自减1
    127.0.0.1:6379> decr article:likecount:1
    
    ## 获取文章阅读量、收藏、点赞数量
    127.0.0.1:6379> get article:readcount:1
    127.0.0.1:6379> get article:collectcount:1
    127.0.0.1:6379> get article:likecount:1
    
  • 3、优点

    • 实现简单、能减轻统计查询时的数据库压力
  • 4、不足点

    • 需要使用非常多的key,一篇文章就要使用三个key,而且每次查看文章都需要请求Redis三次才能获取到这三个数量值,对Redis资源开销比较大,可以使用Hash结构优化。

3.2、三个数据缓存使用一个 Hash 结构存储

针对3.1中因为需要使用非常多的key,一篇文章就要使用三个key,而且每次查看文章都需要请求Redis三次才能获取到这三个数量值,对Redis资源开销比较大,这里可以使用Hash结构优化。

  • 1、Key定义规则

    • 文章阅读、收藏、点赞Hash结构 key:article:count:文章id
    • Hash结构中阅读量key:readcount
    • Hash结构中收藏数量key:collectcount
    • Hash结构中点赞数量key:likecount
  • 2、代码实现
    这里直接Hash 结构操作即可,每次有对应操作只要对具体Hash结构中的key做自增或者自减即可,假设文章id=1

    ## 文章每次被阅读,文章阅读量自增1
    127.0.0.1:6379> hincrby article:count:1 readcount 1
    ## 文章每次被收藏,文章收藏数量自增1
    127.0.0.1:6379> hincrby article:count:1 collectcount 1
    ## 文章每次被点赞,文章点赞数量自增1
    127.0.0.1:6379> hincrby article:count:1 likecount 1
    
    ## 文章每次被取消收藏,文章收藏数量自减1
    127.0.0.1:6379> hincrby article:count:1 collectcount -1
    ## 文章每次被取消点赞,文章点赞数量自减1
    127.0.0.1:6379> hincrby article:count:1 likecount -1
    
    ## 获取文章阅读量、收藏、点赞数量
    127.0.0.1:6379> hgetall article:count:1
    
  • 3、优点

    • 相比于3.1中实现简单、能有效减低Redis资源开销
  • 4、不足点

    • 还是有一点问题没有解决,如果要查询阅读用户和文章的收藏和点赞关系,那么还是要查询数据库,数据库压力还是比较大,在下面3.3中会针对这个问题使用 Set 集合解决。

3.3、阅读量使用字符串结构计算器,收藏和点赞分别使用 Set 集合存储

为了解决查询阅读用户和文章的收藏和点赞关系,还需要查询数据库问题,这里采用Set集合来存储文章收藏点赞和用户的关联关系。

  • 1、Key定义规则

    • 阅读量key:article:readcount:文章id
    • 收藏数量Set key:article:collectuser:文章id
    • 点赞数量Set key:article:likeuser:文章id
  • 2、代码实现
    阅读量还是普通结构和3.1一致,收藏和点赞使用Set集合存储文章和用户对应关系,每次收藏点赞时将用户ID加入到对应Set集合中,假设文章id=1。

    ## 文章每次被阅读,文章阅读量自增1
    127.0.0.1:6379> incr article:readcount:1
    ## 文章每次被收藏,将用户ID加入到文章收藏的Set集合中,假设用户ID为1001
    127.0.0.1:6379> sadd article:collectuser:1 1001
    ## 文章每次被点赞,将用户ID加入到文章点赞的Set集合中,假设用户ID为1001
    127.0.0.1:6379> sadd article:likeuser:1 1001
    
    ## 文章每次被取消收藏,将用户ID从文章收藏的Set集合中删除
    127.0.0.1:6379> srem article:collectuser:1 1001
    ## 文章每次被取消点赞,将用户ID从文章点赞的Set集合中删除
    127.0.0.1:6379> srem article:likeuser:1 1001
    
    ## 获取文章阅读量、收藏、点赞数量
    ### 获取阅读量
    127.0.0.1:6379> get article:readcount:1
    ### 获取收藏数量
    127.0.0.1:6379> scard article:collectuser:1
    ### 获取点赞数量
    127.0.0.1:6379> scard article:likeuser:1
    
    ## 获取当前阅读用户是否收藏、点赞当前文章
    ### 获取用户是否收藏当前文章
    127.0.0.1:6379> sismember article:collectuser:1 1001
    ### 获取用户是否点赞当前文章
    127.0.0.1:6379> sismember article:likeuser:1 1001
    
  • 3、优点

    • 对于阅读量、收藏、点赞相关所有的查询操作都可以通过Redis获取,大大降低了数据库压力,并且还会再Redis中维护文章和用户的收藏、点赞关系,查询用户是否收藏点赞也不要再去查询数据库。
  • 4、不足点

    • 事情都有两面性,使用Redis来缓存这些信息虽然能大大提升系统整体性能,但是可能出现缓存与数据库数据不一致问题,还有缓存过期时间问题,如果一篇文章一个月才被访问一次那么不可能一直缓存这篇文章的信息,需要设置一个删除时间,要想比较完善的实现那么设计这个功能复杂度是成倍增长的。

四、总结

      实现方式还有很多,比如在3.3中还能使用Hash结构去维护阅读量、收藏、点赞的数量信息,收藏和点赞与用户关联信息放入对应Set集合中,这样就不用每次都去不同的key中获取对应数量信息了,一个Hash全搞定,最终要选择什么方案还是结合项目实际情况来决定的。

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

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

相关文章

chrome v3开发插件实现所有网站允许跨域

场景: chrome 插件 升级到v3后,原来修改请求响应都变成异步,即无法同步拦截来修改请求响应。 在v3中也不支持修改请求响应内容。 问题:如何在chrome v3中允许其他网站跨域呢。 方式一:禁用chrome跨域,禁…

5G与物联网应用:新一代网络技术融合开创新时代

5G与物联网应用:新一代网络技术融合开创新时代 随着信息技术的不断演进,5G和物联网作为新一代网络技术,正在引领我们走向一个更加智能化、互联互通的新时代。本文将分析5G与物联网应用的技术原理、应用场景与发展趋势,并探讨它们…

BES 在大规模向量数据库场景的探索和实践

导读 本文整理自 2023 年 9 月 5 日 QCon 全球软件开发大会 2023 北京站 —— 向量数据库分论坛的同名主题演讲《BES 在大规模向量数据库场景的探索和实践》。 全文5989字,预计阅读时间15分钟。 向量数据库是一种专门用于存储和查询向量数据的数据库系统。通过 Emb…

idea 一直卡在maven正在解析maven依赖

修改maven Importing的jvm参数 -Xms1024m -Xmx2048m

用POST请求在Linux之间传输文件(Python在Linux间传输文件)

背景 实际需求: 已通过iperf和dd命令测试过两台不同区域之间的Linux服务器带宽,均为1000Mb网络。但发送post请求传输文件至对象存储时,总是卡在14Mb/s。除了排查区域之间的防火墙,也应该尝试检查Linux(KylinV10&…

Python中如何理解这种书写代码的语法??def cracking_passwords(zfile: ZipFile, pwd: str) -> bool:

def cracking_passwords(zfile: ZipFile, pwd: str) -> bool: # Author : 小红牛 # 微信公众号:wdPython这是一种使用Python的函数定义语法。这个函数被命名为cracking_passwords,它接受两个参数:zfile和pwd。参数的类型被标注为ZipFile和…

Java Swing程序设计-18章

Java Swing程序设计-18章 1.Swing概论 Swing是用于创建图形用户界面(GUI)的一组API(应用程序编程接口)。Swing提供了丰富的组件,用于构建用户友好的界面,包括按钮、文本框、标签、列表、表格等。以下是Sw…

c语言练习第10周(1~5)

根据公式求和 输入样例20输出样例 534.188884 #include<stdio.h> #include<math.h> int main() {int i,n;scanf("%d", &n);double s 0,t0;for (i 1; i < n; i) {t t sqrt(i);s s t;}printf("%.6lf", s);return 0; } 第一行输入…

Selenium爬取内容并存储至MySQL数据库

前面我通过一篇文章讲述了如何爬取博客摘要等信息。通常,在使用Selenium爬虫爬取数据后,需要存储在TXT文本中,但是这是很难进行数据处理和数据分析的。这篇文章主要讲述通过Selenium爬取我的个人博客信息,然后存储在数据库MySQL中,以便对数据进行分析,比如分析哪个时间段…

0成本LLM微调上手项目,⚡️一步一步使用colab训练法律LLM,基于microsoft/phi-1_5,包含lora微调,全参微调

项目地址 &#xff1a;https://github.com/billvsme/train_law_llm ✏️LLM微调上手项目 一步一步使用Colab训练法律LLM&#xff0c;基于microsoft/phi-1_5 。通过本项目你可以0成本手动了解微调LLM。 nameColabDatasets自我认知lora-SFT微调train_self_cognition.ipynbsel…

Python基础入门----Python虚拟环境:为何要用虚拟环境、如何使用virtualenv

文章目录 在Python开发中,虚拟环境是一个独立的目录树,可以在其中安装Python模块。每个虚拟环境都有自己的Python二进制文件和一组安装的库。使用虚拟环境的主要原因是为了避免项目间的依赖冲突,允许每个项目有其特定的依赖,而不影响全局安装的模块。 为何要用虚拟环境 依…

IntelliJ IDEA - Git Commit 后 Commit 窗口不消失解决方案

这个现象是在 2023 年版本后开始的&#xff0c;一开始以为是 Mac 系统的原因&#xff0c;后来发现原来 Windows 也这样&#xff0c;所以应该只跟 IDEA 版本有关 可以看到左侧 commit 后&#xff0c;这个侧边栏还在&#xff0c;按理讲在以前的版本是之前消失&#xff0c;这样使…

Go 语言初探:从基础到实战

1.Go概述 程序是一段计算机指令的有序组合。程序算法数据结构。任何程序都可以将模块通过三种基本的控制结构&#xff08;顺序、分支、循环&#xff09;进行组合来实现。 Go&#xff08;也称为Golang&#xff09;是一种由Google开发的开源编程语言。设计目标是使编程更简单、…

62、使用python进行rk3588开发板进行推流亚马逊云服务上,进行实时播放

基本思想:之前写了一套c++的推理和视频编解码,使用rk3588的mpp硬件进行编码和解码,然后使用RTSPServer进行推流,总是有问题,虽然可以使用ffplay和vlc进行拉取和播放,但是就是无法使用gstreamer推流到亚马逊云服务上,因为项目需求的紧急,所以先用python把流程跑同,后续…

视频转码教程:轻松制作GIF动态图,一键高效剪辑操作

随着社交媒体的兴起&#xff0c;GIF动态图已经成为了人们表达情感、分享精彩瞬间的重要方式。而将视频转化为GIF动态图&#xff0c;不仅可以方便地在社交媒体上分享&#xff0c;还可以延长视频的播放时长&#xff0c;吸引更多的观众。本篇文章将为大家介绍如何将视频轻松转化为…

为什么冰酒会被视为珍品?

在某些年份&#xff0c;珍贵稀有的葡萄酒让酿酒师有了冒险的意愿&#xff0c;葡萄比平时在藤上停留更长时间&#xff0c;需要等待至少-7℃的温度&#xff0c;酿酒师需要与自然玩游戏&#xff0c;可以持续到1月&#xff0c;在罕见的情况下可以持续到2月。对于酿酒师来说&#xf…

雨云 宿迁 14900KF 高防云服务器性能测评

雨云游戏云上线了用I9 13900KF做CPU的VPS服务器&#xff0c;雨云游戏云VPS的14900KF和13900KF机型是纯大核的&#xff08;屏蔽小核&#xff09;保证你的VPS不会被分配到小核上而导致性能下降&#xff0c;水冷散热&#xff0c;超频至6.3Ghz&#xff0c;超高单核性能。 适合开我…

openai自定义API操作 API 返回值说明

custom-自定义API操作 openai.custom 公共参数 名称类型必须描述keyString是调用key&#xff08;获取测试key&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheStrin…

申克SCHENCK动平衡机显示器维修CAB700系统控制面板

适用电枢转子的卧式平衡机&#xff0c;高测量率&#xff0c;自动测量循环&#xff0c;自动定标完整的切槽计数可选项&#xff0c;CAB700动平衡测量系统两种皮带驱动方式(上置式或下置式)适用于站立或坐姿操作的人性化工作台设计。 动平衡机申克控制器面板维修型号&#xff1a;V…

wandb 安装本地部署使用教程

1、官网注册 wandb.ai是一个为机器学习开发者提供的开发工具平台&#xff0c;可以帮助用户跟踪实验&#xff0c;管理和版本数据&#xff0c;以及与团队协作&#xff0c;从而更专注于构建最佳模型。 wandb官网&#xff1a; https://wandb.ai 首先我们打开官网注册号自己的账号并…