基于Redis实现点赞及排行榜功能

news2024/11/13 11:10:29

微信公众号访问地址:基于Redis实现点赞及排行榜功能

推荐文章:

1、SpringBoot整合多数据源,并支持动态新增与切换(详细教程)

2、​​​​​​Redis中使用lua脚本

3、SpringBoot统一标准响应格式及异常处理

4、SpringBoot+MyBatis流式查询,处理大规模数据,提高系统的性能和响应能力

5、SpringBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表

6、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据

7、Redis实现消息队列

一、简介

1.1、点赞相关需求:

      1、同一个用户只能点赞一次,再次点击则取消点赞(点赞/取消点赞);

      2、如果当前用户已经点赞,则点赞按钮高亮显示(前端实现,判断字段Blog类的isLik属性)。

1.2、实现步骤:

      1、给Blog类中添加一个isLike字段,标识是否被当前用户点赞;

      2、修改点赞功能,利用Redis的set集合判断是否点赞过,未点赞过则点赞数+1,已点赞过则点赞数-1;

      3、修改根据id查询Blog的业务,判断当前登录用户是否点赞过,赋值给isLike字;

      4、修改分页查询Blog业务,判断当前登录用户是否点赞过,赋值给isLike字段。

1.3、点赞实现思路:

1.4、排行榜实现:

      分析:由于需要对点赞功能进行排行榜分析,按照点赞时间先后排序,返回最早点赞的Top5的用户,所以最好是选择SortedSet实现功能。(特别说明:代码获取方式在文章结尾)

涉及到表信息:

二、常用的命令

2.1、zadd

案例:

redis:0>zadd myzset 1 a1"1"redis:0>zadd myzset 2 a2"1"

2.2、zscore

案例:

redis:0>zscore myzset a2"2"redis:0>zscore myzset a3"5"

2.3、zrem

案例:

redis:0>zrem myzset a2"1"redis:0>zscore myzset a2nullredis:0>

2.4、zrange

案例:获取前四个元素

redis:0>zrange blog:liked:6 0 41) "999"2) "111"3) "222"

三、代码实现

3.1、点赞/取消点赞功能

核心代码实现:

public Result likeBlog(Long id, Long userId) {
        // 1.获取登录用户 展示用接口传值
//        Long userId = UserHolder.getUser().getId();
        // 2.判断当前登录用户是否已经点赞
        String key = BLOG_LIKED_KEY + id;
        //redis:0>zscore myzset a3  -> "5"
        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集合  zadd key value score
            if (isSuccess) {
                //ZADD key score1 member1 [score2 member2]
                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();
    }
控制层:
   @ApiOperation(value="点赞功能", notes="likeBlog")
    @PostMapping("/liked")
    public Result likeBlog(@RequestParam("id") Long id,@RequestParam("userId") Long userId) {
        return blogService.likeBlog(id,userId);
    }

接口调用:

结果展示:

3.2、排行榜功能

核心代码实现:

  public Result queryBlogLikes(Long id) {
        String key = BLOG_LIKED_KEY + id;
        // 1.查询top5的点赞用户 zrange key 0 4
        Set<String> top5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);
        //判断集合是否为空(包括null和没有元素的集合)
        //参考hutool工具:https://www.hutool.cn/docs/#/core
        if(CollUtil.isEmpty(top5)){
            return Result.ok(Collections.emptyList());
        }
        // 2.解析出其中的用户id
        List<Long> ids = top5.stream().map(Long::valueOf).collect(Collectors.toList());
        String idStr = StrUtil.join(",", ids);
        // 3.根据用户id查询用户 WHERE id IN ( 5 , 1 ) ORDER BY FIELD(id, 5, 1)
        //数据量少基本不影响性能,若获取top数量比较大的时候,就需要优化性能
        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);
    }

控制层:

@ApiOperation(value="根据ID查询点赞的所有用户", notes="queryBlogLikes")    @GetMapping("/likes/{id}")    public Result queryBlogLikes(@PathVariable("id") Long id) {        return blogService.queryBlogLikes(id);    }

接口调用及展示:

四、源码获取方式

     更多优秀文章,请关注个人微信公众号或搜索“程序猿小杨”查阅。然后回复:源码,可以获取该项目对应的源码及表结构,开箱即可使用。

说明:后面redis相关操作的功能都会放在此文件夹中,需要相关功能的,只需要获取最新的资源即可。

 如果大家对相关文章感兴趣,可以关注微信公众号"程序猿小杨",会持续更新优秀文章!如果这篇文章对您有所帮助、有所启发,请帮忙 分享、收藏、点赞、在看,您的支持就是我坚持下去的最大动力!谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客小白月赛75D题题解

文章目录 [ 矩阵](https://ac.nowcoder.com/acm/contest/60063/D)问题建模问题分析1.分析所求代码 矩阵 问题建模 给定一个n*m的字符矩阵&#xff0c;字符矩阵内包含两种字符’0’和’1’&#xff0c;从&#xff08;1,1)出发&#xff0c;每次可以花费一单位时间向上下左右移动…

Gradle(一)Windows下安装

目录 一、简介二、下载和安装1.下载2.配置环境变量3.指定个人用户目录4.验证 三、IDEA 设置 Gradle 官网地址&#xff1a;https://gradle.org/官方文档&#xff1a; https://docs.gradle.org/current/userguide/userguide.html下载地址&#xff1a; https://gradle.org/release…

16.5.3 【Linux】SELinux 三种模式的启动、关闭与观察

并非所有的 Linux distributions 都支持 SELinux 的&#xff0c;所以你必须要先观察一下你的系统版本为何。 目前 SELinux 依据启动与否&#xff0c;共有三种模式&#xff0c;分别如下&#xff1a; enforcing&#xff1a;强制模式&#xff0c;代表 SELinux 运行中&#xff0c;…

Codeforces算法心得——A. Array Coloring

大家好&#xff0c;我是晴天学长&#xff0c;确实全世界最大的算法竞赛平台有很多独特且创新的地方&#xff0c;后面我会持续的更新的&#xff01;加油&#xff01;&#x1f4aa;&#x1f4aa;&#x1f4aa; 1 &#xff09;A. Array Coloring 2) .算法思路 数组中的奇数个数一…

机器学习深度学习——自注意力和位置编码(数学推导+代码实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——注意力分数&#xff08;详细数学推导代码实现&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习…

导读-Linux简介

Linux简介 ​ 总所周知&#xff0c;计算机系统包含硬件和软件两部分。硬件部分被称为裸机&#xff0c;主要包括中央处理器&#xff08;CPU&#xff09;、内存、外存和各种外部设备。软件部分主要包括系统软件和应用软件两部分。系统软件包括操作系统、汇编语言、编译程序、数据…

Leetcode Top 100 Liked Questions(序号53~74)

53. Maximum Subarray 题意&#xff1a;一个数组&#xff0c;找到和最大的子串 我的思路 我记得好像On的动态规划来做的&#xff1f;但是想不起来了&#xff0c;先死做&#xff0c;用的前缀和——TLE超时 那就只能想想dp怎么做了 假设dp[i]表示的是以 i 为右端点的最大的…

在医疗行业数字孪生能做些什么?

数字孪生技术随着发展正在多行业遍地开花&#xff0c;在之前的文章中也为大家介绍过数字孪生的行业应用&#xff0c;今天带大家一起探讨一下数字孪生在医疗行业的表现。其实数字孪生在医疗行业已有很多应用案例&#xff0c;从医疗诊断到手术模拟&#xff0c;再到药物研发&#…

android内存分析工具记录,请利用好最后2个神器

相机见证了java内存暴增和native持续增长的问题&#xff0c;因此这里记录一下使用的工具情况&#xff0c;方便后续继续使用 一、java 内存 如果是java层的内存可以直接借助leakCanary工具&#xff0c;配置也很简单&#xff0c;直接在build.gradle中添加依赖即可&#xff1a; …

Java语言怎么输出有颜色的字符串呢?

在Java中&#xff0c;我们应该如何输出有颜色的文字字符串呢&#xff1f; 目录 一、使用方法 二、举例说明 三、常见的颜色及其对应的ANSI转义序列 一、使用方法 在Java中&#xff0c;可以使用ANSI转义序列来改变输出文本的颜色。 二、举例说明 &#xff08;1&#xff…

【mysql报错解决】MySql.Data.MySqlClient.MySqlException (0x80004005)或1366

场景&#xff1a;c#使用mysql数据库执行数据库迁移&#xff0c;使用了新增inserter的语句&#xff0c;然后报错 报错如下&#xff1a; 1.MySql.Data.MySqlClient.MySqlException (0x80004005): Incorrect string value: ‘\xE6\x9B\xB4\xE6\x94\xB9…’ for column ‘Migratio…

LVS 负载均衡集群

集群 集群&#xff08;Cluster&#xff09;是一组相互连接的计算机或服务器&#xff0c;它们通过网络一起工作以完成共同的任务或提供服务。集群的目标是通过将多台计算机协同工作&#xff0c;提高计算能力、可用性、性能和可伸缩性&#xff0c;适用于大量高并发的场景。 集群…

安科瑞变电所运维平台在电力系统中应用分析

摘要&#xff1a;现代居民生活、工作对电力资源的需求量相对较多&#xff0c;给我国的电力产业带来了良好的发展机遇与挑战。探索电力系统基本构成&#xff0c; 将变电运维安全管理以及相应的设备维护工作系统性开展&#xff0c;能够根据项目实践工作要求&#xff0c;将满足要求…

【讨论】视频监控集中存储方案如何做?

视频监控集中存储是指将多个视频监控摄像头所捕捉到的视频信号集中存储于一个中央设备&#xff0c;这个中央设备可以是服务器、网络存储设备或其他专用设备。通过集中存储&#xff0c;可以避免因为存储设备分散而导致的管理不便和难以有效地管理和检索视频数据&#xff0c;同时…

iTOP-RK3568开发板ubuntu环境下安装Eclipse

eclipse 是使用 Java 语言开发的&#xff0c;一个 Java 应用程序&#xff0c;这意味着 eclipse 只能运行在 Java虚拟机上。倘若没有安装 JDK&#xff08;Java Development Kit&#xff09;&#xff0c;即使在 ubuntu 上安装了 eclipse&#xff0c;也不能运行&#xff0c;所以要…

软文发布问题解答:高效宣传与推广指南

以下是一秒推小编针对软文发布的20个常见问题及回答&#xff1a; 1. 什么是软文&#xff1f; 答&#xff1a;软文是指用文学手法、写作技巧撰写的宣传文章&#xff0c;以实现对特定受众的陈述、说明和推销。 2. 发布软文的目的是什么&#xff1f; 答&#xff1a;发布软文的目…

奥威BI数据可视化工具:360度呈现数据,告别枯燥表格

随着企业数据量的不断增加&#xff0c;如何有效地进行数据分析与决策变得越来越重要。奥威BI数据可视化工具作为一款强大的数据分析工具&#xff0c;在帮助企业深入挖掘数据价值方面具有显著优势。 奥威BI数据可视化工具是一款基于数据仓库技术的数据分析工具&#xff0c;具有…

RTT(RT-Thread)ADC设备(RTT保姆级介绍)

目录 ADC设备 前言 ADC相关参数说明 访问ADC设备 配置ADC设备 ADC实例 硬件设计 软件设计 ADC设备 前言 ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。 对于ADC的详细介绍和在STM32中的裸机应用可参考以下…

C语言暑假刷题冲刺篇——day2

目录 一、选择题 二、编程题 &#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C语言每日一练 ✨其他专栏&#xff1a;代码小游戏C语言初阶&#x1f91d;希望作者的文章能对你…

基于OFDM+64QAM系统的载波同步matlab仿真,输出误码率,星座图,鉴相器,锁相环频率响应以及NCO等

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 2.1 OFDM原理 2.2 64QAM调制 2.3 载波同步 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................…