当前位置: 首页 > news >正文

redis实现点赞功能,排行榜

image

 image

package com.hmdp.service.impl;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hmdp.dto.Result;
import com.hmdp.dto.UserDTO;
import com.hmdp.entity.Blog;
import com.hmdp.entity.User;
import com.hmdp.mapper.BlogMapper;
import com.hmdp.service.IBlogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.service.IUserService;
import com.hmdp.utils.SystemConstants;
import com.hmdp.utils.UserHolder;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;import static com.hmdp.utils.RedisConstants.BLOG_LIKED_KEY;/*** <p>*  服务实现类* </p>** @author 虎哥* @since 2021-12-22*/
@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {@Resourceprivate IUserService userService;@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic Result queryHotBlog(Integer current) {// 根据用户查询Page<Blog> page = query().orderByDesc("liked").page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));// 获取当前页数据List<Blog> records = page.getRecords();// 查询用户records.forEach(blog ->{this.queryBlogUser(blog);this.isBlogLiked(blog);});return Result.ok(records);}@Overridepublic Result queryBlogById(Long id) {// 1.查询blogBlog blog = getById(id);if (blog == null) {return Result.fail("笔记不存在");}// 2.查询blog相关的用户queryBlogUser(blog);// 3.查询blog是否被点赞isBlogLiked(blog);return Result.ok(blog);}private void isBlogLiked(Blog blog) {// 0.获取登录用户UserDTO user = UserHolder.getUser();if(user == null){//用户未登录,无需查询是否点赞return;}Long userId = user.getId();// 1.判断当前登录用户是否已经点赞String key = BLOG_LIKED_KEY + blog.getId();Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());blog.setIsLike(score != null);}@Overridepublic Result likeBlog(Long id) {// 0.获取登录用户Long userId = UserHolder.getUser().getId();// 1.判断当前登录用户是否已经点赞String key = BLOG_LIKED_KEY + id;Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());if(score == null ){// 2.如果未点赞,可以点赞boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();if(isSuccess){stringRedisTemplate.opsForZSet().add(key, userId.toString(),System.currentTimeMillis());}}else {// 3.已点赞,取消点赞boolean isSuccess = update().setSql("liked = liked - 1").eq("id", id).update();if(isSuccess){stringRedisTemplate.opsForZSet().remove(key, userId.toString());}}return Result.ok();}@Overridepublic Result queryBlogLikes(Long id) {String key = BLOG_LIKED_KEY + id;// 1.查询top5的点赞用户 zrange key 0 4Set<String> top5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);if(top5 == null || top5.isEmpty()){return Result.ok(Collections.emptyList());}// 2.解析出其中的用户idList<Long> ids = top5.stream().map(Long::valueOf).collect(Collectors.toList());String idStr = StrUtil.join(",",ids);// 3.根据用户id查询用户,得用ORDER BY FIELD(id,5,1)
//        List<UserDTO> userDTOS = userService.listByIds(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);}private void queryBlogUser(Blog blog) {Long userId = blog.getUserId();User user = userService.getById(userId);blog.setName(user.getNickName());blog.setIcon(user.getIcon());}
}

 

http://www.jsqmd.com/news/186839/

相关文章:

  • C++26 std::future异常机制剧变:3大核心改进详解
  • 2026 的第一场雪
  • msvcp110.dll文件损坏或丢失怎么办? 附免费下载方法
  • C++26 post条件详解:掌握契约编程的未来核心技术
  • 如何在C++26中精准绑定线程到指定CPU核心?(附完整代码示例)
  • C++如何高效布局量子比特状态?:从缓存行对齐到SIMD优化全解析
  • msvcp140.dll文件损坏或丢失怎么办? 附免费下载方法
  • 复制lora_default.yaml模板进行个性化训练配置的最佳实践
  • Session和Cookie有什么区别
  • 你还在手动写序列化函数?C++26反射让一切自动化(仅限内部资料)
  • 智能指针与锁的完美搭配,深度解析C++多线程资源安全机制
  • ACPI!ACPIBuildDeviceExtension函数分析之建立了第一个子设备扩展
  • 高性能C++服务背后的秘密(多线程资源调度优化实战案例)
  • C++26任务优先级机制全面曝光(下一代并发编程革命)
  • CircleCI云端构建加速lora-scripts镜像打包发布流程
  • CI/CD流水线中集成lora-scripts自动测试与发布流程
  • 微信公众号推文介绍lora-scripts最新功能更新动态
  • 导师推荐10个AI论文写作软件,专科生轻松搞定毕业论文!
  • Teambition任务分配明确lora-scripts各成员职责分工
  • JLink烧录过程中SWD接口驱动行为解析
  • C++26 prioritized任务调度:3个你必须掌握的实时系统编程技巧
  • 基于lora-scripts的赛博朋克艺术风格生成器部署全过程
  • C++26中std::future异常处理全面升级(专家级避坑指南)
  • RabbitMQ消息队列解耦lora-scripts训练任务提交与执行过程
  • 为什么C++26的prioritized特性将改变嵌入式开发格局(仅限少数人掌握的核心技术)
  • 举办线上Workshop推广lora-scripts使用经验交流活动
  • 【C++26性能飞跃指南】:掌握std::execution on函数的3个关键技巧
  • 【C++26契约编程重大突破】:深度解析post条件如何重塑代码可靠性
  • 关键规则笔记
  • 北京网红集装箱定制,口碑推荐一览,集装箱设计/箱式房/集成房屋设计/活动板房,网红集装箱公司怎么选择 - 品牌推荐师