面试或工作中的经典问题共享

前言:大家可以把面试或工作中遇到了经典问题共享一下,我们共同学习成长,金九银十,祝各位都能步步高升!

文档大家可以往下追加,请勿删除他人编写的内容哦。我会把问题的相关资料进行补充,以便各位食用。

请点击打开文档-->

Docs


4-gateway nginx sentinel都可以限流,有什么区别

作用域,限流颗粒度,使用场景

对,主要是对颗粒度的把控


Nginx、Spring Cloud Gateway 和 Sentinel 都可以实现限流,但它们的作用域、限流颗粒度以及使用场景各不相同。以下是它们在这些方面的详细对比:

1. 作用域

  • Nginx 限流

    • 作用于 网络层应用的入口层,通常用于控制进入服务器的流量。

    • 通过配置在 Nginx 的反向代理层,Nginx 可以对进入的 HTTP 请求进行限流,适用于整个应用集群的访问控制。

    • 限流范围通常包括 IP 地址、请求路径、连接数等。

  • Gateway 限流

    • 作用于 应用网关层,属于 API 网关层面的限流,负责转发请求给后端服务。

    • Spring Cloud Gateway 限流通常是基于 路由API 的限流。它可以根据服务的不同 URL 路由来进行限流,从而保护后端服务不被突发流量冲垮。

    • Gateway 的限流还可以细化到具体用户、客户端、IP 等维度。

  • Sentinel 限流

    • 作用于 应用内部层面,属于业务逻辑的限流,主要保护具体的业务服务(例如微服务)的稳定性。

    • Sentinel 可以针对服务内部的某个具体方法、某个 API、甚至某个数据库查询等进行限流,防止单个微服务由于突发流量崩溃。

    • 还支持基于调用关系的限流,例如 A 服务调用 B 服务时进行限流。

2. 限流颗粒度

  • Nginx 限流

    • Nginx 限流是基于 IP、请求数或连接数等较粗粒度的限流,适用于整个应用或 API 层面的限流控制。

    • Nginx 常用的限流方式:

      • 连接限流:限制每个客户端的并发连接数。

      • 请求限流:限制每个客户端在一定时间窗口内发送的请求数。

  • 示例

  • http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { location / { limit_req zone=one burst=5 nodelay; proxy_pass http://backend; } } }

  • 该配置每秒钟只允许一个请求,且最多允许5个突发请求。

  • Gateway 限流

    • Gateway 支持通过 Redis 实现精细化限流,通常基于 路径(Route)请求头(Header) 进行限流。限流规则可以设置为针对不同用户、IP 或 API 进行限流。

    • Gateway 限流的细粒度比 Nginx 细,可以基于用户、应用、IP、路径、请求头等任意维度。

  • 示例

 

@Beanpublic KeyResolver userKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()); } @Beanpublic RateLimiter myRateLimiter() {return new RedisRateLimiter(10, 20); // 每秒 10 个请求,最大 20 个突发请求 }

  • 这个限流器会对每个 IP 地址应用限流策略。

  • Sentinel 限流

    • Sentinel 限流的颗粒度更为细腻,支持从 应用内部微服务接口 再到 方法级别 的精细化限流。还可以对资源、API、流量入口等进行限流。

    • Sentinel 支持多种限流策略,例如:

      • QPS 限流:限制某个接口的每秒请求数。

      • 调用关系限流:限制调用链中具体服务的流量。

      • 线程数限流:根据当前并发线程数进行限流。

      • 热点参数限流:根据请求中的热点参数(如用户 ID、商品 ID)进行限流。

  • 示例

 

// 定义限流规则FlowRule rule = new FlowRule(); rule.setResource("myResource"); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rule.setCount(100); // QPS 限制为 100// 加载规则 FlowRuleManager.loadRules(Collections.singletonList(rule)); // 在代码中保护资源try (Entry entry = SphU.entry("myResource")) {// 被保护的业务逻辑 } catch (BlockException e) {// 处理被限流的逻辑 }

  • 这里 Sentinel 保护了 "myResource" 资源,限制其每秒只能处理 100 个请求。

3. 使用场景

  • Nginx 使用场景

    • 适合在应用的入口处进行流量限制,适用于 大规模流量控制,例如防止恶意 IP 的流量攻击。

    • 适合对外部 HTTP 请求的速率限制,如 防止 DDoS 攻击限制特定 IP 访问频率等。

    • 在 API 网关前用作 第一道防线,处理基础的流量控制。

  • Gateway 使用场景

    • 适合在微服务架构中,作为 API 网关 来对各个服务的流量进行控制。

    • 可以基于路由限流,适合保护 特定服务或接口,如在网关处限制每个用户的 API 调用次数或防止恶意调用。

    • 可以与 Redis 结合,进行 分布式限流,适合跨服务、跨应用的限流场景。

  • Sentinel 使用场景

    • 适合在微服务架构中,对 具体的服务接口内部方法 进行限流,防止单个微服务或资源过载。

    • Sentinel 适合应用内部的 精细化流量控制,例如某个服务的某个接口、热点参数的流量控制,防止服务由于突发请求崩溃。

    • Sentinel 支持 调用链路热点参数 限流,适用于复杂的调用关系或热点资源的保护。

总结

工具作用域限流颗粒度使用场景
Nginx网络层、应用入口基于 IP、请求数、连接数等较粗粒度的限流防止 DDoS 攻击,限制 IP 流量
GatewayAPI 网关层基于 API 路由、用户、IP 等精细化限流微服务 API 限流,保护特定服务
Sentinel应用内部,业务逻辑和微服务保护细粒度限流,支持方法级、参数级限流精确控制单个接口、方法、热点参数流量

Nginx 适合入口流量控制,Gateway 适合 API 级别的精细化限流,Sentinel 适合内部业务和服务接口的限流保护。


3-redis脑裂如何解决

Redis 脑裂问题(Split-brain)指的是在 Redis 主从架构(主节点和副本节点)中,由于网络分区或故障,导致多个节点误以为自己是主节点并同时接受写操作的情况。脑裂会引起数据不一致的问题,并可能导致数据丢失或冲突。

解决 Redis 脑裂的常见方法

  1. 使用 Redis Sentinel 的 quorum(仲裁机制)

  2. Redis Sentinel 是 Redis 官方提供的高可用解决方案,主要功能包括自动故障转移和主节点的监控。通过 Sentinel 配置,可以在主节点失效后自动提升从节点为主节点,同时防止脑裂。

    1. Quorum(仲裁)机制:通过配置 quorum 参数来确保在网络分区时不会因为少数哨兵的错误判断而进行错误的主从切换。

    2. 配置示例

    3. sentinel.conf 中设置:

    4. sentinel monitor mymaster 127.0.0.1 6379 2

    5. 其中,2 表示至少需要 2 个 Sentinel 同意才能进行主从切换操作。通过设置合适的 quorum 值,确保故障转移过程的准确性。

  3. 开启 min-slaves-to-writemin-slaves-max-lag 参数

  4. Redis 提供了防止脑裂的两个重要配置项,min-slaves-to-writemin-slaves-max-lag。这两个配置项通过确保主节点有足够数量的从节点在线并且同步数据延迟在可控范围内,来防止主节点在网络分区时继续执行写操作。

    1. min-slaves-to-write:确保至少有一定数量的从节点同步后,主节点才能接受写操作。

    2. min-slaves-max-lag:控制从节点允许的最大同步延迟时间。

  5. 配置示例

min-replicas-to-write 1 至少需要 1 个副本节点 min-replicas-max-lag 10 最大允许的延迟是 10 秒

  1. 如果 Redis 主节点发现没有足够的从节点处于同步状态或从节点的同步延迟超过了 10 秒,它将拒绝写请求,从而避免脑裂情况引发的数据不一致。

  2. 网络隔离问题的修复

  3. Redis 脑裂问题的根源通常是网络分区引起的,因此定期检查和修复网络问题是防止脑裂的基本措施。可以采取以下措施:

    1. 确保高可用的网络架构,减少网络分区的可能性。

    2. 使用多个网络路径或备份网络链路,以便在主网络故障时有备用网络。

    3. 对 Redis 部署进行合理的网络隔离配置,确保网络问题不容易引发脑裂。

  4. 使用 Redis Cluster

  5. Redis Cluster 本身具备容错和分片特性,可以在 Redis 集群节点发生网络分区时继续正常工作。

    1. 在 Redis Cluster 中,当一个主节点和它的副本失去联系时,其他节点可以选举出新的主节点,确保系统正常运行。

    2. Redis Cluster 的脑裂防护依赖于更多的节点来参与选举,因此需要设置合理的 quorum 值,确保少数派无法做出主从切换的错误决定。

  6. 结合 Keepalived + VIP 解决脑裂

  7. 通过 Keepalived 工具,可以为 Redis 实例配置虚拟 IP(VIP),并通过健康检查来控制 VIP 的主节点归属。

    1. 当 Redis 主节点失效时,Keepalived 自动将 VIP 切换到新的主节点,确保只有一个主节点在处理请求,避免脑裂问题。

    2. Keepalived 通过 VRRP 协议来管理 VIP 的归属,并与 Redis 的高可用机制结合,有效防止脑裂。

预防脑裂的最佳实践

  1. 合理配置 Sentinel

    1. 确保足够数量的哨兵实例(推荐 3 个及以上),以避免误判和错误的主从切换。

    2. 设置适当的 quorum 值,以确保 Sentinel 系统的稳定性。

  2. 使用主从复制中的 min-replicas-to-writemin-replicas-max-lag

    1. 配置 Redis 主节点在网络环境不稳定时拒绝写请求,避免脑裂导致的数据不一致。

  3. 优化网络基础设施

    1. 减少网络分区的可能性,确保 Redis 集群和 Sentinel 之间的网络畅通。

    2. 配置监控系统及时发现网络分区问题。

  4. 结合其它高可用工具

    1. 使用像 Keepalived 这样的工具来控制 VIP 和 Redis 实例的高可用,进一步提升系统的稳定性。

通过以上措施,可以有效预防和解决 Redis 脑裂问题,确保数据一致性和系统的高可用性。

2-redis和@transational共用遇到过那些问题?

连redis事务冲突都这么了解

在 Spring Boot 中,如果同时使用 Redis 和 @Transactional 注解进行事务管理,可能会遇到一些常见问题,特别是在缓存和数据库事务之间保持一致性时。这种场景下,数据可能被不一致地写入 Redis 和数据库,从而引发问题。以下是一些常见问题和解决方案:

1. 缓存和数据库不一致

当 Redis 缓存和数据库同时参与操作时,常见问题是数据的一致性问题。例如,当数据库事务回滚时,Redis 缓存已经更新,但由于数据库没有成功提交,导致数据不一致。

具体问题:
  • 如果数据库的更新操作被回滚,Redis 缓存可能已经提前写入新的值,导致缓存中的数据是错误的,而数据库中的数据仍然是旧的。

  • 当数据库更新成功时,Redis 缓存可能还没更新或过期,从而导致读取到错误数据。

解决方案:
  • 缓存延迟更新:只在数据库事务成功提交后才更新 Redis 缓存。你可以使用 Spring 事务事件监听器,在事务成功提交之后才进行缓存的更新。

  • @Transactionalpublic void updateData() {// 数据库操作// 更新数据库中的数据// 事务提交成功后更新 Redis// 如果事务回滚,这里不会执行 }

  • 使用 Spring 的 TransactionSynchronizationManager 来保证事务完成后更新缓存:

  • TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {@Overridepublic void afterCommit() {// 事务成功后执行更新 Redis 缓存操作 } });

  • 读写模式一致:确保 Redis 和数据库的更新顺序一致,例如:

    • 更新数据库 -> 更新缓存。

    • 删除缓存 -> 更新数据库 -> 添加新的缓存。

  1. Redis 操作不受事务管理控制 Redis 默认是不支持事务回滚的,而 @Transactional 只对数据库操作生效。也就是说,Redis 操作不受数据库事务的回滚或提交控制。如果数据库事务失败或回滚,Redis 中的数据不会自动回滚。

  1. 具体问题:
    • 当事务失败时,数据库的操作可能会回滚,但 Redis 的写入不会回滚,导致 Redis 中缓存的数据和数据库状态不同步。

  1. 解决方案:
    • 手动控制 Redis 缓存的更新:在数据库操作成功之后,再进行缓存的更新或清理。这种方式可以避免在事务回滚时缓存的数据不一致。

    • 延迟操作 Redis:通过 TransactionSynchronizationManager 来控制 Redis 操作的时机,在事务成功提交后进行缓存的操作。

    • @Transactionalpublic void saveDataWithCacheUpdate(Object data) { // 数据库操作 myRepository.save(data); // 事务成功后执行 Redis 操作 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Overridepublic void afterCommit() { // 在事务提交后更新 Redis 缓存 redisTemplate.opsForValue().set("key", data); } }); }

  1. 事务传播行为的影响 如果 Redis 的操作嵌套在数据库事务中,并且 Redis 的操作依赖于数据库的状态,事务传播行为可能导致问题。例如,当事务传播设置为 REQUIRES_NEW 时,Redis 和数据库的操作将使用不同的事务,从而导致不一致。

  1. 具体问题:
    • 如果 Redis 的操作在一个新事务中进行,并且数据库操作回滚,则 Redis 中的数据仍然可能被提交,导致数据库和 Redis 不一致。

  1. 解决方案:
    • 避免 Redis 操作在新的事务中进行:确保 Redis 操作和数据库操作使用相同的事务传播行为,以保证一致性。

    • 手动控制 Redis 操作的时机:例如,在事务提交成功后再进行缓存的更新或删除。

  1. 超时问题 Redis 和数据库操作的执行时间不同,如果 Redis 操作或数据库操作的耗时超过了事务的超时时间,也可能导致事务异常回滚。

  1. 具体问题:
    • 事务超时可能导致数据库操作回滚,但此时 Redis 的操作已经生效,导致缓存和数据库不一致。

    • Redis 操作比较快,但数据库操作可能会比较耗时,如果事务超时,整体操作将失败。

  1. 解决方案:
    • 合理配置事务超时时间:根据具体的业务场景,配置合理的事务超时时间,确保在事务超时时间内完成所有操作。

    • @Transactional(timeout = 30)public void updateData() { // 数据库操作// Redis 操作 }

  1. 并发问题 在高并发场景下,缓存和数据库的更新操作可能会由于不同线程的竞争,导致数据不一致问题。例如,两个线程同时执行,可能会出现先更新 Redis 然后数据库更新未提交成功的情况。

  1. 具体问题:
    • 多个线程同时操作相同的缓存和数据库,可能会导致 Redis 中的数据和数据库中的数据不一致。

  1. 解决方案:
    • 使用分布式锁:在进行 Redis 和数据库的更新时,使用 Redis 的分布式锁机制来确保多个线程不会同时操作相同的数据。

    • 乐观锁:可以使用数据库的乐观锁机制,确保数据库中的数据不会被多个事务同时修改,保证最终一致性。

总结

当 Redis 和 @Transactional 同时使用时,常见的问题包括缓存与数据库不一致、事务回滚时 Redis 不回滚、事务传播带来的问题以及超时和并发问题。为了解决这些问题,常用的方案包括延迟更新 Redis 缓存、手动控制 Redis 操作的时机、合理配置事务传播行为、以及使用分布式锁和乐观锁来确保数据的一致性。


1-redisson加锁和释放锁,业务没处理完,锁到期了,怎么解决

在分布式系统中,使用 Redisson 进行分布式锁管理时,如果业务逻辑没有执行完,而锁已经到期自动释放,这可能会导致其他线程或进程获得锁,导致并发冲突或数据不一致问题。为了避免这种情况,可以采取以下解决方案:

1. 设置合理的锁过期时间

Redisson 默认会为锁设置一个 TTL(Time To Live,即过期时间),如果在业务逻辑执行完之前锁已经过期并释放,就会导致锁竞争。因此,首先要确保锁的过期时间足够长,能够覆盖业务逻辑的执行时间。

你可以通过 tryLock() 方法来指定锁的最大持有时间:

java

复制代码

RLock lock = redissonClient.getLock("myLock"); boolean isLocked = lock.tryLock(10, TimeUnit.SECONDS); // 10秒过期时间

但是这种方法存在一个问题:如果业务处理的时间是不可预估的,直接指定一个固定的超时时间可能会导致锁到期过早或过晚。

2. 使用 Redisson 的自动续期机制

Redisson 提供了 自动续期 功能,在 Redisson 的 RLock 中,当一个线程成功获取到锁后,默认情况下,Redisson 会启动一个守护线程,这个守护线程会每隔一段时间自动为持有的锁续期,确保在业务执行过程中锁不会意外到期。

工作机制:
  • 当你使用 lock() 方法获取锁时,Redisson 会默认设置一个 30 秒的锁过期时间。

  • 如果业务逻辑执行时间超过了这个过期时间,Redisson 会自动延长锁的 TTL 时间,直到锁被手动释放或业务处理完毕。

示例代码

RLock lock = redissonClient.getLock("myLock"); try {// 通过lock()加锁,Redisson会自动续期 lock.lock(); // 业务处理逻辑 } finally {// 业务逻辑处理完毕后手动释放锁 lock.unlock(); }

在这个例子中,锁初始的过期时间是 30 秒,但是 Redisson 的守护线程会自动续期,确保锁在业务逻辑执行期间不会被释放。只有在 unlock() 之后,锁才会真正释放。

3. 手动控制锁续期

如果你想更灵活地控制锁的过期时间,可以手动续期锁。Redisson 提供了 lock.lock(leaseTime, timeUnit) 方法来设置锁的有效期,并且在需要时手动续期。

例如,如果你的业务逻辑需要较长时间处理,可以在业务执行的过程中手动延长锁的生命周期:

RLock lock = redissonClient.getLock("myLock"); try {// 加锁并设置过期时间,比如 60 秒 lock.lock(60, TimeUnit.SECONDS); // 如果业务处理还没有结束并且锁即将到期,手动续期if (/* 业务处理还没有结束 */) { lock.lock(60, TimeUnit.SECONDS); // 再续期 60 秒 } // 业务处理逻辑 } finally {// 业务逻辑处理完毕后手动释放锁 lock.unlock(); }

不过,使用这种方式可能会增加代码的复杂度,因此推荐使用 Redisson 提供的自动续期机制,自动管理锁的过期时间。

4. 锁过期后如何处理异常情况

如果业务逻辑复杂且执行时间不确定,除了合理设置锁的过期时间和利用自动续期机制之外,还可以考虑在锁到期后进行异常处理。

你可以通过以下方式捕获锁释放后的异常情况:

java

复制代码

RLock lock = redissonClient.getLock("myLock"); try {if (lock.tryLock(10, 60, TimeUnit.SECONDS)) { // 尝试获取锁,等待最多10秒,持有时间60秒// 业务逻辑 } else {// 如果获取锁失败,执行相应的处理逻辑throw new IllegalStateException("无法获取锁,任务正在被其他线程执行"); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 处理异常 } finally {if (lock.isHeldByCurrentThread()) { lock.unlock(); // 确保只有持有锁的线程释放锁 } }

在这里,你可以使用 tryLock() 方法来更好地控制锁的获取和处理逻辑。并且,通过检查锁的持有状态,确保不会出现线程未持有锁却意外释放的情况。

5. 使用 Watchdog(看门狗)机制

Redisson 内置了 "Watchdog" 机制(守护线程),这个机制会每隔 10 秒检查一次锁的持有状态,如果锁还在被持有,它会自动为锁续期,防止锁过期导致问题。

只要你使用的是 Redisson 的 lock() 方法而不是 lock(leaseTime, timeUnit),Redisson 就会自动使用 Watchdog 机制来续期。

总结

当 Redisson 加锁时,业务逻辑还未处理完锁就到期了,可能导致并发冲突。解决方案包括:

  1. 设置合理的锁过期时间,确保业务逻辑能在过期时间内完成。

  2. 使用 Redisson 的自动续期机制,这是一种最简单和安全的方式,锁会自动续期,直到你手动释放锁。

  3. 如果自动续期不适用,可以考虑手动续期锁,在需要时延长锁的生命周期。

  4. 处理锁过期异常,确保系统在锁到期后有适当的措施来处理业务逻辑。

推荐使用 Redisson 提供的自动续期机制,简化锁的管理并确保锁不会意外过期。


算法-----

动态规划还是有点难,

双指针,优先队列,二叉树,回溯这些我都可以默写了,

双指针 经典题目 判断有没有环

我看有的大佬每次动态规划都能给出递推,递归,记忆搜索和选择or 不选回溯

dp 数组去记录空间容易炸,

邻接矩阵 占空间,有向 无向,有权,无权

有向 有负权重的只能floyd

bfs 和 dikstra都能解决80%--

大佬的做题记录,太牛了

End --欢迎进群共同成长-------

重要文档

https://springdoc.cn/spring/core.html#beans-factory-type-determination

实用工具--gpt

https://xinghuo.xfyun.cn/desk

https://www.doubao.com/chat/

https://chatgpt.com/c/66dfbb12-9e1c-8001-9cc9-608cb2983ae5

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

HTB-Blue(永恒之蓝漏洞复现)

前言 各位师傅大家好,我是qmx_07,今天给大家讲解Blue靶机 渗透过程 信息搜集 服务器开放了smb服务,漏洞探测显示 具有ms17_010(永恒之蓝漏洞) 利用永恒之蓝 搜索永恒之蓝漏洞 use使用永恒之蓝漏洞 rhost //对方主机 lhost //回连主机 …

[学习笔记]树链剖分(简易版) 及其LCA

树链剖分 先讲解一下一些基础定义(都是在树上) 重儿子: 一个节点中所有儿子中子树大小最大的一个儿子(每个节点最多有一个重儿子)轻儿子: 一个节点除重儿子外所有的节点重链: 若干个重儿子组成的链链顶: 一条链中深度最小的节点 以下图为例子 (红色连续线段为重链) 对于节点…

【LabVIEW】事件结构的用法

本篇文章记录我学习LabVIEW的事件结构用法,希望我的分享对你有所帮助! 目录 一、案例说明 1、 LabVIEW实现“YAXBXC的计算” 2、添加事件结构 一、案例说明 在LabVIEW实现“YAXBXC的计算”的基础上,加上事件结构,实现单击一次按…

分布式锁总结2 - redis实现分布式锁并解决常见问题

目录 1. redis分布式锁 1.1基本原理图示如下 1.2 Redis通过一个lock变量实现一个最简单的分布式锁实现代码: 2 升级简单分布式锁(实现原子加锁与安全删锁) 2.1 但1中的简单分布式锁存在几个问题: 2.1.1 问题1. 如果加完锁执…

Vue.js魔法书:前端开发者的终极指南----指令篇续篇

​个人名片: 😊作者简介:一个为了让更多人看见许舒雅的宝贝的小白先生 🤡个人主页:🔗 许舒雅的宝贝 🐼座右铭:深夜两点半的夜灯依旧闪烁,凌晨四点的闹钟不止你一个。 &am…

计算机网络32——Linux-文件io-2文件系统

1、阻塞和非阻塞 想要将文件以非阻塞方式打开,有两种方式 (1)需要将文件关闭,再用非阻塞方式打开 (2)fctnl函数,先获取旧属性,再添加一个新属性 阻塞函数 阻塞函数一直在等待输入…

MATLAB系列09:图形句柄

MATLAB系列09:图形句柄 9. 图形句柄9.1 MATLAB图形系统9.2 对象句柄9.3 对象属性的检测和更改9.3.1 在创建对象时改变对象的属性9.3.2 对象创建后改变对象的属性 9.4 用 set 函数列出可能属性值9.5 自定义数据9.6 对象查找9.7 用鼠标选择对象9.8 位置和单位9.8.1 图…

使用微信小程序唤起导航的常用方式

1.微信内置地图 可以使用小程序的wx.openLocation方法,该方法可以打开微信内置地图,并显示指定的位置坐标。如果用户手机上安装了其他地图应用,可能会出现选择使用哪个地图应用进行导航的提示。 wx.openLocation({latitude: 目标地点纬度,lo…

滑动窗口(7)_串联所有单词的字串

目录 1. 题目链接: 2. 题目描述 : 3. 解法 : 题目解析: 算法思路 : 图解流程: 代码展示 : 结果分析 : 1. 题目链接: OJ链接:串联所有单词的字串 2. 题目描述 : 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 w…

Llama 3.1 Omni:颠覆性的文本与语音双输出模型

你可能听说过不少关于语言模型的进展,但如果告诉你,有一种模型不仅能生成文本,还能同时生成语音,你会不会觉得特别酷?今天咱们就来聊聊一个相当前沿的项目——Llama 3.1 Omni模型。这个模型打破了传统的文字生成边界,直接让文本和语音同时输出,实现了真正的"多模态…

【uni-app】小兔鲜项目-基础架构-请求和上传文件拦截器

注意事项 uni.request 请求封装 请求和上传文件拦截器 uniapp 拦截器: uni.addInterceptor 接口说明:接口文档 实现需求 拼接基础地址设置超时时间添加请求头标识添加 token 参考代码 // src/utils/http.ts// 请求基地址 const baseURL https://pca…

fastadmin 部署后前台会员中心出现404错误

访问前台会员中心出现404错误。 解决:nginx访问站点增加伪静态 location / {if (!-e $request_filename){rewrite ^(.*)$ /index.php?s$1 last; break;} }在phpstydy中增加伪静态,如图:

Renesas R7FA8D1BH (Cortex®-M85)的UART使用介绍

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 FSP配置UART 2.1 配置参数 2.2 UART模块介绍 3 接口函数介绍 3.1 R_SCI_B_UART_Open() 3.2 R_SCI_B_UART_Close() 3.3 R_SCI_B_UART_Read() 3.4 R_SCI_B_UART_Write() 3.5 R_SCI_B_UAR…

Tiny-universe-taks1-LLama3模型原理

LLama3模型原理-学习打卡 大模型相关知识笔记transformersSelf-Attention(自注意力机制)Multi-Head-Attention(多头注意力机制) LLama梳理 大模型相关知识笔记 transformers 目前市面上主流的大模型算法都给予Transformers架构,如下图所示&…

Spring WebFlux实践与源码解析

Spring WebFlux和Spring MVC区别 如下来自官网Spring MVC和Spring WebFlux技术栈的区别。 可以看到Spring MVC主要是基于Servlet API使用同步阻塞IO架构,每来一个请求都需要启动一个线程进行处理。这种架构对于大量I/O密集型的请求,需要同时启动大量的线…

CTFshow——萌新密码1-4

萌新密码1 53316C6B5A6A42684D3256695A44566A4E47526A4D5459774C5556375A6D49324D32566C4D4449354F4749345A6A526B4F48303D 首先,16进制转字符串 在线字符串/十六进制互相转换—LZL在线工具 (lzltool.cn) S1lkZjBhM2ViZDVjNGRjMTYwLUV7ZmI2M2VlMDI5OGI4ZjRkOH0 发现…

ConflictingBeanDefinitionException | 运行SpringBoot项目时报错bean定义冲突解决方案

具体报错: Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name ‘CommissionMapperImpl’ for bean class [com.xxx.mapper.carrier.CommissionMapperImpl] conflicts with existing, non-co…

OpenAI GPT o1技术报告阅读(2)- 关于模型安全性的测试案例

✨报告阅读:使用大模型来学习推理(Reason) 首先是原文链接:https://openai.com/index/learning-to-reason-with-llms/ 接下来我们看一个简单的关于模型安全性的测试,当模型被问到一个有风险的话题时,会如何思考并回答用户呢&…

JAVA基础,利用for循环找水仙花个数

public class learn2 {public static void main(String[] args) {int count 0;//定义水仙花的个数for (int i 100; i<999; i){int g i%10;int s i/10%10;int b i/100%10;if (i b*b*b s*s*s g*g*g){count1;System.out.println(i);}}System.out.println("一共有"…

MySQL 中的索引覆盖扫描:加速查询的秘密武器

在 MySQL 数据库的使用中&#xff0c;索引是提高查询性能的重要工具。而索引覆盖扫描&#xff08;Index Covering Scan&#xff09;更是一种能显著提升查询效率的技术。本篇文章我们就来深入了解一下 MySQL 中的索引覆盖扫描是什么。 一、什么是索引覆盖扫描 在 MySQL 中&…