关注、取关、Redis实现共同关注、 博客推送与分页查询
@Resourceprivate StringRedisTemplate stringRedisTemplate;@Resourceprivate IUserService userService;@Overridepublic Result follow(Long followUserId, Boolean isFollow) {//1.获取登陆的用户Long userId = UserHolder.getUser().getId();//1.判断是关注还是取关if(isFollow){//关注,新增数据Follow follow = new Follow();follow.setUserId(userId);follow.setFollowUserId(followUserId);boolean isSuccess = this.save(follow);if(isSuccess){// 把关注用户的id,放入到redis的set集合 sadd userId followerUserIdString key = "follows:" + userId;stringRedisTemplate.opsForSet().add(key, followUserId.toString());}}else {//取关,删除QueryWrapper<Follow> queryWrapper = new QueryWrapper<>();queryWrapper.eq("follow_user_id", followUserId).eq("user_id", userId);boolean isSuccess = this.remove(queryWrapper);if(isSuccess){//从redis集合中移除String key = "follows:" + userId;stringRedisTemplate.opsForSet().remove(key, followUserId.toString());}}return Result.ok();}@Overridepublic Result isFollow(Long followUserId) {//1.获取登陆的用户Long userId = UserHolder.getUser().getId();//查询是否关注Integer count = this.query().eq("follow_user_id", followUserId).eq("user_id", userId).count();return Result.ok(count > 0);}@Overridepublic Result followCommons(Long id) {//获取当前的用户Long userId = UserHolder.getUser().getId();//知道两个用户在Redis中求交集String key1 = "follows:" + userId;String key2 = "follows:" + id;Set<String> intersect = stringRedisTemplate.opsForSet().intersect(key1, key2);if(intersect == null || intersect.isEmpty()){//无交集return Result.ok(Collections.emptyList());}//通过Set集合解析出Id集合List<Long> ids = intersect.stream().map(Long::valueOf).collect(Collectors.toList());//查询用户List<UserDTO> users = userService.listByIds(ids).stream().map(user -> BeanUtil.copyProperties(user, UserDTO.class)).collect(Collectors.toList());return Result.ok(users);}

博客推送与分页查询

查询的控制层
@GetMapping("/of/follow")public Result queryBlogOfFollow(@RequestParam("lastId") Long max, @RequestParam(value = "offset", defaultValue = "0") Integer offset){return blogService.queryBlogOfFollow(max, offset);}
发布与查询的服务层
//大V发布,并进行推送@Overridepublic Result saveBlog(Blog blog) {// 获取登录用户UserDTO user = UserHolder.getUser();blog.setUserId(user.getId());// 保存探店博文boolean isSuccess = this.save(blog);if(!isSuccess){return Result.fail("新增笔记失败");}//查询笔记作者的所有粉丝 follow_user_id时大V的idList<Follow> follows = followService.query().eq("follow_user_id", user.getId()).list();//推送笔记id给所有粉丝for (Follow follow : follows) {//获取粉丝idLong userId = follow.getUserId();//推送String key = "feed:" + userId;stringRedisTemplate.opsForZSet().add(key, blog.getId().toString(), System.currentTimeMillis());}// 返回idreturn Result.ok(blog.getId());}//粉丝收到,并实现滚动分页查询@Overridepublic Result queryBlogOfFollow(Long max, Integer offset) {//1.获取当前用户Long userId = UserHolder.getUser().getId();//2.查询收件箱 ZREVRANGEBYSCORE key max min limit offset countString key = FEED_KEY + userId;Set<ZSetOperations.TypedTuple<String>> typedTuples = stringRedisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, 0, max, offset, 2);//非空判断if(typedTuples == null || typedTuples.isEmpty()){return Result.ok();}//3.解析数据:blogId,minTime(时间戳)、offsetList<Long> ids = new ArrayList<>(typedTuples.size());long minTime = 0;int os = 1; //最少为一个与最小一样for (ZSetOperations.TypedTuple<String> typedTuple : typedTuples) {//获取idids.add(Long.valueOf(typedTuple.getValue()));//获取分数long time = typedTuple.getScore().longValue();if(time == minTime){os++;}else {minTime = time;os = 1;}}//4.根据id查询blogString idStr = StrUtil.join(",", ids);List<Blog> blogs = this.query().in("id", ids).last("ORDER BY FIELD(id," + idStr + ")").list();for (Blog blog : blogs) {//查询blog有关的用户this.queryBlogUser(blog);//查询blog是否被点赞this.isBlogLiked(blog);}//5.封装并返回ScrollResult r = new ScrollResult();r.setList(blogs);r.setOffset(os);r.setMinTime(minTime);return Result.ok(r);}
相关文章:
关注、取关、Redis实现共同关注、 博客推送与分页查询
Resourceprivate StringRedisTemplate stringRedisTemplate;Resourceprivate IUserService userService;Overridepublic Result follow(Long followUserId, Boolean isFollow) {//1.获取登陆的用户Long userId UserHolder.getUser().getId();//1.判断是关注还是取关if(isFollo…...
专业高清录屏软件!Mirillis Action v4.40 解锁版下载,小白看了都会的安装方法
Mirillis Action!(暗神屏幕录制软件)专业高清屏幕录像软件,被誉为游戏视频三大神器之一。这款屏幕录制软件和游戏录制软件,拥有三大硬件加速技术,支持以超高清视频画质录制桌面和实况直播,超清视频画质&…...
胤娲科技:AI重塑会议——灵动未来,会议新纪元
你是否曾经历过这样的会议场景:会议纪要不准确,人名张冠李戴;错过会议,却无从回顾关键内容;会议效率低下,时间白白流逝? 这些问题仿佛成了现代会议的“顽疾”。然而,随着AI技术的飞速…...
Python画笔案例-080 绘制 颜色亮度测试
1、绘制 颜色亮度测试 通过 python 的turtle 库绘制 颜色亮度测试,如下图: 2、实现代码 绘制 颜色亮度测试,以下为实现代码: """颜色亮度测试.py本程序需要coloradd模块支持,请在cmd窗口,即命令提示符下输入pip install coloradd进行安装。本程序演示brig…...
MATLAB工具库:数据统计分析工具MvCAT、MhAST等
MATLAB工具库:数据统计分析工具MvCAT、MhAST等 工具1:Multivariate Copula Analysis Toolbox (MvCAT)MATLAB中运行 工具2:Multi-hazard Scenario Analysis Toolbox (MhAST) 参考 The University of California-软件库-Software 工具1…...
角色动画——RootMotion全解
1. Unity(2022)的应用 由Animtor组件控制 在Animation Clip下可进行详细设置 官方文档的介绍(Animation选项卡 - Unity 手册) 上述动画类型在Rag选项卡中设置: Rig 选项卡上的设置定义了 Unity 如何将变形体映射到导入模型中的网格,以便能够将其动画化。 对于人…...
加密软件的桌面管理系统有什么?
1、IT资源管控:协助企事业单位管理者对内部计算机、宽带、打印、外围设备等IT资源进行管控,提高IT资源利用率。 2、规范内网行为:规范员工的计算机使用行为、网络使用行为、IT资产使用行为、设备使用行为 等,令员工活动在合规范围…...
【stm32】寄存器(stm32技术手册下载链接)
1、资料下载 RM0008_STM32F101xx,STM32F102xx,STM32F103xx,STM32F105xx和STM32F107xx单片机参考手册 | STMCU中文官网 2、代码 设置PB7 //设置PB7 #define SDA_IN() {GPIOB->CRL&0X0FFFFFFF;GPIOB->CRL|(u32)8<<28;} #define SDA_OUT() {GPIOB->…...
django的路由分发
前言: 在前面我们已经学习了基础的Django了,今天我们将继续学习,我们今天学习的是路由分发: 路由分发是Web框架中的一个核心概念,它指的是将不同的URL请求映射到对应的处理函数(视图)的过程。…...
《贪吃蛇小游戏 1.0》源码
好久不见! 终于搞好了简易版贪吃蛇小游戏(C语言版),邀请你来玩一下~ 目录 Snake.h Snake.c test.c Snake.h #include<stdio.h> #include<windows.h> #include<stdbool.h> #include<stdlib.h> #inclu…...
初入网络学习第一篇
引言 不磨磨唧唧,跟着学就好了,这个是我个人整理的学习内容梳理,学完百分百有收获。 1、使用的网络平台:eNSP 下载方法以及内容参考这篇文章 华为 eNSP 模拟器安装教程(内含下载地址)_ensp下载-CSDN博客https://b…...
(项目管理系列课程)项目规划阶段:项目范围管理-收集需求
在项目管理中,“规划过程组”是指一系列旨在定义和细化项目目标、规划如何达到这些目标并管理项目工作的过程。在这个过程中,“收集需求”是一个至关重要的活动,它涉及到识别和记录项目干系人的需求,以确保项目最终能够满足干系人…...
SQl注入文件上传及sqli-labs第七关less-7
Sql注入文件上传 1、sql知识基础 secure_file_priv 参数 secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。 secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能导出导入。 secure_fil…...
想成为月薪过万的软件测试工程师?快看过来!
软件测试人员的工作主要是检测软件系统中的存在的BUG,但并不是毫无逻辑的盲目抓瞎。学会运用测试思维去完成测试工作,会使你的工作事半功倍。 01 软件测试的前提假设 测试人员进行软件测试的基本假设是“有罪推断”。即:认为被测程序一定是…...
找生网站方案———未来之窗行业应用跨平台架构
1)网站设计方面的考虑 主色调采用于公司深蓝色颜色,网页整体色彩明快、大气、简洁,每个细节均经过精心处 理,网页浏览快速,导航明确清晰。 网页设计要充分考虑网页的整体感觉,每个页面的图片与网站色调的过…...
全网都在找的Python生成器竟然在这里!简单几步,让你的代码更简洁、更高效!
博客主页:长风清留扬-CSDN博客系列专栏:Python基础专栏每天更新大数据相关方面的技术,分享自己的实战工作经验和学习总结,尽量帮助大家解决更多问题和学习更多新知识,欢迎评论区分享自己的看法感谢大家点赞ὄ…...
插入排序,希尔排序,和归并排序
每一本数据结构和算法的教科书中,都不厌其烦的介绍了排序算法。不厌其烦的介绍10余种不同的排序。那么实际编程中用得到那么多排序算法吗?当然用不到。那么为什么全世界的教科书都这么写呢?显然是醉翁之意不在酒。 数组,是每个编…...
Prompt 模版解析:诗人角色的创意引导与实践
Prompt 模版解析:诗人角色的创意引导与实践 Prompt 模版作为一种结构化工具,旨在为特定角色——本例中的“诗人”——提供明确的指导和框架。这一模版详尽地描绘了诗人的职责、擅长的诗歌形式以及创作规则,使其能在自动化系统中更加精确地执…...
zookeeper选举kafka集群的controller
zookeeper选举kafka集群的controller目录 文章目录 zookeeper选举kafka集群的controller目录前言一、实操体验controller的选举二、模拟controller选举四、删除controller节点 前言 kafka集群的controller是kafka集群中一个有特殊作用的broker,负责整个kafka集群的…...
吉如一线段树:区间最值和历史最值
区间最值和历史最值 问题一 给定一个长度为 n n n 的数组 a a a , 实现以下三种操作 : 0 l r x : 将 a r r [ l ∼ r ] arr[l\sim r] arr[l∼r] 范围的每个数 v v v , 更新为 min ( v , x ) \min (v, x) min(v,x) 1 l r : 查询 max i l r a r r i \max_{il}^r ar…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
