redis——实现点赞功能

Redis实现点赞功能模块 数据库,没有统一的数据结构,针对不同的功能点设计了不同的。Redis数据库设计。说明:表结构设计省略了。 阅读详情

目录

完善点赞功能

实现点赞排行榜功能


完善点赞功能

(采用redis中的set集合)

实现

    @Override
    public Result likeBlog(Long id) {
        //1.获取登录用户
        Long userId = UserHolder.getUser().getId();
        //2.判断当前用户是否点赞
        String key="blog:liked:"+id;
        Boolean isMember = stringRedisTemplate.opsForSet().isMember(key,userId.toString());
        if(BooleanUtil.isFalse(isMember)){
            //3.如果未点赞
            //3.1数据库点赞数+1
            boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();
            //3.2保存用户到redis的set集合中
            if(isSuccess){
                stringRedisTemplate.opsForSet().add(key,userId.toString());
            }
        }
        else{

            //4.如果已点赞,取消点赞
            //4.1数据库点赞数-1
            boolean isSuccess = update().setSql("liked = liked - 1").eq("id", id).update();
            //4.2把用户从redis的set集合移除
            if(isSuccess){
                stringRedisTemplate.opsForSet().remove(key,userId.toString());
            }
        }

        return Result.ok();
    }

在查询Blog的业务中添加下面方法,来判断该用户是否点过赞

    private void isBlogLiked(Blog blog) {
        //1.获取登录用户
        Long userId = UserHolder.getUser().getId();
        //2.判断当前用户是否点赞
        String key="blog:liked:"+blog.getId();
        Boolean isMember = stringRedisTemplate.opsForSet().isMember(key,userId.toString());
        blog.setIsLike(BooleanUtil.isTrue(isMember));
    }

实现点赞排行榜功能

根据上图可知,要想能够对数据进行排序,我们需要更改redis中的数据结构Set为SortedSet

实现

根据当时间戳设置score值进行排序

    @Override
    public Result likeBlog(Long id) {
        //1.获取登录用户
        Long userId = UserHolder.getUser().getId();
        //2.判断当前用户是否点赞
        String key="blog:liked:"+id;
        //没有isMember方法,采用score获取当前score值,通过判断是否为空来判断有无点赞
        Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());
        if(score==null){
            //3.如果未点赞
            //3.1数据库点赞数+1
            boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();
            //3.2保存用户到redis的set集合中
            if(isSuccess){
                stringRedisTemplate.opsForZSet().add(key,userId.toString(),System.currentTimeMillis());
            }
        }
        else{
            //4.如果已点赞,取消点赞
            //4.1数据库点赞数-1
            boolean isSuccess = update().setSql("liked = liked - 1").eq("id", id).update();
            //4.2把用户从redis的set集合移除
            if(isSuccess){
                stringRedisTemplate.opsForZSet().remove(key,userId.toString());
            }
        }

        return Result.ok();
    }

    @Override
    public Result queryBlogLikes(Long id) {
        String key="blog:liked:"+id;
        //1.查询top5的点赞用户 zrange key 0 4
        Set<String> top5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);
        if(top5==null||top5.isEmpty()){
            return Result.ok(Collections.emptyList());
        }
        //2.解析出其中的用户id
        //stream转流,map映射,collect收集
        List<Long> ids = top5.stream().map(Long::valueOf).collect(Collectors.toList());

        //3.根据用户id查询用户
        List<UserDTO> userDTOS = userService.listByIds(ids)
                .stream()
                .map(user -> BeanUtil.copyProperties(user, UserDTO.class))
                .collect(Collectors.toList());

        //4.返回
        return Result.ok(userDTOS);
    }

修改一个小bug(因为主界面不一定需要登录,所以检索文章时无需考虑该用户是否点赞,所以需要增加判断语句)

    private void isBlogLiked(Blog blog) {
        //1.获取登录用户
        UserDTO user = UserHolder.getUser();
        if(user==null){
            //用户未登录无需查询是否点赞
            return;
        }
        Long userId = UserHolder.getUser().getId();
        //2.判断当前用户是否点赞
        String key="blog:liked:"+blog.getId();
        Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());
        blog.setIsLike(score!=null);
    }

仍存在一些问题,虽然我们传入的id是按顺序的,但是listByIds()内部封装的sql语句是采用in的方法,导致查询出来的结构会根据id来进行排序,如下图所示

 

所以需要进行相应的改造,改造sql

 修改如下

    @Override
    public Result queryBlogLikes(Long id) {
        String key="blog:liked:"+id;
        //1.查询top5的点赞用户 zrange key 0 4
        Set<String> top5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);
        if(top5==null||top5.isEmpty()){
            return Result.ok(Collections.emptyList());
        }
        //2.解析出其中的用户id
        //stream转流,map映射,collect收集
        List<Long> ids = top5.stream().map(Long::valueOf).collect(Collectors.toList());
        String idStr = StrUtil.join(",",ids);
        //3.根据用户id查询用户
        List<UserDTO> userDTOS = userService.query().in("id",ids)
                .last("ORDER BY FIELD(id,"+idStr+")")
                .list()
                .stream()
                .map(user -> BeanUtil.copyProperties(user, UserDTO.class))
                .collect(Collectors.toList());

        //4.返回
        return Result.ok(userDTOS);
    }

用 Redis 实现点赞功能:优雅设计 Key / Value 当然,具体的实现方式和优化策略还需要根据业务需求和实际情况进行调整和完善。让我们一起探讨,共同提升技术水平,打造更加优秀的应用系统。在实际应用中,我们可以根据业务需求进行优化和调整。同时,我们也应该注意 Redis 的使用限制和最佳实践,以确保系统的稳定性和性能。让我们一起探讨,共同提升技术水平,打造更加优秀的应用系统。在实际应用中,我们可以根据业务需求和系统架构进行更加复杂的优化和扩展。如果你对这个主题有更多疑问或者想要分享你的经验,欢迎在评论中与我们互动。 阅读详情

相关推荐

Redis+Spring boot+Mybatis 实现给文章点赞功能

只是练习redis做的小功能,单机功能,学习记录使用。 redis存储类型选择了hash数据类型。 先建数据库,需要一个点赞表,一个文章表,表结构直接上图: 文章表paper: 用户点赞user_like: 点赞表和我的用户表链接这里用不到就不放用户表了。 我用0和1表示用户的取消点赞和点赞状态,借鉴了网上的文章,以前没接触过枚举类,这次把这个状态写了个枚举类,不用枚举也可以。 public enum UserLikeEnum { LIKE((byte)1, "点赞"), UNLIKE(

qq_47805927的博客 1414

redis实现点赞功能。

redis实现点赞功能。

weixin_51472505的博客 6362

点赞功能真的有必要上 Redis 吗?(Mongo、MySQL、Redis、MQ 实测性能对比)

除了单表操作比较耗时外,对于中小型项目而言,频繁的读写操作场景,使用 mongo 就够用了. 甚至都不用上 mq,更甚至有的场景下 redis 性能还不如 mongo...

CYK_byte的博客 2596

基于redis实现点赞相关功能

1.实现基础的点赞功能(当用户进行点赞判断是否已经点赞,若点赞则取消若未点赞则点赞)实现方式:在redis中存入一个set集合每当一个用户进行点赞则将改用户id存入key为他所点赞的帖子的id+标志字符,每次点赞前进行判断该set集合中是否存在,若存在则取消赞,并删除set中的用户id,不存在则添加赞并添加用户id到set集合中代码 添加点赞排行功能(显示点赞的前几名)set集合不支持排序,所以需要将set集合更改为sortedSet

weixin_64035133的博客 1067

Android 11系统定制:如何彻底隐藏状态栏电池图标(RK3568实测)

本文详细解析了在Android 11系统上如何通过多维度修改实现状态栏电池图标的彻底隐藏,特别针对RK3568平台提供了实战指南。从系统UI架构解析到核心配置文件修改,再到进阶技巧与疑难排查,帮助开发者深度定制Android系统,满足特定场景需求。

weixin_29250573的博客 377

Cadence Allegro安装全攻略:从准备到优化的完整指南

本文提供了一份详尽的Cadence Allegro安装教程,涵盖从系统准备、硬件要求到获取安装文件的完整前期工作。指南逐步解析了自定义安装、路径选择及核心组件配置,并重点阐述了许可证服务器的环境变量设置与服务启动等关键激活步骤,最后给出了首次启动验证、个性化优化及常见问题排错方案,助您高效完成安装与配置。

weixin_29243063的博客 187

基于redis的点赞功能的实现

概要 项目主要基于springboot结合redis 进行设计,每当用户点赞、取消点赞时,将操作信息存储入redis中,然后通过定时任务的方式每隔一段时间进行redis向mysql数据库中数据的存储操作 实现 数据库的结构 | Field | Type | Null | Key | Default | Extra ...

qq_37618461的博客 3603

机器人外接 USB 音响完整配置指南

摘要:本文介绍了为机器人配置外接音响的方法。由于内置音响音量小且有散热噪音,建议使用Type-C接口外接音响。配置步骤包括:1)通过aplay -l命令查看音响端口信息;2)使用aplay命令测试音频播放;3)通过amixer命令设置音量。关键点在于正确识别音响的卡号(如card 2)和设备号(如device 0),并在命令中准确配置这些参数即可实现外接音响的正常使用。

m0_47999117的博客 358

点赞功能redis实现

用redis实现点赞功能,使用定时任务存放数据库

m0_65724855的博客 2248

《Python等级认证CCF-GESP真题解析》专栏总目录

❤️ 专栏名称:《🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级谁》Python编程(1~8级)历届真题解析。🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,限时9.9元,欢迎订阅!

人生就是一个不断学习的过程 1882

用一组可复现实验讲清 ABAP 内表 Standard / Sorted / Hashed 的性能差异

摘要(150字): SAP项目中性能问题常源于ABAP内表选型不当。标准表(STANDARD TABLE)写入快但查找慢(线性扫描),适合遍历场景;排序表(SORTED TABLE)保持有序,支持二分查找,适合范围查询;哈希表(HASHED TABLE)基于唯一键实现常数级查找,适合高频精确匹配。实验表明:标准表+BINARY SEARCH需预排序,成本可能高于直接使用排序表;哈希表在键匹配时性能最优。Gateway和RAP场景中,内表选型直接影响接口响应,建议根据读写负载(追加/遍历/精确查找)选择对应类

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 203

如何用Redis实现朋友圈点赞功能?

如何使用Redis实现朋友圈点赞功能?

qq_30939943的博客 2309

【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1314

用redis实现点赞功能

本文基于 SpringCloud, 用户发起点赞、取消点赞后先存入 Redis 中,再每隔两小时从 Redis 读取点赞数据写入数据库中做持久化存储。 点赞功能在很多系统中都有,但别看功能小,想要做好需要考虑的东西还挺多的。 点赞、取消点赞是高频次的操作,若每次都读写数据库,大量的操作会影响数据库性能,所以需要做缓存。 至于多久从 Redis 取一次数据存到数据库中,根据项目的实际情况定吧,我是暂时设了两个小时。 项目需求需要查看都谁点赞了,所以要存储每个点赞的点赞人、被点赞人,不能简单的做计数。 文章分四

m0_51587250的博客 2765

用 SELECT FOR UPDATE 亲手制造典型数据库死锁——从 ABAP 视角揭秘 RDBMS 的锁争夺战

在日常 ABAP 开发中,多数人只在 ST22 里偶尔瞥见这行 dump,却对背后的原理知之甚少。本文借助社区前辈的经典实验,还原一个可复现的死锁现场,进一步讨论产生根因、检测手段与规避策略,并用真实业务案例串联起数据库、Open SQL 与 SAP NetWeaver 锁管理之间的逻辑链条。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 457

C语言试题一之计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和

1、题目 计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和 2、源代码实现 #include <stdio.h> #include <math.h> double fun1(int n) { if (n <= 0) return 0; int i; double sum = 0.0; for (i = 1; i <= n;...

码莎拉蒂 1万+

Redis实现点赞功能

ZSET问题:防重复点赞,通过 Redis 判断用户是否已点赞,避免重复操作。数据库和 Redis 协同维护点赞状态,确保前端展示一致性。利用 Redis 的原子操作(如 ZSET)快速处理点赞 / 取消点赞请求,减少数据库压力。基于 Redis 有序集合按时间戳排序,高效获取点赞排行榜。Redis数据结构:Redis 有序集合(ZSET),存储用户 ID 和点赞时间戳,保证唯一性( 天然去重);通过 快速判断用户是否已点赞;使用 获取点赞排行榜(如前 5 名);Redis命令:ZADD key sco

A_long_way_to_go的博客 1129

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Redis点赞功能的实现

Redis点赞功能 因为工作,最近需要做点赞功能,刚开始想到是mysql创建两表的做法,后续发现不是不可以,是感觉mysql数据库读写压力大,热门视频会有很多用户点赞,甚至是短时间内被大量点赞, 直接操作数据库从长久来看不是很理想的做法。redis主要的特点就是快, 毕竟主要数据都在内存嘛;(这两句话我抄袭的,干嘛歇着了,方便读者了解性能) 优点 性能高 缓解数据库读写压力 其实我更多的在于缓...

次去留年 3072

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Redis应用2-Redis实现开发者头条页面点赞功能

Redis应用2-Redis实现开发者头条页面点赞功能开发者头条是一个资源丰富的程序猿学习网站。当网站发布新的咨询的时候,内容优秀的咨询总是会被点赞。今天就利用Redis实现这个小小的功能。 为什么使用Redis而不是Mysql实现?Redis 和 Mysql应用场景不同。 从效率来说: Redis的数据存放在内存,所以速度快但是会受到内存空间限制。 MySQL存放在硬盘,在速度上肯定没有Re

noaman_wgs的博客 1万+

Redis如何高效实现点赞、取消点赞功能

点击上方关注 “终端研发部”设为“星标”,和你一起掌握更多数据库知识作者:阿★永来源:blog.youkuaiyun.com/lsy0903/article/details/103949459基于 S...

这个时代,作为程序员可能要学习小程序 632

java使用Redis实现点赞功能

疑问 当看到这个标题,可能会有些大佬有点模糊,因为为什么不用数据库去实现,而用redis来实现这个功能,那我们可以一起来思考一下。 为什么实现redis,而不用数据库 先从安全方面来讲,如果使用数据库,假如用户频繁点赞,取消点赞这些操作的话,那么会给数据库造成压力,如果使用缓存的话,那么压力不会那么大。 从效率方面考虑,redis数据存在与内存,所以速度收到内存影响,数据库存在与硬盘,速度没redis快。 从功能方面考虑,redis只支持几种数据结构,没用数据库支持的多。 Redis几种数据结构的适用场

kires的博客 4524

重学SpringBoot3-集成Redis(十二)之点赞功能实现

在现代的应用中,点赞功能是一个非常常见的需求,尤其在社交媒体、博客等平台上。Redis 作为一个高性能的键值存储系统,由于其读写速度快、支持丰富的数据结构,因此非常适合用来实现实时的点赞功能。本文将介绍如何结合 Spring Boot 3 和 Redis 来实现一个高效的点赞功能。

CoderJia的学习之路 4148

基于redis实现的点赞功能设计

点赞是我们现在经常见到的一个效果,如朋友圈、微博都有点赞的效果,下面这篇文章主要跟大家分享了基于 redis实现的点赞功能设计思路的相关资料,文中介绍的非常详细,对大家实现点赞功能具有一定的参考学习价 值,需要的朋友们下面来一起看看吧。 前言 点赞其实是一个很有意思的功能。基本的设计思路有大致两种, 一种自然是用mysql等 数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到re...

happypX的博客 3903
上一篇: Redisson
下一篇: 操作系统——内存
486过于烦躁
博客等级 码龄6年 17粉丝 34原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值