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

一、博客

关于发布博客这个功能,他就是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来进行按照我们的自定义的规则排序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RKNNToolkit2 推理数据输入问题

RKNNToolkit2 推理数据输入问题 ​ 以前在玩RKNN的时候&#xff0c;下载对应的模型时&#xff0c;由于众多大佬帮忙开源了自己准好的模型和写好的各种后处理&#xff0c;所以当时只要脚本能运行&#xff0c;就不去深究代码的内容和模型。由于最近任务的调整&#xff0c;也慢慢…

ssm职工健康素养数据管理系统设计与实现-计算机毕业设计源码45392

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对职工健康素养数据管理系统等问题&#xff0…

【PowerDesigner】PDM生成REPORT

目录 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1.1 常用模型文件 &#x1f30d;1.2 PowerDesigner使用环境 &#x1f30a;2. PDM生成REPORT &#x1f30a;3. 研究心得 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1.1 常用模型文件 主要使用PowerDesigner的…

6、后端项目初始化

打开idea后&#xff0c; New Project &#xff0c;用Maven构建 Spring Boot 项目 点击Next后&#xff1a;先勾选两个基本的依赖&#xff0c;后面再手动添加其它需要的依赖 Spring Web: 表示是一个web应用程序 Lombok&#xff1a;写实体类的时候添加Data注解后就会自动加上g…

Windows 10 中添加 开机启动 自动运行的程序

Win R 输入 “shell:startup” &#xff0c;回车确定 把 应用的 快捷方式 复制到文件夹中。就会自动开机启动了 参照图&#xff1a;

pdf怎样在线修改大小?压缩pdf文件大小的步骤

现在pdf是提供内容预览常用的一种方式&#xff0c;有很多的信息都会用这种文件格式来存储&#xff0c;当pdf的内容比较多的时候&#xff0c;相对而言生成的文件也会比较大&#xff0c;在上传使用的时候会受到影响&#xff0c;那么有什么方法能够快速调整pdf文件大小呢&#xff…

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运行结…

opencv_核心操作

图像基本操作 访问和修改像素值 import numpy as np import cv2 img cv2.imread(c:/Users/HP/Downloads/basketball.png) h,w,c img.shape #图像大小 print(h,w,c)### 841 1494 3# 通过行和列坐标访问像素值 img[100,100]### 231 ### array([231, 140, 146], dtypeuint8)# …

STM32移植Easylogger输出

简介 EasyLogger 是一款超轻量级 、高性能的 C 日志库&#xff0c;非常适合对资源敏感的软件项目&#xff0c;例如&#xff1a;IoT 产品、可穿戴设备、智能家居等等。相比 log4c、zlog 这些知名的 C 日志库&#xff0c;EasyLogger 的功能更加简单&#xff0c;提供给用户的接口…

如何更改 Windows 默认下载位置?按照以下步骤操作

大家在使用电脑的过程中常常需要下载一些文件等资源&#xff0c;但是一般没有修改时电脑下载资源之后都默认存放在了 C 盘&#xff0c;这也导致 C 盘的空间越来越小。我们可以提前修改电脑的默认下载位置&#xff0c;下面一起来看一看默认下载位置怎么更改。 修改浏览器默认下…

英伟达SSD目标检测代码解析

一、官方原代码 #!/usr/bin/env python3 # # Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Softwa…

利用 AI 深度学习,实现化合物配比最优化解决方案

为什么需要化合物配比的优化&#xff1f; 在化合物制造行业中&#xff0c;化合物的配比是产品质量控制的关键环节。 化合物制造流程 目前&#xff0c;这一过程高度依赖于材料专家和工程技术人员的经验&#xff0c;通过反复试验来验证产品性能&#xff0c;确保其满足市场和客户的…

Linux内核编程(一)内核模块基础

本文目录 前述&#xff1a;内核框架图一、Linux 内核模块概述二、Linux 模块的优点三、知识点1. GPL开源协议2. 查看已安装的模块文件&#xff1a;lsmod 四、常用API1. 入口函数2. 出口函数3. 声明驱动模型出/入口函数4. printk内核输出函数 五、内核源码头文件六、编写内核模块…

在ubuntu16中下载VMware Tools工具

一、打开植入 二、开始安装 打开驱动放置的默认位置 在这里打开终端&#xff1b;添加到/home/你的用户名/Downloand/中 进入后解压 然后进去解压后的文件 终端输入 sudo ./vmware-install.pl 开始安装前的配置&#xff08;很麻烦跟着输就行&#xff09; 继续 出现如上…

电脑想加个WIFI功能,怎么选!

在快速发展的物联网和智能家居时代,Wi-Fi模块作为连接各类智能设备与互联网的桥梁,其重要性不言而喻。而为了让这些模块能够适应各式各样的应用场景,不同的接口技术应运而生。今天,我们就来深入浅出地探讨几种常见的Wi-Fi模块接口,包括它们的工作原理、特点以及适用场景,…

NVIDIA Jetson AI边缘计算盒子

这里写自定义目录标题 烧录系统安装Jetpack 烧录系统 选择一台Linux系统&#xff0c;或者VMware的电脑作为主机&#xff0c;烧录系统和后面安装Jetpack都会用到。 根据供应商的指令烧录的&#xff0c;暂时还没验证官方烧录&#xff08;后续验证补充&#xff09;。 安装Jetpac…

Ant Design的创意之旅:设计师眼中的界面艺术

你知道什么是蚂蚁Ant Design&#xff1f;事实上&#xff0c;绝大多数人都不知道甚至没有听说过蚂蚁Ant Design&#xff0c;本文将围绕蚂蚁Ant Design是什么为大家深入分析&#xff0c;方便大家对蚂蚁Antt Design有清晰的认识。 1. 蚂蚁Ant Design是什么 蚂蚁Ant Design可以简…

【笔记】深度学习入门

神经网络基础 计算机视觉 1.1 人工智能的本质——线性模型 ykxb k为权重&#xff0c;b为偏置 像素点有323233072个任务点 所以权重有3072个&#xff0c;假设有10组类别&#xff0c;注意权重是一个矩阵 1.2 模型更新方法 权重一开始是随机的 权重和损失值&#xff0c;尝试…

基于STM32的智能水产养殖系统(二)

TPS5433IDR TPS5433IDR 是一款由德州仪器 (Texas Instruments) 生产的高效降压转换器&#xff08;Buck Converter&#xff09;。它能够将较高的输入电压转换为较低的输出电压&#xff0c;适用于各种电源管理应用。 主要特性 输入电压范围: 5.5V 至 36V输出电压范围: 0.9V 至 …

解决方案:昇腾aarch64服务器安装CUDA+GCC+CMake,编译安装Pytorch,华为昇腾HPC服务器深度学习环境安装全流程

目录 一、安装CUDA和cudnn1.1、下载CUDA驱动1.2、安装CUDA驱动1.3、配置环境变量1.4、安装cudnn1.5、安装magma-cuda 二、安装gcc编译器三、安装CMake四、安装NCCL五、编译安装Pytorch5.1、前提准备5.2、下载pytorch源码5.3、配置环境变量5.4、Pytorch编译安装5.5、测试Pytorch…