Redis实战篇4:发布博客与点赞

news2025/3/12 8:58:36

一、博客

关于发布博客这个功能,他就是mysql相关的数据库,不涉及到redis,但是我们可以来看一下其相关的表的功能来了解一下:
博客表:

与其对应的评论表:
 

关于其数据库的设计也应该好好的学习一下。 

二、点赞

1.关于点赞我们常规有两个需求

  1. 同一个用户只能点一次赞,再次点赞会取消点赞;
  2. 如果当前用户已经点赞,则点赞按钮高亮提示;

2.附加需求:

  1. 点击blog详情页,要有点赞排行榜的前五个用户头像显示;

3.实现步骤:

  1. 给Blog类中添加一个isLike字段,标示是否被当前用户点赞;
  2. 修改点赞功能,利用Redis的set集合判断是否点赞过,未点赞过则点赞数+1,已点赞过则点赞数-1;
  3. 修改根据id查询Blog的业务,判断当前登录用户是否点赞过,赋值给isLike字段;
  4. 修改分页查询Blog业务,判断当前登录用户是否点赞过,赋值给isLike字段;

4.接下来我们要挑选redis中使用的数据结构: 

 

看完上图之后,list结构不唯一,不符合 同一个用户只能点一次赞 的存储要求,而set无法进行排序,所以我们只能选择SortedSet符合我们的需求。

三、点赞排行榜 

理论已经有了,我们开始实践

首先,在Redis中存储点赞的语句应为 zadd key value score 
其中 key为店铺ID  value为UserId  score为当前时间戳 这样可以保存查的时候按照时间顺序查

stringRedisTemplate.opsForZSet().add(key,userId.toString(),System.currentTimeMillis());

查为:

stringRedisTemplate.opsForZSet().score(key, userId.toString());
@Override
public Result likeBlog(Long id) {
    // 1. 获取当前登录用户
    Long userId = UserHolder.getUser().getId();
    // 2. 判断用户是否点赞
    String key= RedisConstants.BLOG_LIKED_KEY+id;
    Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());
    // 3. 如果未点赞则可以点赞
    if(score == null){
        // 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. 如果已经点赞,则点赞数-1
        boolean isSuccess = update().setSql("liked=liked-1").eq("id", id).update();
        // 5. 将用户剔除Redis集合
        if(isSuccess){
            stringRedisTemplate.opsForZSet().remove(key,userId.toString());
        }
    }
    return Result.ok();
}

 其TOP5查询如下:

@Override
public Result queryBloglikes(Long id) {
    // 点赞TOP5
    // 查询TOP5 zrange key 0 4
    String key= RedisConstants.BLOG_LIKED_KEY+id;
    Set<String> userTOP5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);
    if(userTOP5 == null || userTOP5.isEmpty()){
        return  Result.ok(Collections.emptyList());
    }
    // 解析出用户ID
    List<Long> ids = userTOP5.stream().map(Long::valueOf).collect(Collectors.toList());
    String idStr = StrUtil.join(",", ids);
    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());
    return Result.ok(userDTOS);
}

这里我们主要关注:userService.query().in("id",ids).last("order by field(id,"+idStr+")").list()
我们为什么不直接用userService.listByIds(ids)查询呢? 其实这么查询 底层也是in 但是in的查询不会按照in括号中的顺序查询,例如in(1,2,3,4,5),但是其返回结果不一定是 1,2,3,4,5 所以要用last来进行按照我们的自定义的规则排序。

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

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

相关文章

盲盒小程序开发:传统与当代的创新融合

谈起盲盒&#xff0c;许多人并不陌生。近几年&#xff0c;盲盒一直是年轻人首选的娱乐消费方式&#xff0c;小小的盲盒为消费者带来了极大的欢乐。 盲盒小程序是将传统的盲盒玩法与线上购物方式相融合&#xff0c;对拆盲盒进行创新&#xff0c;为盲盒消费者带来全新的盲盒体验…

宋街宣传活动-循环利用,绿色生活

善于善行回收团队是一支致力于推动环保事业&#xff0c;积极倡导和实践绿色生活的志愿者队伍。我们的宗旨是通过回收再利用&#xff0c;减少资源浪费&#xff0c;降低环境污染&#xff0c;同时提高公众的环保意识&#xff0c;共同构建美丽和谐的家园。 善于善行志愿团队于2024年…

NLP原理系列1-说清楚transformer原理

NLP原理系列1-说清楚transformer原理 来用思维导图和截图描述。 思维导图的本质是 变化(解决问题)-> 更好的&#xff0c; 或者复杂问题拆分为小问题 以及拆分的思路。 经典全图 0 transformer的前世今生 1 seq2seq 序列化数据 到 序列化数据&#xff0c; 只要能把 训练…

在多项目管理中,企业如何平衡项目资源分配?

数字化时代&#xff0c;多项目管理已经成为了企业内部的常态。组织可以在不同项目之间进行资源合理分配和调度&#xff0c;避免资源浪费和重复使用、提高资源利用率&#xff0c;从而提升项目执行效率和组织整体竞争力。 然而在多项目管理中&#xff0c;资源管理却面临着多重难点…

CrowdSec 防护软件安装与使用

1、环境介绍 操作系统版本&#xff1a;centos 7.9 2、存储库安装 curl -s https://install.crowdsec.net | sudo sh3、安装安全引擎CrowdSec yum install crowdsec启动 systemctl start crowdsec systemctl enable crowdsec4、安装修正组件 yum install crowdsec-firewall…

认证申报 | 中华环保联合会 “全国环境友好企业”认证服务

中华环保联合会水环境治理专业委员会秘书处 联系人&#xff1a;王小雅 电话 &#xff1a;010-51651268 13718793867 网址&#xff1a;www.acef-water.com.cn 01什么是“全国环境友好企业”认证 “全国环境友好企业”认证是经国家认证认可监督管理委员会审查监督并在全国认…

基于kdtree的三种搜索近邻点(python版本)

1、前言 点云中近邻点搜索查询是一种非常常见的数据处理操作步骤&#xff0c;近邻点搜索方式包括k近邻搜索、近距离搜索&#xff08;球体近邻搜索&#xff09;、圆柱体搜索三种方式&#xff0c;每一种搜索方式适用的场景各不相同。其中kdtree搜索是一种有效搜索近邻点方式&…

细说ARM MCU的串口接收数据的实现过程

目录 一、硬件及工程 1、硬件 2、软件目的 3、创建.ioc工程 二、 代码修改 1、串口初始化函数MX_USART2_UART_Init() &#xff08;1&#xff09;MX_USART2_UART_Init()串口参数初始化函数 &#xff08;2&#xff09;HAL_UART_MspInit()串口功能模块初始化函数 2、串口…

计划任务 之 一次性的计划任务

计划任务 作用:定时自动完成特定的工作 计划任务的分类&#xff1a; &#xff08;1&#xff09;一次性的计划任务 例如下周三对系统的重要文件备份一次 &#xff08;2&#xff09;周期性重复计划任务 例如每天晚上12&#xff1a;00备份一次 一次性的任务计划&#xff1a…

【java计算机毕设】图书管理系统javaweb java MySQL springboot vue html maven送文档+ppt 代码源码计算机项目

1项目功能 【java计算机专业学长毕业设计分享】 智慧图书管理系统 Java SpringBoot vue HTML MySQL 前后端分离 2项目介绍 系统功能&#xff1a; 智慧图书管理系统包括管理员和用户两种角色。 管理员的功能包括在个人中心修改个人信息和密码&#xff0c;管理员功能模块管理管理…

Spark学习——不同模式下执行脚本

举个简单的例子&#xff1a;使用spark官方用例"取pi值" 一、local模式 进入spark目录执行后台命令&#xff1a; bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master local[*] \ ./examples/jars/spark-examples_2.12-3.2.1.jar \ 10运行结…

芯片级激光器研发取得新进展

欢迎关注GZH《光场视觉》 自 20 世纪 60 年代以来&#xff0c;激光给世界带来了革命性的变化&#xff0c;如今已成为从尖端手术和精密制造到光纤数据传输等现代应用中不可或缺的工具。 但是&#xff0c;随着激光应用需求的增长&#xff0c;挑战也随之而来。例如&#xff0c;光…

本周MoonBit新增Wasm1引用计数支持、语法即将添加错误恢复机制

MoonBit更新 【Wasm MVP】Wasm1 后端添加基于 Perceus 算法的引用计数支持 【语法】throw raise try catch 均被保留为关键字 为了即将添加的错误处理机制 【Core】List与sorted_map被移动至core/immut下 List被移动至core/immut/list包中&#xff0c;并被移除内置类型支持 …

重邮计算机网络803-(1)概述

目录 一.计算机网络向用户提供的最重要的功能 二.互联网概述 1.网络的网络 2.计算机网络的概念 3. 互联网发展的三个阶段 4.制订互联网的正式标准要经过以下的四个阶段 5.互联网的组成&#xff08;功能&#xff09; 6.互联网功能 7.互联网的组成&#xff08;物理&…

为什么50etf期权涨幅这么大?

今天带你了解为什么50etf期权涨幅这么大&#xff1f;50ETF期权涨幅大是因为跟上证50指数&#xff0c;另外期权的特征自带杠杆效应在虚值合约上有特别高以小博大的效果。 为什么50etf期权涨幅这么大&#xff1f; 标的资产价格的大幅波动&#xff1a;50ETF期权的内在价值与50ETF…

坦白局考PMP真的能缓解职场焦虑吗?

我就是那个花了大几千去考了一张190个国家都认可的高含金量证书&#xff0c;每三年还要花150美金续证&#xff0c;但这个证书给我的生活带来前所未有的改变。我不知道其他人考了PMP证书如今怎么样了&#xff0c;我只说我自己&#xff0c;今天就来聊聊从我了解到拿证这一过程&am…

大规模胰腺癌检测通过非对比增强CT和深度学习| 文献速递-视觉通用模型与疾病诊断

Title 题目 Large-scale pancreatic cancer detection via non-contrast CT and deep learning 大规模胰腺癌检测通过非对比增强CT和深度学习 01 文献速递介绍 胰腺导管腺癌&#xff08;PDAC&#xff09;是最致命的实体恶性肿瘤&#xff0c;通常在晚期和不可手术的阶段被检…

HyperSnap软件最新版下载-HyperSnap官方最新版附加详细安装步骤

​HyperSnap是一个老牌优秀的屏幕截图工具&#xff0c;全新界面&#xff0c;不仅能抓取标准桌面程序&#xff0c;还能抓取 DirectX, 3Dfx Glide的 游戏视频或 DVD 屏幕图&#xff0c;能以 20 多种图形格式&#xff08;包括&#xff1a;BMP, GIF,JPEG, TIFF, PCX等&#xff09;保…

MS6001/2/4低功耗,低噪声 CMOS 轨到轨输入输出运算放大器

MS6001/2/4 运算放大器具有极低功耗&#xff0c;轨到轨输入输出&#xff0c;低 的输入电压和低的电流噪声。具体表现在可工作在幅度为 1.8V 到 5V 的单电源或者双电源条件&#xff0c;低功耗和低噪声使得 MS6001/2/4 能够用在可移动设备上&#xff0c;输入输出的轨到轨…

PyTorch 维度变换-Tensor基本操作

以如下 tensor a 为例&#xff0c;展示常用的维度变换操作 >>> a torch.rand(4,3,28,28) >>> a.shape torch.Size([4, 3, 28, 28])view / reshape 两者功能完全相同: a.view(shape) >>> a.view(4,3,28*28) ## a.view(4,3,28,28) 可恢复squeeze…