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

黑马Redis(四)

一、发布探店笔记

案例--实现查看发布探店笔记的接口:

映射到对应数据库 

BLOG类中存在和对应数据库表不相关的属性,使用@TableField注解表示该字段并不在表中,需要在后续进行手动维护 

 

    @GetMapping("/{id}")public Result queryBlogById(@PathVariable("id") Long id){return blogService.queryBlogById(id);}@Overridepublic Result queryBlogById(Long id) {//1.查询BlogBlog blog = getById(id);if (blog == null ){return Result.fail("笔记不存在!");}//2.查询blog有关的用户queryBlogUser(blog);return Result.ok(blog);}private  void queryBlogUser(Blog blog){Long userId = blog.getUserId();User user = userService.getById(userId);blog.setName(user.getNickName());blog.setIcon(user.getIcon());}

案例--完善点赞功能:

    @Overridepublic Result likeBlog(Long id) {//1. 获取当前用户Long userId = UserHolder.getUser().getId();//2. 判断用户是否已经点赞String key = BLOG_LIKED_KEY + id;Boolean isMember = stringRedisTemplate.opsForSet().isMember(key, userId.toString());//防止为空 使用BooleanUtillif (BooleanUtil.isFalse(isMember)){//3. 如果未点赞,可以点赞//3.1 数据库点赞数+1boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();//3.2 保存用户到Redis的set集合if (isSuccess) {stringRedisTemplate.opsForSet().add(key, userId.toString());}}else {//4. 如果已经点赞,则取消点赞//4.1. 数据库点赞数-1boolean isSuccess = update().setSql("liked = liked - 1").eq("id", id).update();//4.2. 把用户从Redis中的set集合移除if (isSuccess) {stringRedisTemplate.opsForSet().remove(key, userId.toString());}}return Result.ok();}

案例--点赞排行榜:

 

Set集合无序,因此采用SortedSet      修改相关代码

 源代码中所有有关Set的操作改为SortedSet 对应的分数 使用时间戳System.currentTimeMillis()

        @GetMapping("/likes/{id}")public Result queryBlogLikes(@PathVariable("id") Long id){return blogService.queryBlogLikes(id);}@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();}//2. 解析出其中的用户idList<Long> ids = top5.stream().map(Long::valueOf).collect(Collectors.toList());//3. 根据用户id查询用户List<UserDTO> userDTOS = userService.listByIds(ids).stream().map(user -> BeanUtil.copyProperties(user, UserDTO.class)).collect(Collectors.toList());//4. 返回return Result.ok(userDTOS);}

结果点赞用户展示顺序出现错误 

原因,数据库使用in关键字进行查询时自动根据id调整了顺序

修改代码:.last表示在原有SQL语句最后拼接一句SQL语句

    @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();}//2. 解析出其中的用户idList<Long> ids = top5.stream().map(Long::valueOf).collect(Collectors.toList());String idStr = StrUtil.join(",", ids);//3. 根据用户id查询用户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);}

二、好友关注

关注和取关:

案例---实现关注和取关功能: 

@Overridepublic Result follow(Long followUserId, Boolean isFollow) {//1. 获取登录用户Long userId = UserHolder.getUser().getId();//2. 判断是关注还是取关if(isFollow){//3. 关注,新增数据Follow follow = new Follow();follow.setUserId(userId);follow.setFollowUserId(followUserId);save(follow);}else{//4. 取关,删除  delete * from tb_follow where userId = ? and follow_user_id = ?remove(new QueryWrapper<Follow>().eq("user_id",userId).eq("follow_user_id",followUserId));}return Result.ok();}@Overridepublic Result isFollow(Long followUserId) {//1. 获取登录用户UserDTO user = UserHolder.getUser();if(user == null){//用户未登录return Result.ok(false);}Long userId = user.getId();//查询是否关注 selec * from tb_follow where user_id = ? and follow_user_id = ?//.count 表示数据数量 >0 表示关注了 反之一样Integer count = query().eq("user_id", userId).eq("follow_user_id", followUserId).count();return Result.ok(count>0);}

共同关注:

方案---实现共同关注功能:

 在关注相关代码中 增加 写入关注数据 Redis 功能

    @GetMapping("/common/{id}")public Result followCommons(@PathVariable("id") Long followUserId){return followService.followCommons(followUserId);}@Overridepublic Result followCommons(Long followUserId) {//1. 先获取当前登录用户Long userId = UserHolder.getUser().getId();String key = "follows:" + userId;//2. 求交集String key2= "follows:" + followUserId;Set<String> intersect = stringRedisTemplate.opsForSet().intersect(key, key2);if (intersect == null || intersect.isEmpty()){//无交集return Result.ok(Collections.emptyList());}//3. 解析id集合List<Long> ids = intersect.stream().map(Long::valueOf).collect(Collectors.toList());//4. 查询用户List<UserDTO> users = userService.listByIds(ids).stream().map(user -> BeanUtil.copyProperties(user, UserDTO.class)).collect(Collectors.toList());return Result.ok(users);}

关注推送:

拉模式:

 推模式:

推拉结合模式:

案例---基于推模式实现关注推送:

 传统分页问题:

解决办法--Feed流的滚动分页:

 根据Feed流滚动分页的特性,关注推送采用SortedSet数据结构在Redis中存储查询(设置时间戳为分数)

代码实现:

修改发送笔记代码

发送笔记后,查询发送者的粉丝,向所有粉丝推送信息

@Overridepublic Result saveBlog(Blog blog) {//1.获取登录用户UserDTO user = UserHolder.getUser();blog.setUserId(user.getId());//2.保存探店笔记boolean isSuccess = save(blog);if (!isSuccess){return Result.fail("新增笔记失败!");}//3.查询笔记作者的粉丝  select * from tb_follow where follow_user_id = ?List<Follow> follows = followService.query().eq("follow_user_id", user.getId()).list();//4.推送笔记给所有粉丝for (Follow follow : follows) {//4.1 获取粉丝idLong userId = follow.getUserId();//4.2 推送String key = FEED_KEY + userId;stringRedisTemplate.opsForZSet().add(key,blog.getId().toString(),System.currentTimeMillis());}//5. 返回idreturn Result.ok(blog.getId());}

案例---实现关注推送页面的分页查询:

    @Overridepublic Result queryBlogofFollow(Long max, Integer offset) {//1. 获取当前用户Long userId = UserHolder.getUser().getId();//2. 查询收件箱String key= FEED_KEY + userId;Set<ZSetOperations.TypedTuple<String>> typedTuples = stringRedisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, 0, max, offset, 2);//3.判断非空if (typedTuples == null || typedTuples.isEmpty()){return Result.ok();}//4. 解析数据: blogId + minTime(时间戳) + offset(跟上次查询的最小值一样的元素的个数)long minTime = 0;int os = 1;List<Long> ids = new ArrayList<>(typedTuples.size());for (ZSetOperations.TypedTuple<String> typedTuple : typedTuples) {//4.1 获取idids.add(Long.valueOf(typedTuple.getValue()));//4.2 获取分数(时间戳)long time = typedTuple.getScore().longValue();if (time == minTime){os++;}else {minTime = time;os=1;}}//5. 根据blogId查询blogString idStr = StrUtil.join(",", ids);List<Blog> blogs = query().in("id", ids).last("order by field(id," + idStr + ")").list();for (Blog blog : blogs) {//5.1.查询blog有关的用户queryBlogUser(blog);//5.2.查询blog是否点过赞isBlogLiked(blog);}//6. 封装并返回ScrollResult r = new ScrollResult();r.setList(blogs);r.setOffset(os);r.setMinTime(minTime);return Result.ok(r);}

三、附近商铺

GEO数据结构:

案例---联系Redis的GEO功能:

 

附近商户搜索: 

数据存储方式:

支持版本:

 实现:

    @GetMapping("/of/type")public Result queryShopByType(@RequestParam("typeId") Integer typeId,@RequestParam(value = "current", defaultValue = "1") Integer current,@RequestParam(value = "x",required = false) Double x,@RequestParam(value = "y",required = false) Double y) {return shopService.queryShopByType(typeId,current,x,y);}
    @Overridepublic Result queryShopByType(Integer typeId, Integer current, Double x, Double y) {//1. 判断 是否需要根据坐标查询if (x == null || y == null){//不需要坐标查询,按数据库查询// 根据类型分页查询Page<Shop> page = query().eq("type_id", typeId).page(new Page<>(current, SystemConstants.DEFAULT_PAGE_SIZE));// 返回数据return Result.ok(page.getRecords());}//2. 计算分页参数int from = (current - 1)*SystemConstants.DEFAULT_PAGE_SIZE;int end = current * SystemConstants.DEFAULT_PAGE_SIZE;//3. 查询redis 按照距离排序+分页  结果: shipId、distanceString key = SHOP_GEO_KEY + typeId;GeoResults<RedisGeoCommands.GeoLocation<String>> results = stringRedisTemplate.opsForGeo()  //GEOSEARCH key BYLONLAT(圆心) x y BYRADIUS(半径) 10 WITHDISTANCE(带距离).search(key, GeoReference.fromCoordinate(x, y),new Distance(5000),RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeDistance().limit(end));//4. 解析shopIdif (results==null){//判空return Result.ok(Collections.emptyList());}List<GeoResult<RedisGeoCommands.GeoLocation<String>>> list = results.getContent();if (list.size() <= from){//没有下一页了return Result.ok(Collections.emptyList()); }//4.1 截取 from - end 的部分List<Long> ids = new ArrayList<>(list.size());Map<String,Distance> distanceMap = new HashMap<>(list.size());list.stream().skip(from).forEach(result ->{//4.2 获取店铺idString shopIdStr = result.getContent().getName();ids.add(Long.valueOf(shopIdStr));//4.3 获取距离Distance distance = result.getDistance();distanceMap.put(shopIdStr,distance);});//5. 根据shopId查询店铺String idStr = StrUtil.join(",", ids);List<Shop> shops = query().in("id", ids).last("order by field(id," + idStr + ")").list();for (Shop shop : shops) {shop.setDistance(distanceMap.get(shop.getId().toString()).getValue());}//6. 返回return Result.ok(shops);}

 由于GEO查询没有办法查询对应范围数据,只能指定数量,因此分页查询需要手动截取对应部分

四、用户签到 

BitMap用法:

案例--实现签到功能 :

 

    @Overridepublic Result sign() {//1. 获取当前登录的用户Long userId = UserHolder.getUser().getId();//2. 获取日期LocalDateTime now = LocalDateTime.now();//3. 拼接keyString keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyy-MM"));String key = USER_SIGN_KEY + userId +keySuffix;//4. 获取今天是当月第几天(填充bit的位置)int dayOfMonth = now.getDayOfMonth();  //这个月第一天返回值为1//5. 写入Redis SETBIT key offset 1stringRedisTemplate.opsForValue().setBit(key,dayOfMonth-1,true);return Result.ok();}

案例--实现签到统计:

@GetMapping("/sign/count")public Result signCount(){return userService.signCount();}
}
    @Overridepublic Result signCount() {//1. 获取当前登录的用户Long userId = UserHolder.getUser().getId();//2. 获取日期LocalDateTime now = LocalDateTime.now();//3. 拼接keyString keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyy-MM"));String key = USER_SIGN_KEY + userId +keySuffix;//4. 获取今天是当月第几天int dayOfMonth = now.getDayOfMonth();  //这个月第一天返回值为1//5. 获取本月截至今天为止的所有签到记录 返回的是一个十进制数字  BITFIELD sign:5:202505 GET U14 0List<Long> results = stringRedisTemplate.opsForValue().bitField(key, BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0));if(results == null || results.isEmpty()){//没有任何结果return Result.ok(0);}Long num = results.get(0);if(num == null || num == 0){return Result.ok();}//6. 循环遍历int count=0;while(true){//6.1.让这个数字与1做与运算,得到数字的最后一个bit位if((num & 1)==0){//如果为0 说明未签到 结束break;}else{//不为0,说明已经签到,计数器+1count ++;}//把数字右移一位,抛弃最后一个bit位,继续下一个bit位num = num>>>1;}return Result.ok(count);}

五、UV统计

HyperLogLog用法:

HyperLogLog 算法的原理讲解以及 Redis 是如何应用它的聪明的你可能会马上想到,用 HashMap 这种数 - 掘金​​​​​​​

相关文章:

黑马Redis(四)

一、发布探店笔记 案例--实现查看发布探店笔记的接口&#xff1a; 映射到对应数据库 BLOG类中存在和对应数据库表不相关的属性&#xff0c;使用TableField注解表示该字段并不在表中&#xff0c;需要在后续进行手动维护 GetMapping("/{id}")public Result queryBlog…...

绿色版的notepad++怎么加入到右键菜单里

复制以下代码保存为 Notepad.reg&#xff0c;修改自己的“Notepad.exe路径”后&#xff0c;双击运行Notepad.reg。 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Notepad 打开" "Icon""C:\\Program Files (x86)\\Note…...

C++23 std::byteswap:反转字节 (P1272R4)

文章目录 C23 std::byteswap&#xff1a;反转字节 (P1272R4)引言字节序的基本概念大端字节序小端字节序 C23 std::byteswap的基本概念和功能基本概念功能实现示例代码可能的输出 P1272R4提案相关内容提案背景和动机设计考虑函数规范提案修订历史 std::byteswap的使用场景跨平台…...

DevExpressWinForms-TreeList-设置不可编辑

DevExpress TreeList 编辑权限控制&#xff1a;从全局到细粒度设置 在使用 DevExpress TreeList 控件开发数据展示界面时&#xff0c;根据业务需求限制用户编辑行为是常见需求。本文将从全局禁用编辑、列级权限控制、行级动态限制到单元格精准管控&#xff0c;系统讲解 TreeLi…...

ESP32通过MQTT协议上传数据至onenet物联网平台(新版)

文章目录 一、onenet物联网平台操作 二、esp32端代码 三、测试 一、onenet物联网平台操作 首先创建产品&#xff1a; 接着创建设备&#xff1a; 创建物模型&#xff1a; 接着便是计算接入的token&#xff1a; 在自己的产品详情以及设备详情中找到下面的信息&#xff1a; 接着…...

ppt箭头素材图片大全

ppt箭头怎么打出来&#xff0c;ppt箭头设计&#xff0c;ppt箭头制作&#xff0c;ppt箭头图标素材下载: 箭头_模板素材_PPT模板_ppt素材_免抠图片_AiPPTer...

第十六届蓝桥杯 2025 C/C++组 旗帜

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; P12340 [蓝桥杯 2025 省 AB/Python B 第二场] 旗帜 -…...

Docker容器资源控制--CGroup

目录 一、CGroups的含义 二、CGroup的功能和特点 1、CGroups的主要功能 2、CGroups的特点 三、实训 1、利用CGroups实现CPU资源控制 2、利用CGroups实现内存资源控制 3、利用CGroups实现磁盘I/O控制 一、CGroups的含义 CGroups是Linux内核提供的一 种可以限制单个进程或…...

【开源项目】基于sherpa-onnx的实时语音识别系统 - LiveASR

你是否曾经为语音识别系统的部署和配置而烦恼&#xff1f;今天给大家介绍一个基于sherpa-onnx的实时语音识别系统 - LiveASR&#xff0c;让语音识别变得简单易用&#xff01; 项目简介 LiveASR是一个基于sherpa-onnx开发的实时语音识别系统&#xff0c;提供了简单易用的图形界…...

免费超好用的电脑操控局域网内的手机(多台,无线)

使用 第一步 解压QtScrcpy压缩包&#xff0c;并运行QtScrcpy.exe 第二步 2.1 手机开启开发者模式&#xff08;设置>关于本机>版本信息>连点10下“版本号”&#xff09; 2.2 开启 USB调试 和 无线调试&#xff08;设置>开发者选项> USB调试 无线调试&#xf…...

vue 优化策略,大白话版本

1. 避免过度使用响应式数据&#xff08;如冻结大对象&#xff09; 问题&#xff1a;Vue 默认会给所有数据加上“监控”&#xff08;响应式&#xff09;&#xff0c;数据变化时会自动更新页面。但如果是超大的对象&#xff08;比如几万行的表格数据&#xff09;&#xff0c;这个…...

《数学物理方程》——第一章 引入与基本概念

1.1 基本概念和定义 偏微分方程的分类 线性 齐次 非齐次 非线性 拟线性 —— 半线性 完全非线性 1.2 典型方程 1.2.1 波动方程 一维弦自由振动方程&#xff1a; &#xff08;不考虑弦的重量&#xff09;&#xff0c;即&#xff1a; 一维弦强迫振动方程&#xff1a;&a…...

C++入侵检测与网络攻防之TFTP和NTP报文的识别

目录 1.tftp客户端的使用 2.tftp协议分析以及特征提取 3.tftp报文识别1 4.tftp报文识别2 5.复习 6.ntp协议原理 7.ntpdate同步时间和抓包 8.ntp协议解析 9.ntp报文识别实现 10.bug追踪系统 1.tftp客户端的使用 2.tftp协议分析以及特征提取 1 tftp的安装 sudo apt…...

技术赋能与模式重构:开源AI大模型驱动下的“一盘货”渠道革命——基于美的案例与S2B2C生态融合的实证研究

摘要&#xff1a;在全渠道零售时代&#xff0c;渠道效率与库存成本矛盾成为制约企业增长的核心痛点。本文以美的集团“一盘货”模式为实践样本&#xff0c;结合开源AI大模型、AI智能名片、S2B2C商城小程序源码三大技术要素&#xff0c;构建“技术中台供应链协同渠道赋能”的三维…...

如何利用Rust提升Linux服务器效率(详细操作指南)

Rust是一个专注于性能、安全和并发的系统编程语言&#xff0c;非常适合用来优化和提升Linux服务器的运行效率。下面是一些具体方法和建议&#xff0c;告诉你如何利用Rust来提升Linux服务器的效率&#xff1a; 一、替换或重写性能瓶颈模块 重写Bash/Python脚本为Rust Rust编译…...

【工具】Elasticsearch:强大的开源搜索与分析引擎

什么是Elasticsearch&#xff1f; Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;基于Apache Lucene构建。它能够近乎实时地存储、搜索和分析大量数据。最初由Shay Banon开发并于2010年发布&#xff0c;Elasticsearch如今已成为最受欢迎的企业搜索引擎之一。 核…...

neo4j基础操作:命令行增删改查

目录 一&#xff0c;Neo4j的增 1.1.新增节点 1.2.新增关系 1.2.1创建节点时&#xff0c;创建关系 1.2.2在已有的节点上&#xff0c;创建关系 二&#xff0c;Neo4j的删除 2.1删除节点 2.1.1无关系的节点删除 2.1.2 有关系的节点删除 三&#xff0c;节点修改 3.1 给节点…...

技术白皮书:Oracle GoldenGate 优势

本文为技术白皮书Oracle GoldenGate 优势的翻译及阅读笔记。以下注释中GoldenGate为OGG。 副标题为&#xff1a;Oracle 数据库的变更数据捕获 (CDC) 技术比较。版本为July, 2021, Version 2.1。 Oracle GoldenGate 被客户和分析师公认为功能最齐全、性能最高、最值得信赖的数…...

搜索引擎中的检索模型(布尔模型、向量空间模型、概率模型、语言模型)

搜索引擎中的检索模型 搜索引擎中的检索模型是决定查询与文档相关性的重要机制。以下是几种常见的检索模型&#xff0c;包括其原理、代码案例、使用方式和优缺点。 1. 布尔模型&#xff08;Boolean Model&#xff09; 原理 布尔模型基于布尔逻辑&#xff08;AND, OR, NOT&…...

【SpringBoot】基于MybatisPlus的博客管理系统(1)

1.准备工作 1.1数据库 -- 建表SQL create database if not exists java_blog_spring charset utf8mb4;use java_blog_spring; -- 用户表 DROP TABLE IF EXISTS java_blog_spring.user_info; CREATE TABLE java_blog_spring.user_info(id INT NOT NULL AUTO_INCREMENT,user_na…...

聊聊Spring AI Alibaba的PlantUMLGenerator

序 本文主要研究一下Spring AI Alibaba的PlantUMLGenerator DiagramGenerator spring-ai-alibaba-graph/spring-ai-alibaba-graph-core/src/main/java/com/alibaba/cloud/ai/graph/DiagramGenerator.java public abstract class DiagramGenerator {public enum CallStyle {…...

借助Spring AI实现智能体代理模式:从理论到实践

借助Spring AI实现智能体代理模式&#xff1a;从理论到实践 前言 在人工智能领域&#xff0c;大语言模型&#xff08;LLM&#xff09;的应用愈发广泛&#xff0c;如何高效构建基于LLM的系统成为众多开发者关注的焦点。Anthropic的研究报告《构建高效代理》为我们提供了新的思…...

【图片识别成表格】批量图片识别成excel表格,批量识别图片区域文字保存到excel表格,基于WPF和腾讯OCR的识别方案

​​ 应用场景 该项目适用于需要从大量图片中提取文字信息的场景,例如: ​​发票识别​​:批量扫描发票并提取金额、日期、发票号等信息。​​证件识别​​:批量处理身份证、护照等证件,提取姓名、身份证号等信息。​​文档数字化​​:将纸质文档扫描成图片后,批量提取…...

使用Qt QAxObject解决Visual Fox Pro数据库乱码问题

文章目录 使用Qt QAxObject解决Visual Fox Pro数据库乱码问题一、问题背景&#xff1a;ODBC读取DBF文件的编码困境二、核心方案&#xff1a;通过QAxObject调用ADO操作DBF1. 技术选型&#xff1a;为什么选择ADO&#xff1f;2. 核心代码解析&#xff1a;QueryDataByAdodb函数3. 连…...

Manus AI多语言手写识别技术全解析:从模型架构到实战部署

简介 Manus AI作为当前多语言手写识别领域的领军技术&#xff0c;其核心创新在于融合三维卷积网络、动态特征融合引擎和混合解码系统&#xff0c;实现了对112种语言的98.7%识别准确率和8ms延迟的实时处理能力。本文将深入探讨Manus AI的架构设计、特征提取方法、数据预处理策略…...

MYSQL三大日志、隔离级别(MVCC+锁机制实现)

MySQL三大日志 ​Undo Log&#xff08;回滚日志&#xff09; 作用 事务回滚时恢复数据到修改前的状态。 支持 ​​MVCC​​&#xff0c;为读操作提供历史版本数据。 存储 存放在 undo tablespace 中&#xff0c;通过回滚段管理。 格式 undo log 格式都有一个 roll_point…...

聚焦智能体未来,领驭科技在微软创想未来峰会大放异彩

2025年4月23日&#xff0c;微软创想未来峰会在北京中关村国际创新中心盛大举行。作为微软中国南区核心合作伙伴及HKCSP 1T首批授权云服务商&#xff0c;深圳领驭科技有限公司受邀参会&#xff0c;携瀚鹏工业AI应用解决方案亮相峰会&#xff0c;与全球AI领袖及行业精英共话智能体…...

043-代码味道-循环依赖

代码味道-循环依赖 代码异味之循环依赖&#xff1a;定义、特征与解决方案 一、循环依赖的定义与特征 循环依赖&#xff08;Cyclic Dependencies&#xff09;是指两个或多个软件模块之间形成相互依赖的闭环关系。这种代码味道会导致&#xff1a; 编译/构建困难&#xff1a;模…...

技术沙龙:Mybatis中resultMap使用案例分享

目录 一、联表查询和单表查询优劣分析 1.1 联表查询的优缺点 优点&#xff1a; 缺点&#xff1a; 1.2 单表查询的优缺点 优点&#xff1a; 缺点&#xff1a; 1.3 适用场景建议 联表查询更适合&#xff1a; 单表查询更适合&#xff1a; 1.4 优化建议 1.5 总结 …...

Linux基础篇、第一章_01_3安装虚拟机手动安装部署Ubuntu22.04服务器

题目安装部署Ubuntu22.04服务器 版本号: 1.0,0 作者: 老王要学习 日期: 2025.04.29 适用环境: Ubuntu22.04 文档说明 本文档聚焦 Ubuntu 22.04 服务器的安装部署&#xff0c;详细介绍了从虚拟机创建、系统安装、基础配置&#xff08;如更新国内源、安装常用软件、修改静态 IP、…...

dma_request_slave_channel_compat 与 dma_request_channel 的区别

1.代码示例 dma_request_channel #define dma_request_channel(mask, x, y) \__dma_request_channel(&(mask), x, y, NULL)struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask,dma_filter_fn fn, void *fn_param,struct device_node *np) {struct dma_d…...

【论文阅读】Partial Retraining Substitute Model for Query-Limited Black-Box Attacks

摘要 针对深度神经网络(DNN)分类器的黑盒攻击正受到越来越多的关注,因为它们在现实世界中比白盒攻击更实用。在黑盒环境中,对手对目标模型的了解有限。这使得难以估计用于制作对抗示例的梯度,从而无法将强大的白盒算法直接应用于黑盒攻击。因此,一种著名的黑盒攻击策略会…...

JAVA---集合ArrayList

集合 1. 自动扩容 &#xff0c;集合长度可变 2. 只可以存引用数据类型&#xff0c;如果要存基本数据类型&#xff0c;需要将其转换成对应的包装类 ArrayList 定义在 java.util 下的&#xff0c;实现了 List 接口。ArrayList 内部以动态数组的形式存储元素&#xff0c;这意…...

快速了解Go+微服务(概念和一个例子)

更多个人笔记&#xff1a;&#xff08;仅供参考&#xff0c;非盈利&#xff09; gitee&#xff1a; https 文章目录 基本概念grpc和简单demo 基本概念 特点&#xff1a; 单一职责&#xff1a;一个服务用来解决一个业务问题面向服务&#xff1a;一个服务封装并对外提供服务&am…...

MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 是怎样练成的?

接上文MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 探究sleep.c是如何’炼成’的? 老实讲&#xff0c;我不熟悉Makefile&#xff0c;最多写过简单的编译和辅助脚本&#xff0c;拿到Xv6的Makefile是一脸懵的&#xff0c;至今还是一脸懵&#xff0c;那么我们上篇中新加的…...

4月28号

初认web前端: web标准: HTML:...

React Native 太慢:kotlin-gradle-plugin-2.0.21-gradle76.jar 下载太慢

React Native 初次运行&#xff08;已经连接手机USB调试&#xff09;。 运行的命令&#xff1a;npx react-native run-android。 一直卡在jar包的下载部分&#xff0c;总是几十kb的速度。 > Evaluating settings > :gradle-plugin > Resolve files of :gradle-plug…...

面试篇 - Transformer前馈神经网络(FFN)使用什么激活函数?

1. FFN结构分解 原始Transformer的FFN层 FFN(x) max(0, xW₁ b₁)W₂ b₂ # 原始论文公式 输入&#xff1a;自注意力层的输出 x&#xff08;维度 d_model512&#xff09; 扩展层&#xff1a;xW₁ b₁&#xff08;扩展为 d_ff2048&#xff09; 激活函数&#xff1a;Re…...

Lua 第14部分 数据结构

14.1 数组 Lua 语言中的表并不是一种数据结构&#xff0c;它们是其他数据结构的基础。我们可以用 Lua 语言中的表来实现其他语言提供的数据结构&#xff0c;如数组、记录、列表、队列、集合等。而且&#xff0c;用Lua 语言中的表实现这些数据结构还很高效。 在像 C 和…...

杭州数据库恢复公司之Dell服务器RAID5阵列两块硬盘损坏报警离线

外地客户寄过来六块SAS服务器硬盘&#xff0c;说是组了RAID5磁盘阵列的戴尔DELL服务器突然崩溃了&#xff0c;更换阵列卡后开始可以进入系统&#xff0c;不过有一块盘亮黄灯报警&#xff0c;工程师打算把服务器放回机柜后更换新硬盘&#xff0c;但再重启就无法进系统了&#xf…...

linux 内核 debugfs 使用介绍

一&#xff1a;概述 debugfs 是 Linux 内核提供的一个特殊的虚拟文件系统&#xff0c;用于 暴露内核模块&#xff08;如驱动&#xff09;内部的调试信息或控制接口&#xff0c;供开发者、调试人员实时查看和排查问题。即 debugfs 就是一个“调试专用的 /proc 或 /sys”&#xf…...

MarkItDown:如何高效将各类文档转换为适合 LLM 处理的 Markdown 格式

MarkItDown&#xff1a;如何高效将各类文档转换为适合 LLM 处理的 Markdown 格式 引言项目概述分析基本信息主要功能支持的文件格式技术架构 为什么选择 Markdown&#xff1f;核心功能详解1. 文档转换机制2. LLM 集成能力3. 多种转换选项4. 插件系统 安装和使用教程安装可选依赖…...

解锁未来工作方式:什么是 AI Agent?| Unlocking the Future of Work: What Are AI Agents?

&#x1f1e8;&#x1f1f3; 解锁未来工作方式&#xff1a;什么是 AI Agent&#xff1f;| &#x1f1fa;&#x1f1f8; Unlocking the Future of Work: What Are AI Agents? 关键词提示&#xff1a;本文将介绍 AI agents, knowledge graph, LangChain, Graphiti 等相关术语&am…...

8分钟快速掌握Markdiwn

文档说明:本文档适合有编程基础的专业人士快速学习Markdown语法,从而立即上手使用Markdown来记笔记,新手可移步至Markdown入门到精通实战教程:使用Typora快速构建编辑MD文档_md文件编辑器typora-CSDN博客 进行入门学习 Markdown文档的元素包括块级元素、内联元素、HTML元素…...

多维驱动:负载均衡何以成为现代系统架构的基石

负载均衡的引入是现代网络架构和分布式系统发展的必然需求&#xff0c;除了上述提到的原因&#xff0c;还涉及以下多个关键层面&#xff0c;共同推动其成为复杂系统不可或缺的组成部分&#xff1a; 一、提升服务质量&#xff08;QoS&#xff09; 响应时间优化&#xff1a;用户…...

本地知识库工具FASTGPT的安装与搭建

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;将智能对话与可视化编排完美结合&#xff0c;让 AI 应用开发变得简单自然。无论您是开发者还是业务人员&#xff0c;都能轻松打造专属的 AI 应用。 今天来试着搭建下&#xff0c;使用docker安装比较简单&#x…...

【嘉立创EDA】如何找到曲线和直线的交点,或找到弧线和直线的交点

文章路标👉 :one: 文章解决问题:two: 主题内容:three: 参考方法be end..1️⃣ 文章解决问题 操作环境:嘉立创EDA专业版 V2.2.38 本文使用嘉立创EDA,描述如何快速找到曲线和直线交点的方法,这里的曲线包括了弧线等。本文将此过程记录,以供有需要的读者参考。 2️⃣ 主题…...

余额分账和代付有什么区别?

余额分账和代付有什么区别&#xff1f;余额分账是把钱存到一起&#xff0c;但代付是把钱分开。看似简单的一字之差&#xff0c;却有着本质的区别。 余额分账是一种财务管理手段&#xff0c;在一个账户或平台上&#xff0c;根据一定的规则将账户内的余额进行划分&#xff0c;形…...

【Stable Diffusion】文生图进阶指南:采样器、噪声调度与迭代步数的解析

在Stable Diffusion文生图(Text-to-Image)的创作过程中,采样器(Sampler)、噪声调度器(Schedule type)和采样迭代步数(Steps)是影响生成效果的核心参数。本文将从技术原理、参数优化到实践应用,深入剖析DPM++ 2M采样器、Automatic噪声调度器以及采样步数的设计逻辑与协…...

1.1探索 LLaMA-Factory:大模型微调的一站式解决方案

探索 LLaMA-Factory&#xff1a;大模型微调的一站式解决方案 引言 在大模型的时代&#xff0c;微调技术是将预训练模型适配到特定任务的关键。LLaMA-Factory 作为一款强大的工具&#xff0c;为开发者提供了便捷且高效的大模型微调解决方案。本文将深入介绍 LLaMA-Factory 的基…...