业务类中处理点赞、收藏和浏览量

描述

点赞、收藏、浏览量等信息的存储位置取决于具体的业务需求和系统架构,但通常会结合数据库和缓存来进行设计。

常见的做法是:

初始时,将点赞、收藏、浏览量等信息存储在数据库中。

然后,将这些数据同步到缓存中,并在用户进行相关操作(如点赞、收藏)时,同时更新数据库和缓存。

这样可以在保证数据准确性的同时,提高系统的性能和响应速度。

改进

以下是一种可能更优的方案,考虑了数据一致性、并发处理和性能优化:

引入分布式锁:

在对点赞、收藏和浏览量进行操作时,获取分布式锁,以确保并发情况下数据的准确性。

异步更新数据库:

先更新缓存,然后将更新数据库的操作放入消息队列中异步处理,以提高响应速度。

缓存预热:

在系统启动或定期将热门文章的相关数据加载到缓存中,减少首次访问时的数据库查询。

点击查看代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class ArticleService {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Autowiredprivate ArticleRepository articleRepository;@Autowiredprivate DistributedLockManager lockManager;  // 假设使用分布式锁管理组件@Autowiredprivate MessageQueueProducer messageQueueProducer;  // 消息队列生产者// 增加点赞数@Transactionalpublic void incrementLikes(Long articleId) {String lockKey = "article_likes_lock:" + articleId;try {// 获取分布式锁if (lockManager.acquireLock(lockKey)) {String likesKey = "article_likes:" + articleId;Long likesInCache = redisTemplate.opsForValue().increment(likesKey, 1);// 将更新数据库的操作放入消息队列异步处理messageQueueProducer.sendUpdateLikesMessage(articleId, likesInCache);}} finally {// 释放锁lockManager.releaseLock(lockKey);}}// 增加收藏数和浏览量的方法类似// 获取点赞数public Long getLikes(Long articleId) {String likesKey = "article_likes:" + articleId;Long likesInCache = redisTemplate.opsForValue().get(likesKey);if (likesInCache == null) {// 如果 Redis 中没有,从数据库中获取并设置到 Redis 中Long likesInDB = articleRepository.getLikes(articleId);if (likesInDB!= null) {redisTemplate.opsForValue().set(likesKey, likesInDB.toString());return likesInDB;}return 0L;} else {return Long.parseLong(likesInCache);}}// 类似地实现获取收藏数和浏览量的方法
}

核心部分:

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

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

相关文章

极速全景图下载出错显示Permission denied怎么回事

在极速全景图下载大师下载拼接全景图的过程中, 出现了错误, 提示错误信息: creating file kvmem_xxxxx_xxxxx.swap failed: Permission denied (errno=13)经过排查, 上述错误是由以下原因导致的: - 系统运行内存不足, 导致在拼接过程无法创建缓存文件, 导致出错 解决方案: 检查…

关于园子求救信有感

毕业七年了,写了七年的博客,养成了记录的习惯。7年写了800篇随笔,很杂。前端,java,mysql,linux,php用到啥学啥,学到啥就记录啥。 最近不是很好,工作且算顺利,七年的爱情摇摇欲坠,未来很是模糊,说起来有写记录的习惯也是源于恋爱日记,现在看来全是泪啊。 前几天,看…

一个开源、跨平台的.NET UI框架 - Avalonia UI

前言 今天大姚给大家分享一个开源、免费(MIT License)、跨平台的.NET UI框架:Avalonia UI。Avalonia是一个成熟稳定的平台,用于构建桌面、嵌入式、移动的和Web应用程序。一个代码库,无限可能!!!项目介绍 Avalonia是一个强大的框架,使开发人员能够使用.NET创建跨平台应用程…

Jenkins Job 构建动态参数配置

在做jenkins项目时,有些参数不是固定写死的,而是动态变化的,这时我们可以用 Active Choices 插件来远程调用参数。 实现结果如下:操作步骤:注意筛选关键字参数必须位于筛选列表的前面,如该文章示例keyword必须在affectedPlatformIds前面 Groovy Script代码如下:import …

Latex使用中文或中英文混合使用

如果想显示中文内容或者中英文混用在开头部分添加包 \usepackage{xeCJK} 随后在设置中将编译方式改成 XeLaTex 即可。注意:可能与pdfLaTex编译方式产生的结果有区别。

12.面向对象(4)

MODULE 12 面向对象知道final修饰成员之后特点会使用静态代码块以及知道静态代码块的使用场景会使用匿名内部类一.权限修饰符(一)概述在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容 会有不同的访问权限(1)public:公共的,最高权限,被public修饰的…

css常见布局

两列布局 1、flex 2、float 3、position: absolute 三列布局 1、flex 2、float(圣杯布局,双飞翼布局) 3、position: absolute 圣杯布局 1、注意html结构是 main-> left -> right 把重要的内容放在前面,有利于seo 2、父级padding 3、三个元素都是float <div class=&q…

Hadoop 任务提交 class not fond exception

异常描述 在使用Java client 对yarn进行任务提交的时候有时候会出现 class not fond exception, 这个原因是因为某些类并没有被正确的打包.上述问题可以通过手动设置Jar包的方式来解决从而替换原本的setJarByClass上述的Jar 包为当前程序打包后的Jar, 可以使用Idea快速构建

DP优化——斜率优化

引言 在学数据结构优化dp,单调队列优化dp时都很快就懂了,四边形不等式优化dp看一看也懂了,只有斜率优化理解了一个月还不懂,最后在其他大佬和资料的帮助下成功学懂了,于是争取这篇题解在以后又不会的时候一遍就懂。前置数学知识 1.一次函数 初中数学知识,见八年级数学课本…

shotcut安装使用

Download双击安装下一步指定路径勾选所需要的安装完成选择素材先复制粘贴到时间线如果底部没有这几个工具,点击顶部[查看]->[布局]->[恢复默认布局]点击中间的位置操作切割后选择删除文件,输出,视频

记录 macos 链接 win10 wsl2 ubuntu clickhouse 记录

遇到了许多问题 顺序应该不同 首先就是 链接的客户端是 DBeaver 链接的时候要 选择版本 低版本的 用legacy, 驱动也很重要, 下不到驱动的可以用网上找的驱动来安装有的时候 会有类名的问题 但是报错很离谱 会报 dbeaver clickhouse 链接错误 code:46 Unknown function current…