Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >点赞功能设计与实现

点赞功能设计与实现

作者头像
疯狂的KK
发布于 2020-08-27 08:14:57
发布于 2020-08-27 08:14:57
9.3K40
代码可运行
举报
文章被收录于专栏:Java项目实战Java项目实战
运行总次数:0
代码可运行

点赞业务本身并不复杂,无非是对数据的update,但是点赞本身是无意识行为,并且同一个用户可对博文进行点赞/取消点赞,如果直接操作数据库,无疑会增加数据库io操作。

方案:

  1. 缓存+异步推送
  2. 缓存+定时任务

优点:

  1. 降低对数据库的操作
  2. 提高点赞的效率

缺点:

  1. redis挂掉,或者mq延迟使数据库数据与redis数据不一致(正在发生) 解决方案:定时同步redis与数据库数据
  2. 丢失数据 解决方案:MQ挂掉,不解决

数据库设计

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `user_thumb`  (
  `like_detail_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '点赞信息ID',
  `info_id` bigint(8) DEFAULT NULL COMMENT '图文ID',
  `like_create_time` datetime(0) DEFAULT NULL COMMENT '时间',
  `like_user_id` bigint(8) DEFAULT NULL COMMENT '点赞人ID',
  PRIMARY KEY (`like_detail_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '点赞记录表' ROW_FORMAT = Dynamic;

实现思路

1.方案一 redis数据结构采用hash或者set都可,前缀自定义,后缀使用图文消息的id

key-value------>{“prefix:图文id” : “用户id”}

2.大key类型拆分

即便是一万用户,频繁操作最大值也是非常大的,对key进行hash取值,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String key = RedisConstants.getLike(infoId%6);
boolean flag = redisService.isMember(key, userId);

3.是否点赞枚举,1:点赞,2:取消点赞

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum ThumbEnum {

    THUMB(1,"点赞"),
    CANCELTHUMB(2,"取消点赞"),
 
    private String MessageName;
    private Integer type;

    public String getType(Integer type) {
        return type;
    }

    public void setMessageName(String messageName) {
        MessageName = messageName;
    }

    ThumbEnum(String messageName) {
        MessageName = messageName;
    }
}

4.接口实现

根据是否存在key判断是点赞还是取消点赞,所以接口写一个即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Json thumbOrCancel(Long infoId,Long userId);

impl

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
       String key = RedisConstants.getLike(infoId.toString());
        String userIdstr = userId.toString();
        //是否已经点过赞
        boolean flag = jedisService.isMember(key, userIdstr);
        ThumbVo vo = ThumbVo.builder()
                .infoId(infoId)
                .likeCreateTime(new Date())
                .userId(userId)
                .build();
        Map map = new HashMap();
        if (flag) {
            //已点过赞则为取消赞操作
            redisService.srem(key, userIdStr);
            vo.setType(2);//1点赞2取消赞
            map.put("isLike", 1);//1未点赞2已点赞
        } else {
            //记录点赞用户
            redisService.sadd(key, userIdStr);
            vo.setType(1);
            map.put("isLike", 2);
        }
        //发送消息
        userThumbProducer.senduserThumbUp(vo);
        resultMap.put("likeCount", redisService.scard(key));
        return Json.newInstance(resultMap);

mq

异步去消费调用数据库即可,如果做定时任务去查redis是否有数据,持久化到mysql。

按理说读取与写操作应该分为两个redis,但是点赞统计的是评论数,大key进行拆分后,无需对其读写分离。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 赵KK日常技术记录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
4 条评论
热度
最新
如果是用set,bigkey怎么解决
如果是用set,bigkey怎么解决
33点赞举报
大key拆分,不适合做记录,唯一性怎么会产生大key呢
大key拆分,不适合做记录,唯一性怎么会产生大key呢
回复回复1举报
不是集合的元素个数最好不要超过1000吗。当一个物品点赞数很高,用set数据结构,物品id为key,用户ID为value,当点赞数很高,也就是set存储很多用户ID,这里不就变成bigkey了吗
不是集合的元素个数最好不要超过1000吗。当一个物品点赞数很高,用set数据结构,物品id为key,用户ID为value,当点赞数很高,也就是set存储很多用户ID,这里不就变成bigkey了吗
回复回复点赞举报
查看全部3条回复
推荐阅读
编辑精选文章
换一批
Redis排行榜的设计与实现
排行榜zset的经典实现,现在的思路全都是查库的操作,由于业务原因,有些是异步操作,难免存在已经计分,但分数还没有入库,这时去查库,导致与实际的分数不一致的情况,通常排行榜本身的操作不是很频繁,但计分的操作很频繁,但也不排除有些业务场景有些"分数怪"刷分的情况,比如王者荣耀实时排列等。
疯狂的KK
2020/09/14
2K0
Redis排行榜的设计与实现
点赞模块设计:Redis缓存 + 定时写入数据库实现高性能点赞功能
本文基于 SpringCloud, 用户发起点赞、取消点赞后先存入 Redis 中,再每隔两小时从 Redis 读取点赞数据写入数据库中做持久化存储。
田维常
2019/11/12
6.9K1
点赞模块设计:Redis缓存 + 定时写入数据库实现高性能点赞功能
点赞模块设计 - Redis缓存 + 定时写入数据库实现高性能点赞功能
源码地址:https://github.com/cachecats/coderiver
solocoder
2022/04/06
2.4K0
点赞模块设计 - Redis缓存 + 定时写入数据库实现高性能点赞功能
【秒杀系统】秒杀系统和拓展优化
框架技术: SpringBoot2.x ,Mybatis-plus ,Thymeleaf
冷环渊
2022/03/09
4.7K0
【秒杀系统】秒杀系统和拓展优化
重学SpringBoot3-集成Redis(十二)之点赞功能实现
在现代的应用中,点赞功能是一个非常常见的需求,尤其在社交媒体、博客等平台上。Redis 作为一个高性能的键值存储系统,由于其读写速度快、支持丰富的数据结构,因此非常适合用来实现实时的点赞功能。本文将介绍如何结合 Spring Boot 3 和 Redis 来实现一个高效的点赞功能。
CoderJia
2024/10/18
2950
重学SpringBoot3-集成Redis(十二)之点赞功能实现
【探花交友】day07—搜附近
探花功能是将推荐的好友随机的通过卡片的形式展现出来,用户可以选择左滑、右滑操作,左滑:“不喜欢”,右滑:“喜欢”。
陶然同学
2023/04/12
1.2K0
【探花交友】day07—搜附近
【掌印日记-点赞功能实现】使用Redis实现分布式锁
在项目开发中,点赞事件频率较高,我们不可能直接将对点赞功能的操作放到MySQL里面,所以我们引入Redis中间件。
Karos
2023/01/16
1.3K0
【探花交友】day05—圈子互动
我的动态:查询个人发布的动态列表(分页查询),和之前实现的好友动态,推荐动态实现逻辑是一致。
陶然同学
2023/04/07
1.2K0
Evaluate项目开发日志
前端登录 ,使用nginx启动前端项目 ,然后访问8080端口,必须是在后端项目启动的情况下
用户11097514
2024/05/30
2020
Evaluate项目开发日志
PHP结合redis实现点赞功能
第一下载redis包 "predis/predis": "^1.1", <?php /** * 点赞 */ namespace app\like\service; use app\commo
OwenZhang
2021/12/08
9140
【 Redis | 实战篇 扩展 】
分析:实现点赞功能,那么一个用户是不是只能点赞一次,如果能进行多次点赞(这不刷起来了吗)
张哈大
2025/05/31
720
【 Redis | 实战篇 扩展 】
Redis实现朋友圈,微博等Feed流功能,实现Feed流微服务(代码实现)
上篇博客讲述了Redis实现朋友圈,微博等Feed流功能,实现Feed流微服务的业务场景、实现思路和环境搭建,本文继续讲解具体的代码实现内容。
共饮一杯无
2022/12/18
7630
Redis实现朋友圈,微博等Feed流功能,实现Feed流微服务(代码实现)
【探花交友】day03—MongoDB基础
在tanhua-server工程创建SettingsController完成代码编写
陶然同学
2023/04/08
3.5K0
【探花交友】day03—MongoDB基础
这个评论系统设计碉堡了
geeksforgeeks.org官网给出了Facebook评论系统的高级设计图,Facebook的评论竟然是支持实时刷新的。也就是说用户不用刷新帖子,只要帖子有新的评论就会自动推送到用户端,这里Facebook使用的便是每天在全球有超过20亿设备在使用的WebSocket技术。
JavaSouth南哥
2024/09/24
2381
这个评论系统设计碉堡了
【探花交友】查询通用设置、陌生人问题、黑名单管理
在tanhua-server工程创建SettingsController完成代码编写
陶然同学
2023/02/24
6970
【探花交友】查询通用设置、陌生人问题、黑名单管理
「小程序JAVA实战」小程序的视频点赞功能开发(62)
视频点赞关系有3张表,用户表(获得点赞数量),视频表(获得点赞数量),用户喜欢视频的关联表,需要同时操作三张表。源码:https://github.com/limingios/wxProgram.gi
IT架构圈
2019/07/08
1.3K0
「小程序JAVA实战」小程序的视频点赞功能开发(62)
捣鼓一个电商功能设计
谷歌系统设计面试有一道题是关于如何设计秒杀架构,国外一位老哥给出了5种方法,下图是其中一种。
JavaSouth南哥
2024/10/16
1800
捣鼓一个电商功能设计
分库分表—4.数据迁移系统文档一
(3)binlog消息消费记录表——etl_binlog_consume_record
东阳马生架构
2025/02/19
940
Redis位图实现点赞签到相关功能
对于我们平时的一些社区应用,如微博,知乎,掘金等应用点赞,评论这类功能是不可或缺的,例如点赞功能我们其实是可以通过 mysql 去做实现的,但是每次点赞都去实时改库可以想象一下当遇到一个热点文章例如,前段时间大火特火的爆料某艺人日薪多少帖子,这个上千万乃至亿级的点赞量,这个时候我们再去实时改库的话就不那么恰当,今天我们介绍的主角是Redis的位图操作,接下来我们引出正题,来看一下位图是这么做到的;
用户4283147
2022/10/27
1.1K0
Redis位图实现点赞签到相关功能
通过 ip 获取用户登录地点,实现登录日志功能
改造发消息的方法,通过redis消息广播把消息发给各个进程,各个进程监听对应频道,如果收到消息,通过userId找到用户websocket连接,然后把消息发出去。
winty
2023/09/12
4700
通过 ip 获取用户登录地点,实现登录日志功能
推荐阅读
相关推荐
Redis排行榜的设计与实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验