前往小程序,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条回复
推荐阅读
编辑精选文章
换一批
Windows安全测试命令大全!收藏这一篇就够了!
本文系统性地整理了Windows环境下进行网络安全测试的核心命令集,涵盖从基础信息收集到高级域环境评估的完整工具链。安全工程师应当熟练掌握这些命令,并在实际工作中灵活运用,以提高渗透测试的效率和质量。
释然IT杂谈
2025/04/21
3200
Windows安全测试命令大全!收藏这一篇就够了!
Win11彻底关闭Defender(包括禁用、删除Defender服务和文件夹)
一般是不建议禁止defender自动更新或者彻底关闭Defender的,但如果你有其他替代的安全方案了,觉得defender有干扰业务隐患,想干掉,那这篇文档非常适用。耗费了不少心血在server2016-2022和win10、win11上对比实践。
Windows技术交流
2023/05/26
22.6K0
开启了 "关机 清除虚拟内存页面文件"(ClearPageFileAtShutdown)会导致Windows关机、重启变得很慢
有个同事帮他朋友问我一个问题,用Windows自定义镜像买机器,创建机器很快,但是进系统很慢,需要十几分钟。
Windows技术交流
2024/04/26
5140
windows iso 自动应答文件和setup.exe参数
承接https://cloud.tencent.com/developer/article/2475931,继续对https://schneegans.de/windows/unattend-generator/ 生成的win10/win11内核Windows系统(含Server2016~2025)自动应答文件做一下简单解析。涉及到的脚本内容远不止于下面这些,对细节感兴趣的可以再深入去查。
Windows技术交流
2024/12/20
2560
Windows系统怎样控制某个服务延迟启动Automatic(Delayed Start)的时间
看到了DelayedAutoStart和AutoStartDelay有关的很多文档,没有一篇是正确的
Windows技术交流
2023/05/10
4.1K0
Windows配置kernel dump和complete dump
1 自动重新启动 After BSOD, OS will auto restart, or stay at a blue screen.
Windows技术交流
2023/10/18
9600
如何配置fulldump MEMORY.DMP
对于大内存的机器,如果系统盘剩余空间不是特别富余、又不想把memory.dmp放到数据盘,可以配置kernel dump,设置为物理内存的30%,参考https://cloud.tencent.com/developer/article/2345491
Windows技术交流
2021/09/29
2.7K0
查Windows开机耗时是否正常
本文介绍通过powershell命令快速定位开机耗时是否正常(日志只是列出时间点,需要自己对比时间差,一般来说,开机耗时不会超过1分钟,那些明显超过的,我们可以结合如下命令判断主要卡在了哪个阶段)
Windows技术交流
2023/09/04
9640
Windows Print Spooler CVE-2021-1675 漏洞复现
Windows Print Spooler是Windows的打印机后台处理程序,广泛的应用于各种内网中。近期安全研究人员在Github公布了Windows PrintSpooler远程代码执行漏洞POC。攻击者可以通过该漏洞绕过PfcAddPrinterDriver的安全验证,并在打印服务器中安装恶意的驱动程序,若攻击者所控制的用户在域中,则攻击者可以连接到DC中的Spooler服务,并利用该漏洞在DC中安装恶意的驱动程序,完整的控制整个域环境。
Khan安全团队
2021/07/08
8580
Windows Print Spooler CVE-2021-1675 漏洞复现
CVE-2019-0708漏洞检测利用
Windows系列服务器于2019年5月15号,被爆出高危漏洞,该漏洞影响范围较广,漏洞利用方式是通过远程桌面端口3389,RDP协议进行攻击的。这个漏洞是今年来说危害严重性最大的漏洞,跟之前的勒索,永恒之蓝病毒差不多。
MssnHarvey
2022/08/10
1.4K0
CVE-2019-0708漏洞检测利用
Windows系统安全|Windows中获取用户密码
Windows系统使用两种方法对用户的密码进行哈希处理,它们分别是 LAN Manager(LM)哈希和 NT LAN Manager(NTLM)哈希。所谓哈希(hash),就是使用一种加密函数对其进行加密。这个加密函数对一个任意长度的字符串数据进行一次数学加密函数运算,然后返回一个固定长度的字符串。
谢公子
2022/01/19
3K0
Windows系统安全|Windows中获取用户密码
推荐一个好用的自动生成自动应答文件的站点
https://schneegans.de/windows/unattend-generator/
Windows技术交流
2024/12/11
4380
腾讯云 windows ntp校时
代码是在≥2012R2的系统上powershell测试的,代码未在≤2008R2的系统上测试;仅供非域环境参考。
Windows技术交流
2021/07/22
5.5K0
死磕Meltdown和Spectre漏洞,应对方案汇总
近日,针对 Google公司的 公司的Project Zero等安全团队披露出的英特尔等处理器芯片存在非常严重的安全漏洞。这次的漏洞分别起名Meltdown(崩溃)和Spectre(幽灵)。这两个漏洞允许黑客窃取计算机的全部内存内容,包括移动设备、个人计算机、以及在所谓的云计算机网络中运行的服务器。 作为战斗第一线的救火队员,最近几天被两个漏洞折磨的头晕脑胀,为了更好的给客户提供服务,翻遍了中外网站大部份相关热文,现整理出下面10多类应急方案,与各位一线兄弟共勉,希望对大家有所帮助。 漏洞危害 对多租户下
FB客服
2018/02/24
1.5K0
死磕Meltdown和Spectre漏洞,应对方案汇总
DiagTrack、WinSAT、Application Experience、Diagnostic等服务或计划任务可能影响系统性能
DiagTrack、WinSAT、Application Experience、Diagnostic等服务或计划任务可能影响系统性能
Windows技术交流
2024/01/08
6000
windows常用命令
在渗透测试中遇到 Windows 的概率是非常大的,那么在拿到一台服务器权限之后,通常会获得一个 shell,想要进行下一步渗透,几乎都是需要通过在 shell 中使用 Windows 的命令来进行渗透的,下面是一些常用的命令,虽然以前都发过了,但是很多人是不怎么反旧文的,所以每发出一次都会有人或多或少能学点东西,我就再发发,多看一遍多加深一点印象,凑合着看吧,最近实在是时间不多,压力大呀!
信安之路
2018/08/08
6270
靶场学习-从joomla到拿下域控
这里发现一个疑似后台地址,访问http://192.168.2.252/administrator/
hyyrent
2022/12/26
1.3K0
靶场学习-从joomla到拿下域控
安装cloudbase-init的自定义镜像里如果禁用光驱,会导致生成随机密码影响自动登录
为了光驱没盘符,禁用了光驱,导致密码模块3个选项(平台自动生成密码、显性指定密码、保留镜像设置)不论怎么设置,最终cloudbase-init都生成了随机密码(跟镜像里配置的注册表自动登录的原始密码不匹配)而无法自动登录
Windows技术交流
2023/04/24
3810
红队攻击-对RDP常规操作
rdp服务是我们常用的服务,可以不是3389端口,可以改成任意端口,时候为了利用它,必须先找出来服务端口,毕竟管理员也鸡贼。
Gamma实验室
2021/05/18
2.1K0
红队攻击-对RDP常规操作
横向渗透之 [RDP]
也可以通过reg配置文件的方式启动:regedit /s startrdp.reg
重生信息安全
2020/03/06
2.6K0
推荐阅读
相关推荐
Windows安全测试命令大全!收藏这一篇就够了!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验