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

Redis --- 使用Feed流实现社交平台的新闻流

 要实现一个 Feed 流(类似于社交媒体中的新闻流),通常涉及以下几个要素:

  1. 内容发布:用户发布内容(例如文章、状态更新、图片等)。
  2. 内容订阅:用户可以订阅其他用户的内容,获取实时更新。
  3. 内容展示:根据用户订阅的内容,将符合其兴趣或权限的内容按时间顺序展示出来。
  4. 实时更新:当有新的内容发布时,相关用户的 feed 流应该即时更新。

在社交平台、新闻流或类似应用中,Timeline(时间线)和智能排序是两个非常关键的功能。它们决定了用户在页面中看到的内容排序方式,直接影响用户体验。下面我将详细解释这两个概念,并且提供一些思路来实现它们。

在分布式系统和消息队列中,拉模式(Pull)和推模式(Push)是两种常见的数据传输方式。它们在不同的场景下有不同的应用。推拉结合模式(Push-Pull)结合了这两者的优点,能够更好地应对复杂的业务需求。 

  1. 拉模式是指消费者主动向服务端请求数据,服务端在接收到请求时返回数据。消费者控制请求的时机和频率。
  2. 推模式是指服务端主动将数据推送到消费者,消费者不需要发起请求,只需要接收数据。
  3. 推拉结合模式结合了推模式和拉模式的优点,消费者既可以主动拉取数据,也可以被服务器主动推送数据。通过这种模式,系统可以根据不同的场景灵活地选择推送或拉取方式,提升系统的性能和可靠性。        

另外,Feed流不能采用传统的分页模式:

 所以采用滚动分页:

在 Redis 中,ZSET(有序集合)是一个非常常用的数据结构,它可以用来存储带有分数的元素,并按分数进行排序。分页查询是获取ZSET部分元素的一种方式,通常通过 ZRANGEZREVRANGE 命令来实现。

在分页查询时,主要的目的是限制返回的数据量,并且支持通过“偏移量”(offset)和“数量”(limit)来控制分页的效果。Redis 的 ZSET 本身并不直接支持传统数据库那种基于页码的分页,但可以通过索引和 ZRANGE 命令来实现分页效果。

分页查询原理:

假设我们有一个存储博客点赞信息的 ZSET,其中每个博客的 ID 和点赞数是按分数score存储的。我们可以使用 ZRANGE(或 ZREVRANGE)命令来返回指定区间内的元素。

基本操作:

  • ZRANGE key start stop [WITHSCORES]:按分数升序返回 ZSET 中从 startstop 索引范围内的元素。WITHSCORES 可选,表示返回元素的分数。
  • ZREVRANGE key start stop [WITHSCORES]:按分数降序返回 ZSET 中从 startstop 索引范围内的元素。

分页查询示例:

假设有一个 ZSET,它存储了用户对某个博客的点赞数,键为 blog:likes:{id},其中 id 为博客的唯一标识。我们希望按照点赞数降序返回该博客的前10名用户。

ZRANGE blog:likes:1 0 9 WITHSCORES   # 获取从第1到第10个用户,WITHSCORES 返回每个用户的点赞数

上述命令会返回 ZSET 中按分数升序排的前10个用户和他们的点赞数。如果我们希望按点赞数降序排列,可以使用 ZREVRANGE

ZREVRANGE blog:likes:1 0 9 WITHSCORES  # 获取从第1到第10个用户,按分数降序

@Data
public class ScrollResult {private List<?> list;      // 存储查询结果的列表private Long minTime;      // 存储分页查询中最小的时间戳,用于下一页查询private Integer offset;    // 存储当前分页的偏移量(用于计算下一页的偏移)
}
@RestController
@RequestMapping("/blog")
public class BlogController {@Resourceprivate IBlogService blogService;@Resourceprivate IUserService userService;  @GetMappingpublic Result queryBlogOfFollow(@RequestParam("lastId") Long max, @RequestParam(value = "offset", defaultValue = "0") Integer offset) {return blogService.queryBlogOfFollow(max, offset);}
}

offset 是用来分页的:

offset 控制的是 跳过多少条数据,也就是说,它指定了从查询结果的第几条记录开始返回。例如:

  • offset = 0 表示从第一页的第一条记录开始查询。
  • offset = 2 表示从第二页的第一条记录开始查询,跳过前面两条。

这对于分页来说是非常重要的,可以确保你一次加载的数据不会过多,降低数据库和 Redis 的负担。


0max 控制查询的时间范围(避免查询过多数据):

0max 作为 分数范围 的参数,限制了 Redis 查询的 数据范围。具体来说:

  • 0:表示从时间戳最早的动态开始查找。这是为了确保不会遗漏从最早时间点开始的数据。
  • max:表示查询到的时间戳不会超过 max 的值。max 可能是一个具体的时间戳(如当前时间),用于限制查询的数据不超过这个时间点的数据。

因此,0max 控制的是 查询的时间范围,确保你只查询到特定时间段内的数据。

@Override
public Result queryBlogOfFollow(Long max, Integer offset) {// 获取当前登录用户的IDLong userId = UserHolder.getUser().getId();// 定义Redis的key,存储的是当前用户的动态信息(博客)String key = "feed:" + userId;// 从Redis ZSET中获取按时间戳降序排列的动态数据,返回指定的范围和分页Set<ZSetOperations.TypedTuple<String>> typedTuples = stringRedisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, 0, max, offset, 2);  // 获取分数(时间戳)小于max的前2条数据// 如果查询结果为空,直接返回空的响应if (typedTuples == null || typedTuples.isEmpty()) {return Result.ok();  // 如果没有数据,返回空的分页结果}// 用于存储动态的ID集合List<Long> ids = new ArrayList<>(typedTuples.size());// 用于记录分页查询中最小的时间戳long minTime = 0;// 用于记录当前页面的偏移量(即当前分页的位置)int os = 1;// 遍历查询结果for (ZSetOperations.TypedTuple<String> typedTuple : typedTuples) {// 获取动态ID(字符串形式)String idStr = typedTuple.getValue();// 将动态ID从String转换为Long,并添加到ids列表中Long id = Long.valueOf(idStr);ids.add(id);// 获取动态的时间戳(作为分数存储)long time = typedTuple.getScore().longValue();// 如果当前时间戳与上一条数据的时间戳相同,说明是同一时间段的动态,偏移量加1if (time == minTime) {os++;  // 同一时间戳的动态,增加偏移量} else {// 如果时间戳不同,更新最小时间戳,并重置偏移量minTime = time;  os = 1;  // 该时间戳下的动态的偏移量从1开始}}// 将动态ID列表转化为逗号分隔的字符串,用于查询数据库String idStr = StrUtil.join(",", ids);// 根据ID查询博客数据,返回的结果按照ID顺序排序List<Blog> blogs = query().in("id", ids).last("order by ids" + idStr + ")").list();// 创建一个ScrollResult对象,用于封装分页查询的结果ScrollResult r = new ScrollResult();r.setList(blogs);  // 设置当前页面的博客动态列表r.setOffset(os);   // 设置当前页的偏移量(分页位置)r.setMinTime(minTime);  // 设置当前页面的最小时间戳,用于下一次分页查询// 返回封装好的结果return Result.ok(r);  // 返回查询结果
}

方法签名与参数说明


@Override
public Result queryBlogOfFollow(Long max, Integer offset) {
  • max:这是一个时间戳,表示查询的最大时间。Redis 中的 ZSET 是根据分数(score)排序的,通常我们用时间戳作为分数,因此 max 表示最大时间戳,通常是当前时间或某个固定的时间点。因此 max 表示查询的时间范围的上限。当我们查询 ZSET 时,可以通过 max 来限制查询返回的元素的时间戳范围。例如,查询 max 小于某个时间戳的所有动态,保证我们只获取当前时间之前的动态。
  • offset:表示分页的偏移量,用来指定从查询结果的哪个位置开始返回。它帮助我们在查询时跳过前 offset 条记录,从而实现分页。在分页的过程中,每次查询都需要传递不同的 offset,以便从正确的记录位置开始查询。通常 offset 是通过上次查询结果的偏移量计算出来的。

举个例子: 假设每页显示 2 条动态:

  • 第一页:offset = 0
  • 第二页:offset = 2(跳过前2条数据,查询从第3条开始的数据)
  • 第三页:offset = 4(跳过前4条数据,查询从第5条开始的数据)

该方法的目标是查询当前用户的关注者发布的博客(动态),并分页返回结果。


Redis 查询:获取关注者发布的博客动态


String key = "feed:" + userId;
Set<ZSetOperations.TypedTuple<String>> typedTuples = stringRedisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, 0, max, offset, 2);
  • key = "feed:" + userId:每个用户的动态(博客)存储在以 feed: 为前缀的 Redis ZSET 中,userId 是动态数据的唯一标识符。
  • reverseRangeByScoreWithScores(key, 0, max, offset, 2)
    • reverseRangeByScoreWithScores:该命令用于按分数降序返回指定范围的元素及其分数。这里的 score 对应的是时间戳,因此可以按时间顺序从最新的动态开始查询。
    • 0max:表示查询的时间戳范围。查询 score0max 的元素。
    • offset:表示分页查询的起始偏移量,通常是上一页的最后一条记录的索引
    • 2:每次查询时返回的结果数量。也就是说,这一命令会返回最多 2 条动态。根据业务需求,这里设置为每次返回 2 条数据。通过调整这个数字,可以控制每次查询返回的数据量。

通过 offset2 实现分页查询:

  • offset:用来控制查询的起始位置,避免一次查询返回所有数据。
  • 2:每次查询返回 2 条记录。这可以减少一次查询的结果集大小,提高查询效率。

灵活控制查询范围

0max 使得我们能够灵活地控制查询的时间范围。通常,0 是为了兼容性的写法,表示从最小时间开始查询。max 用于控制查询的上限,确保返回的动态时间不会超过指定时间。

返回值:

返回的是一个 Set<ZSetOperations.TypedTuple<String>>,每个 TypedTuple 包含两个部分:

  • 值(blogId):即每个动态的 ID,存储在 typedTuple.getValue() 中。
  • 分数(时间戳):即该动态的时间戳,存储在 typedTuple.getScore() 中。

解析数据:获取动态 ID 和时间戳


List<Long> ids = new ArrayList<>(typedTuples.size());
long minTime = 0;
int os = 1;
for (ZSetOperations.TypedTuple<String> typedTuple : typedTuples) {String idStr = typedTuple.getValue();Long id = Long.valueOf(idStr);ids.add(id);long time = typedTuple.getScore().longValue();if (time == minTime) {os++;} else {minTime = time;os = 1;}
}
  • ids:用于存储查询到的动态 ID。
  • minTime:用于记录当前页面最早的时间戳。在分页中,minTime 的作用是保证在下一次查询时,从上一次查询的时间戳之后开始获取数据,避免重复数据。
  • os:表示当前页的偏移量。每次分页查询时,os 递增,用于记录当前页面的偏移量。

在循环中:

  • typedTuple 中获取 动态 ID时间戳
  • 时间戳相等时,偏移量(os)加一,表示当前的时间戳下有多个动态,显示顺序为相同时间戳下的顺序。
  • 时间戳不相等时,更新 minTime 和偏移量 os

根据动态 ID 查询博客


String idStr = StrUtil.join(",", ids);
List<Blog> blogs = query().in("id", ids).last("order by ids" + idStr + ")").list();
  • StrUtil.join(",", ids):将动态 ID 列表 ids 转换为一个逗号分隔的字符串,生成用于 SQL 查询的 ID 列表。
  • 查询博客:使用 query().in("id", ids) 根据 ID 列表查询对应的博客。.last("order by ids" + idStr + ")") 用于保证查询的博客顺序与 Redis 中 ZSET 的顺序一致。这里的 order by 语句应该是通过动态拼接 idStr 来确保顺序正确。

注意:拼接 SQL 语句时要小心 SQL 注入问题,避免使用不安全的字符串拼接方法。


如何计算 offset(偏移量)


假设数据库中的动态(博客)是这样的:

Blog IDTimeStamp (ms)Content
11609459200000 (2021-01-01)Blog 1 (2021-01-01)
21609459200000 (2021-01-01)Blog 2 (2021-01-01)
31609462800000 (2021-01-01)Blog 3 (2021-01-01)
41609466400000 (2021-01-01)Blog 4 (2021-01-01)
51609470000000 (2021-01-01)Blog 5 (2021-01-01)

我们的目标是 分页查询 这些博客动态,使用 offsetminTime 来控制查询结果。

1. 第一次查询
  • 假设我们查询第一页的内容,查询条件
    • 每页返回 2 条数据。
    • offset = 0(第一页,从第1条数据开始查询)。
    • max = 1609470000000(查询的时间范围上限,保证不超出当前最大时间戳)。
reverseRangeByScoreWithScores("feed:123", 0, max, offset, 2);

返回结果

  • 从 Redis 返回的动态列表为:Blog 1Blog 2(时间戳 1609459200000)。

minTime 计算

  • minTime 是当前分页查询结果中 最小的时间戳。这里的 minTime 就是 1609459200000,这是 Blog 2 的时间戳。

os 计算

  • os1 开始,因为这是第一页。如果 os 在同一时间戳的动态中增加,它会递增。此时,os = 2,因为在相同时间戳(1609459200000)下,第一条动态 Blog 1os = 1,第二条动态 Blog 2os = 2

封装返回结果

ScrollResult r = new ScrollResult();
r.setList([Blog 1, Blog 2]);  // 返回这两条数据
r.setMinTime(1609459200000);  // 设置最小时间戳,供下一页查询
r.setOffset(2);  // 下一页的偏移量从2开始
2. 第二次查询
  • 下一页的查询,offset = 2(跳过前两条动态,从第三条数据开始查询),minTime = 1609459200000(上一页的最小时间戳)。
  • 查询参数:
reverseRangeByScoreWithScores("feed:123", minTime + 1, max, offset, 2);

查询条件

  • minTime + 1 表示从上一页返回的 最小时间戳之后 开始查询,因此查询的范围从时间戳大于 1609459200000 开始。
  • offset = 2,意味着查询从第三条数据开始。

返回结果

  • 从 Redis 返回的动态为:Blog 3Blog 4(时间戳 16094628000001609466400000)。

minTime 计算

  • minTime 是当前页面的最小时间戳,这里是 1609462800000,即 Blog 3 的时间戳。

os 计算

  • os 重置为 1,因为 Blog 3 的时间戳是新的时间段,os = 1 表示该时间段的第一条动态。

封装返回结果

ScrollResult r = new ScrollResult();
r.setList([Blog 3, Blog 4]);  // 返回这两条数据
r.setMinTime(1609462800000);  // 设置最小时间戳,供下一页查询
r.setOffset(2);  // 下一页的偏移量为2,表示如果继续分页,应该从第5条数据开始查询
3. 第三次查询
  • 下一页的查询,offset = 4(跳过前四条数据,从第五条数据开始查询),minTime = 1609462800000(上一页的最小时间戳)。
  • 查询条件:
reverseRangeByScoreWithScores("feed:123", minTime + 1, max, offset, 2);

查询条件

  • minTime + 1 表示从上一页返回的 最小时间戳之后 开始查询,查询的时间戳范围是 1609462800000 之后的数据。
  • offset = 4,意味着查询从第五条数据开始。

返回结果

  • 从 Redis 返回的动态为:Blog 5(时间戳 1609470000000)。

minTime 计算

  • minTime 是当前页面的最小时间戳,这里是 1609470000000,即 Blog 5 的时间戳。

os 计算

  • os 重置为 1,因为这条动态是当前时间段下的第一条动态。

封装返回结果

ScrollResult r = new ScrollResult();
r.setList([Blog 5]);  // 返回这条数据
r.setMinTime(1609470000000);  // 设置最小时间戳,供下一页查询(下一页无数据)
r.setOffset(2);  // 假设这已经是最后一页,下一次查询会返回空数据

分页查询总结:

  1. 第一次查询:使用 offset = 0,从第一页开始查询,返回 Blog 1Blog 2
  2. 第二次查询:使用 minTime = 1609459200000offset = 2,从第三条数据开始查询,返回 Blog 3Blog 4
  3. 第三次查询:使用 minTime = 1609462800000offset = 4,从第五条数据开始查询,返回 Blog 5

offsetminTime 的作用:

  • offset:控制查询从哪个位置开始,分页跳过之前的数据。每次查询后,offset 会更新以确保下一页的查询从正确的位置开始。
  • minTime:控制查询的时间范围。每一页返回的结果中,minTime 是当前页最小的时间戳,帮助下一页查询跳过已经返回的数据。

这个过程保证了 按时间戳分页查询 的效果,并避免了重复数据。

相关文章:

Redis --- 使用Feed流实现社交平台的新闻流

要实现一个 Feed 流&#xff08;类似于社交媒体中的新闻流&#xff09;&#xff0c;通常涉及以下几个要素&#xff1a; 内容发布&#xff1a;用户发布内容&#xff08;例如文章、状态更新、图片等&#xff09;。内容订阅&#xff1a;用户可以订阅其他用户的内容&#xff0c;获…...

WPF 在后台使TextBox失去焦点的方法

在软件设计开发的时候&#xff0c;偶尔会遇到在后台xaml.cs后台中&#xff0c;要将TextBox控件的焦点取消或者使TextBox控件获取焦点&#xff0c;下面介绍讲述一种简单的“只让特定的 TextBox 失去焦点”方法: 前端xaml代码示例&#xff1a; <StackPanel Orientation"…...

自动化测试、压力测试、持续集成

因为项目的原因&#xff0c;前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api。下面将研究的成果展示给大家&#xff0c;希望对需要的人有所帮助。 SoapUI 是什么&#xff1f; SoapUI 是一个开源测试工具&#xff0c;通过 soap/http 来检查、调用、实现 Web Service 的…...

Mac电脑上好用的压缩软件

在Mac电脑上&#xff0c;有许多优秀的压缩软件可供选择&#xff0c;这些软件不仅支持多种压缩格式&#xff0c;还提供了便捷的操作体验和强大的功能。以下是几款被广泛推荐的压缩软件&#xff1a; BetterZip 功能特点&#xff1a;BetterZip 是一款功能强大的压缩和解压缩工具&a…...

C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输

CURL开源库介绍 CURL 是一个功能强大的开源库&#xff0c;用于在各种平台上进行网络数据传输。它支持众多的网络协议&#xff0c;像 HTTP、HTTPS、FTP、SMTP 等&#xff0c;能让开发者方便地在程序里实现与远程服务器的通信。 CURL 可以在 Windows、Linux、macOS 等多种操作系…...

[创业之路-276]:从燃油汽车到智能汽车:工业革命下的价值变迁

目录 前言&#xff1a; 从燃油汽车到智能汽车&#xff1a;工业革命下的价值变迁 前言&#xff1a; 燃油汽车&#xff0c;第一次、第二次工业革命&#xff0c;机械化、电气化时代的产物&#xff0c;以机械和电气自动化为核心价值。 智能汽车&#xff0c;第三次、第四次工业革…...

DeepSeek服务器繁忙问题的原因分析与解决方案

一、引言 随着人工智能技术的飞速发展&#xff0c;DeepSeek 等语言模型在众多领域得到了广泛应用。然而&#xff0c;在春节这段时间的使用过程中&#xff0c;用户常常遭遇服务器繁忙的问题&#xff0c;这不仅影响了用户的使用体验&#xff0c;也在一定程度上限制了模型的推广和…...

【python】简单的flask做页面。一组字母组成的所有单词。这里的输入是一组字母,而输出是所有可能得字母组成的单词列表

目录结构如下&#xff1a; . ├── static │ ├── css │ │ └── styles.css │ └── js │ └── scripts.js ├── templates │ ├── base.html │ ├── case_converter.html │ ├── index.html │ └── word_finder.html ├── app.py ├── tree.py…...

【华为OD-E卷 - 114 找最小数 100分(python、java、c++、js、c)】

【华为OD-E卷 - 找最小数 100分&#xff08;python、java、c、js、c&#xff09;】 题目 给一个正整数NUM1&#xff0c;计算出新正整数NUM2&#xff0c;NUM2为NUM1中移除N位数字后的结果&#xff0c;需要使得NUM2的值最小 输入描述 输入的第一行为一个字符串&#xff0c;字…...

Maven 依赖管理全面解析

目录 1. Maven 简介 2. 依赖的基本概念 依赖坐标 依赖范围 3. Maven 仓库 本地仓库 远程仓库 4. 依赖传递 5. 依赖冲突 6. 在 pom.xml 文件中管理依赖 基本依赖配置 依赖范围配置 依赖排除配置 依赖管理配置&#xff08;&#xff09; 1. Maven 简介 Maven 是一个…...

基于C#语言的海康威视智能车牌识别系统

基于C#语言的海康威视智能车牌识别系统&#xff0c;通过布控对来往车辆进行检测抓拍 资源文件列表 AICar.sln , 984 AICar.sln.GhostDoc.xml , 1306 AICar.v12.suo , 72704 AICar/AICar.csproj , 3573 AICar/AICar.csproj.user , 228 AICar/bin/Debug/AICar.exe , 220672 AIC…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(五)

#作者&#xff1a;闫乾苓 系列前几篇&#xff1a; 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》&#xff1a;link 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;二&#xff09;》&#xff1a; lin…...

清理服务器/docker容器

清理服务器 服务器或docker容器清理空间。 清理conda环境 删除不用的conda虚拟环境&#xff1a; conda env remove --name python38 conda env remove --name python310清理临时目录&#xff1a;/tmp du -sh /tmp # 查看/tmp目录的大小/tmp 目录下的文件通常是可以直接删除…...

【专题】2024-2025人工智能代理深度剖析:GenAI 前沿、LangChain 现状及演进影响与发展趋势报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p39630 在科技飞速发展的当下&#xff0c;人工智能代理正经历着深刻的变革&#xff0c;其能力演变已然成为重塑各行业格局的关键力量。从早期简单的规则执行&#xff0c;到如今复杂的自主决策与多智能体协作&#xff0c;人工智能代理…...

广度优先搜索(BFS)算法详解——以走迷宫问题为例

引言&#xff1a;当算法遇见迷宫 想象你置身于一个复杂的迷宫&#xff0c;如何在最短时间内找到出口&#xff1f;这个问题不仅存在于童话故事中&#xff0c;更是计算机科学中经典的路径搜索问题。本文将带你通过走迷宫问题&#xff0c;深入理解广度优先搜索&#xff08;BFS&am…...

【大数据技术】用户行为日志分析(python+hadoop+mapreduce+yarn+hive)

用户行为日志分析(python+hadoop+mapreduce+yarn+hive) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 本机PyCharm远程连接虚拟机Python 搭建完全分布式高可用大数据集群(MySQL+Hive)...

C语言基础之【数组和字符串】(上)

C语言基础之【数组和字符串】&#xff08;上&#xff09; 概述一维数组一维数组的定义一维数组的初始化一维数组的访问一维数组的遍历数组名一维数组的常用数据强化训练一维数组的最值一维数组的逆置一维数组的排序&#xff08;冒泡排序&#xff09; 二维数组二维数组的定义二维…...

Maven插件—flatten-maven-plugin:工程模块统一版本依赖

文章目录 前言一、认识flatten-maven-plugin插件二、如何使用flatten-maven-plugin插件&#xff1f;未使用flatten-maven-plugin插件之前的情况描述配置flatten-maven-plugin插件步骤1&#xff1a;最外层父模块安装插件&配置版本变量步骤2&#xff1a;各个自模块使用版本使…...

Linux系统 环境变量

环境变量 写在前面概念查看环境变量main函数的参数argc & argvenv bash环境变量 写在前面 对于环境变量&#xff0c;本篇主要介绍基本概念及三四个环境变量 —— PATH、HOME、PWD。其中 PATH 作为 “ 敲门砖 ”&#xff0c;我们会更详细讲解&#xff1b;理解环境变量的全局…...

TAPEX:通过神经SQL执行器学习的表格预训练

摘要 近年来&#xff0c;语言模型预训练的进展通过利用大规模非结构化文本数据取得了巨大成功。然而&#xff0c;由于缺乏大规模高质量的表格数据&#xff0c;在结构化表格数据上应用预训练仍然是一个挑战。本文提出了TAPEX&#xff0c;通过在一个合成语料库上学习神经SQL执行…...

Ruby:从宝石到编程语言的奇妙联系(中英双语)

Ruby&#xff1a;从宝石到编程语言的奇妙联系 在珠宝世界中&#xff0c;红宝石&#xff08;Ruby&#xff09;是一种象征热情、力量和高贵的珍贵宝石&#xff1b;而在编程世界中&#xff0c;Ruby则是一门灵活、优雅且富有创造力的编程语言。那么&#xff0c;这两者究竟有何联系…...

RLHF中的on-policy和off-policy的区别

在LLM&#xff08;大语言模型&#xff09;和RLHF&#xff08;基于人类反馈的强化学习&#xff09;中&#xff0c;on-policy和off-policy的主要区别在于数据的来源和策略更新的方式。以下是两者的详细对比以及各自的典型算法&#xff1a; On-policy 和 Off-policy 的区别 特性…...

计算机考研复试上机02

目录 3、排序 1)排序(华中科技大学复试上机题) 2)成绩排序(清华大学复试上机题) 3)特殊排序(华中科技大学复试上机题) 4)整数奇偶排序(北京大学复试上机题) 5)小白鼠排队(北京大学复试上机题) 4、查找 1)找 x(哈尔滨工业大学复试上机题) 2)查找(北…...

利用ETL工具进行数据挖掘

ETL的基本概念 数据抽取&#xff08;Extraction&#xff09;&#xff1a;从不同源头系统中获取所需数据的步骤。比如从mysql中拿取数据就是一种简单的抽取动作&#xff0c;从API接口拿取数据也是。 数据转换&#xff08;Transformation&#xff09;&#xff1a;清洗、整合和转…...

02DevOps基础环境准备

准备两台Linux的操作系统&#xff0c;最简单的方式就是在本机上使用虚拟机搭建两个操作系统&#xff08;实际生产环境是两台服务器&#xff0c;虚拟机的方式用于学习使用&#xff09; 我搭建的两台服务器的ip分别是192.168.1.10、192.168.1.11 192.168.1.10服务器用于安装doc…...

Kafka 入门与实战

一、Kafka 基础 1.1 创建topic kafka-topics.bat --bootstrap-server localhost:9092 --topic test --create 1.2 查看消费者偏移量位置 kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group test 1.3 消息的生产与发送 #生产者 kafka-cons…...

VM虚拟机安装群晖系统

下载群晖系统 https://download.csdn.net/download/hmxm6/90351935 安装群晖连接软件 synology-assistant-6.2-24922(在上面的压缩包里面) 准备好VM虚拟机 创建群晖虚拟机 打开下载下来的虚拟机 添加硬盘 选择类型 创建新的磁盘 指定容量 指定存储文件 完成硬盘添加…...

关于ESP-IDF 5.4 中添加第三方组件esp32-camera找不到文件,编译错误解决办法(花了一天时间解决)

最近需要使用ESP32-S3-CAM 的OV2640摄像头采集图像&#xff0c;为了加速开发进度&#xff0c;于是选择了esp32-camera组件&#xff0c;该组件不是官方组件&#xff0c;需要自己git clone。但在为项目添加esp32-camera组件时&#xff0c;一直编译错误&#xff0c;找不到头文件&a…...

【C++】C++11

目录 C11简介 统一的列表初始化 {}初始化 std::initializer_list 声明 auto decltype nullptr 范围for循环 智能指针 STL中的一些变化 右值引用和移动语义 左值引用和右值引用 右值引用的意义 完美转发 lambda表达式 新的类功能 可变参数模版 包装器 func…...

Intellij IDEA如何查看当前文件的类

快捷键&#xff1a;CtrlF12&#xff0c;我个人感觉记快捷键很麻烦&#xff0c;知道具体的位置更简单&#xff0c;如果忘了快捷键&#xff08;KeyMap&#xff09;看一下就记起来了&#xff0c;不需要再Google or Baidu or GPT啥的&#xff0c;位置&#xff1a;Navigate > Fi…...

CF 278A.Circle Line

题目分析 输入n个数据作为路径&#xff0c;求从a到b的最短距离&#xff0c;需要将其相成一个圆圈&#xff0c;既可以从小往大走又可以从大往小走 思路分析 依然将数据存为数组&#xff0c;通过下标进行操作&#xff0c;既然说了有两种方式那就计算两种方式哪个更快就输出谁 代…...

Naive UI去掉n-select下拉框边框,去掉n-input输入框边框

1、第一种通过js去掉 <template><div><div style"margin-top:10px;width: 100%;"><dade-descriptions><tr><dade-descriptions-item label"代理名称"><dade-input placeholder"代理名称"></dade-…...

(文末提供数据集下载)ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练

文章目录 (文末提供数据集下载)ML.NET库学习001&#xff1a;基于PCA的信用卡异常检查之样本处理与训练目标项目概述代码结构概述1. **主要类和文件**2. **命名空间和使用指令**3. **数据类 (TransactionObservation)**4. **主程序入口 (Main 方法)**5. **数据预处理 (DataPrepr…...

疯狂SQL转换系列- SQL for Milvs2.4

鉴于Milvus仍在不停的迭代新版本&#xff0c;推出新功能&#xff0c;其SDK目前并不稳定。目前其2.4版本的SDK接口已与之前的2.2版本有了较大的差别&#xff0c;功能上也有了一定的调整。为此&#xff0c;我们重新提供了针对[Milvus2.4](https://github.com/colorknight/moql-tr…...

C++的 I/O 流

本文把复杂的基类和派生类的作用和关系捋出来&#xff0c;具体的接口请参考相关文档 C的 I/O 流相关的类&#xff0c;继承关系如下图所示 https://zh.cppreference.com/w/cpp/io I / O 的概念&#xff1a;内存和外设进行数据交互称为 I / O &#xff0c;例如&#xff1a;把数…...

基于ansible部署elk集群

ansible部署 ELK部署 ELK常见架构 &#xff08;1&#xff09;ElasticsearchLogstashKibana&#xff1a;这种架构是最常见的一种&#xff0c;也是最简单的一种架构&#xff0c;这种架构通过Logstash收集日志&#xff0c;运用Elasticsearch分析日志&#xff0c;最后通过Kibana中…...

4.Python字符串和列表:字符串输入、字符串输出、下标和切片、字符串常见函数、列表(list)、列表的循环遍历、列表的增删改查、列表的嵌套、列表的切片

1. Python 字符串 1.1 字符串输入 input() 函数用于从用户获取字符串输入。它总是返回一个字符串类型的值。 # 从用户输入字符串 name input("请输入你的名字&#xff1a;") print(f"你好, {name}")1.2 字符串输出 字符串的输出通常使用 print() 函数…...

51单片机之使用Keil uVision5创建工程以及使用stc-isp进行程序烧录步骤

一、Keil uVision5创建工程步骤 1.点击项目&#xff0c;新建 2.新建目录 3.选择目标机器&#xff0c;直接搜索at89c52选择&#xff0c;然后点击OK 4.是否添加起吊文件&#xff0c;一般选择否 5.再新建的项目工程中添加文件 6.选择C文件 7.在C文件中右键&#xff0c;添加…...

Redis - 全局ID生成器 RedisIdWorker

文章目录 Redis - 全局ID生成器 RedisIdWorker一、引言二、实现原理三、代码实现代码说明 四、使用示例示例说明 五、总结 Redis - 全局ID生成器 RedisIdWorker 一、引言 在分布式系统中&#xff0c;生成全局唯一ID是一个常见的需求。传统的自增ID生成方式在分布式环境下容易出…...

Linux ftrace 内核跟踪入门

文章目录 ftrace介绍开启ftraceftrace使用ftrace跟踪指定内核函数ftrace跟踪指定pid ftrace原理ftrace与stracetrace-cmd 工具KernelShark参考 ftrace介绍 Ftrace is an internal tracer designed to help out developers and designers of systems to find what is going on i…...

Visual Studio(VS)没有显示垂直滚轮or垂直滚轮异常显示

前言&#xff1a; 前段时间&#xff0c;我换上了新电脑。满心欢喜地安装好 VS&#xff0c;准备大干一场时&#xff0c;却发现了一个小麻烦 —— 垂直滚轮显示异常&#xff08;如图 1&#xff09;。这种显示方式实在让我难以适应&#xff0c;每一次操作都觉得别扭。 于是&#…...

大数据数仓实战项目(离线数仓+实时数仓)3

1.课程内容和课程目标 2.订单时间维度指标需求分析 根据时间数据&#xff0c;生成一个时间维度表&#xff0c;我们后面还可以去复用这个时间维度表 3.使用kettle生成日期维度数据 Hive创建日期维度表 使用Kettle构建以下组件结构图 使用kettle生成日期维度数据插入到我们的hi…...

通过acme生成与续签ssl证书,并部署到nginx

通过acme生成与续签ssl证书&#xff0c;并部署到nginx 介绍 官方介绍&#xff1a; acme.sh 实现了 acme 协议&#xff0c;可以从 ZeroSSL&#xff0c;Lets Encrypt 等 CA 生成免费的证书。 安装 acme.sh 1. curl方式 curl https://get.acme.sh | sh -s emailmyexample.com…...

c语言对应汇编写法(以中微单片机举例)

芯片手册资料 1. 赋值语句 C语言&#xff1a; a 5; b a; 汇编&#xff1a; ; 立即数赋值 LDIA 05H ; ACC 5 LD R01,A ; R01 ACC&#xff08;a5&#xff09;; 寄存器间赋值 LD A,R01 ; ACC R01&#xff08;读取a的值&#xff09; LD R02,A ; R02 ACC&…...

React基础内容(面试一)

React大厂常见的面试题目涉及多个方面&#xff0c;包括React的基本概念、组件、状态管理、生命周期、性能优化等。以下是对这些面试题目的详细解析&#xff1a; 一、React基本概念 解释React是什么以及它的主要特点 React是一个用于构建用户界面的JavaScript库&#xff0c;由F…...

2025年软件测试五大趋势:AI、API安全、云测试等前沿实践

随着软件开发的不断进步&#xff0c;测试方法也在演变。企业需要紧跟新兴趋势&#xff0c;以提升软件质量、提高测试效率&#xff0c;并确保安全性&#xff0c;在竞争激烈的技术环境中保持领先地位。本文将深入探讨2025年最值得关注的五大软件测试趋势。 Parasoft下载https://…...

常用工具类——Collections集合框架

常用工具类——Collections集合框架 Collections 是 JDK 提供的一个工具类&#xff0c;提供了一系列静态方法&#xff0c;分类来复习&#xff01; 1.排序操作 reverse(List list) :反转顺序shuffle(List list) &#xff1a; 洗牌&#xff0c;将顺序打乱sort(List list) &…...

【大数据技术】搭建完全分布式高可用大数据集群(ZooKeeper)

搭建完全分布式高可用大数据集群(ZooKeeper) apache-zookeeper-3.8.4-bin.tar.gz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 ZooKeeper 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件…...

Docker Desktop安装kubernetes时一直在Starting:Kubernetes failed to start

原因&#xff1a;由于墙的问题&#xff0c;导致拉取国外的K8s镜像失败 解决&#xff1a; 下载 k8s-for-docker-desktop 选中自己的kubernetes 版本 下载zip包 PowerShell运行load_images.ps1文件 重启docker kubernetes运行成功...

物流中的物联网:其含义、应用和优势

随着世界联系日益紧密&#xff0c;物流格局正经历重大变革。科技已成为供应链管理的支柱&#xff0c;推动物流公司迈入效率与连通性兼具的新时代。 物联网&#xff08;IoT&#xff09;是一股变革性力量&#xff0c;重塑着物流与运输行业的架构。物联网在物流领域并非昙花一现的…...