基于redis实现的点赞功能设计思路详解
发布时间 - 2026-01-11 01:01:29 点击率:次前言

点赞其实是一个很有意思的功能。基本的设计思路有大致两种, 一种自然是用mysql等
数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或memcache)中, 然后离线刷回mysql等。
直接写入Mysql
直接写入Mysql是最简单的做法。
做两个表即可,
1、post_like
记录文章被赞的次数,已有多少人赞过这种数据就可以直接从表中查到;
2、user_like_post
记录用户赞过了哪些文章, 当打开文章列表时,显示的有没有赞过的数据就在这里面;
缺点
1、数据库读写压力大
热门文章会有很多用户点赞,甚至是短时间内被大量点赞, 直接操作数据库从长久来看不是很理想的做法。
redis存储随后批量刷回数据库
redis主要的特点就是快, 毕竟主要数据都在内存嘛;
另外为啥我选择redis而不是memcache的主要原因在于redis支持更多的数据类型, 例如hash, set, zset等。
下面具体的会用到这几个类型。
优点
1、性能高
2、缓解数据库读写压力
其实我更多的在于缓解写压力, 真的读压力, 通过mysql主从甚至通过加入redis对热点数据做缓存都可以解决,
写压力对于前面的方案确实是不大好使。
缺点
1、开发复杂
这个比直接写mysql的方案要复杂很多, 需要考虑的地方也很多;
2、不能保证数据安全性
redis挂掉的时候会丢失数据, 同时不及时同步redis中的数据, 可能会在redis内存置换的时候被淘汰掉;
不过对于我们点赞而已, 稍微丢失一点数据问题不大;
具体设计
Mysql设计
这一块和写入写mysql是一样的,毕竟是要落地存储的。
所以还是同样的需要post_like, user_like_post这两表存储文章被点赞的个数(等统计), 用户对那些文章点了赞(取消赞)。
这两表分别通过post_id, user_id进行关联。
redis设计部分:
post_set
在redis中弄一个set存放所有被点赞的文章
post_user_like_set_{$post_id}
对每个post以post_id作为key, 搞一个set存放所有对该post点赞的用户;
post_user_like_{$post_id}_{$user_id}
将每个用户对每个post的点赞情况放到一个hash里面去, hash的字段就
随意跟进需求来处理就行了。
为啥用hash
只所以用hash是因为完全可以用hash来存储一个点赞的对象, 对应数据库的一行记录。
当然有同学会说用key, value也可以, 将所有的数据序列化(json_encode等)
后全部放到value里面去。 反复序列化也是一个很大的开销不是, hash可以很
方便的修改某个字段, 而序列化和反序列化的操作。
post_{$post_id}_counter
对每个post维护一个计数器, 用来记录当前在redis中的点赞数,
这里我们只用counter记录尚未同步到mysql中的点赞数(可以为负), 每次
刷回mysql中时将counter中的数据和数据库已有的赞数相加即可。
用户点赞/取消赞
获取user_id, post_id, 查询该用户是否已经点过赞, 已点过则不允许再次点赞,
或者设计为前端允许用户点, 只是后台不重复计算;
这里需要注意的是用户点赞的记录可能在数据库中, 也可能在缓存中, 所以查询的时候
缓存和数据库都要查询, 缓存没有再查询数据库。
将用户的点赞/取消赞的情况记录在redis中, 具体为:
1、写入post_set
将post_id写入post_set
2、写入post_user_like_set_{$post_id}
将user_id写入post_user_like_set_{$post_id}
3、写入post_user_like_{$post_id}_{$user_id}
将用户点赞数据, 例如赞状态, post_id, user_id, ctime(操作时间), mtime(修改时间)写入post_user_like_{$post_id}_{$user_id}中
4、更新post_{$post_id}_counter
更新post_{$post_id}_counter, 这里的更新稍晚复杂一点, 需要和前面一样先获取当前用户是否对这个post点过赞
如果点过, 并且本次是取消赞, counter减一, 如果没点过, 本次是点赞, counter加一。
如果原来是取消赞的情况, 本次是点赞, counter加一。
同步刷回数据库
循环从post_set中pop出来一个post_id至到空
根据{$post_id} , 每次从post_user_like_set_{$post_id}中pop出来一个user_id直到空
根据post_id, user_id, 直接获取对应的hash表的内容(post_user_like_{$post_id}_{$user_id}
将hash表中的数据写入user_like_post表中
将post_{$post_id}_counter中的数据和post_like中的数据相加, 将结果写入到post_like表中
页面展示
1、查询用户点赞情况
前面已经说过, 需要同时查询redis和mysql
2、查询post点赞统计
同样需要查询redis中的post_{$post_id}_counter和mysql的post_like表, 并将两者相加
得到的结果才是正确的结果
总结
解决了mysql读写的问题
但没有针对用户量较大的场景考虑分表的设计, 可以考虑针对user_id或者post_id进行分表
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# redis
# 点赞数据存储
# 点赞
# redis实现点赞
# springboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作
# 利用Redis实现点赞功能的示例代码
# 手把手教你用Redis 实现点赞功能并且与数据库同步
# thinkphp5 操作redis 实现文章的热度排行和点赞排行的示例
# redis实现存储帖子的点赞状态和数量的示例代码
# 序列化
# 能在
# 的是
# 是一个
# 离线
# 这一
# 会有
# 是因为
# 好了
# 过了
# 都在
# 都要
# 才是
# 已有
# 两种
# 可以用
# 说过
# 会在
# 不是很
# 也可
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在万网开始建站?分步指南解析
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
浅谈Javascript中的Label语句
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
如何用wdcp快速搭建高效网站?
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
高端企业智能建站程序:SEO优化与响应式模板定制开发
魔方云NAT建站如何实现端口转发?
如何用y主机助手快速搭建网站?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
如何在不使用负向后查找的情况下匹配特定条件前的换行符
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
三星网站视频制作教程下载,三星w23网页如何全屏?
在线教育网站制作平台,山西立德教育官网?
Laravel如何使用模型观察者?(Observer代码示例)
Laravel如何实现用户注册和登录?(Auth脚手架指南)
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
如何在阿里云部署织梦网站?
微信小程序 scroll-view组件实现列表页实例代码
香港网站服务器数量如何影响SEO优化效果?
JavaScript如何实现音频处理_Web Audio API如何工作?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何挑选优质建站一级代理提升网站排名?
Laravel怎么实现模型属性的自动加密
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
网站制作报价单模板图片,小松挖机官方网站报价?
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
BootStrap整体框架之基础布局组件
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
node.js报错:Cannot find module 'ejs'的解决办法
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
如何在服务器上配置二级域名建站?
无锡营销型网站制作公司,无锡网选车牌流程?
详解Android图表 MPAndroidChart折线图
佛山企业网站制作公司有哪些,沟通100网上服务官网?
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
制作公司内部网站有哪些,内网如何建网站?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
如何快速搭建高效WAP手机网站?
利用vue写todolist单页应用
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
JS中对数组元素进行增删改移的方法总结

