面试复盘之10-11

Wisansiiz
2024-10-13 / 0 评论 / 2 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2025年07月13日,已超过159天没有更新,若内容或图片失效,请留言反馈。

面试复盘之10-11

redis设置过期时间(setex,setnx)的最大用处?

Redis 设置过期时间的最大用处在于它为缓存管理提供了一种自动和高效的方式来处理数据的生命周期。以下是过期时间设置的几个关键优势:

  1. 自动清理:过期时间允许 Redis 自动删除旧的或不再需要的键,这意味着缓存可以自我维护,释放内存空间,避免无限增长。
  2. 缓存新鲜数据:在数据频繁变化的场景中,通过设置过期时间可以确保缓存中的数据不会过时,从而保持数据的新鲜度和准确性。
  3. 减少数据库负载:对于热点数据,使用 Redis 缓存可以显著减少对后端数据库的查询次数,从而降低数据库的负载。
  4. 会话管理:在 Web 应用中,用户会话信息通常具有临时性,设置过期时间可以自动清除过期的会话,释放服务器资源。
  5. 限流和防刷:通过设置过期时间,可以实现令牌桶或漏桶等限流算法,限制用户在一定时间内的请求次数,防止滥用服务。
  6. 分布式锁:在分布式系统中,使用过期时间可以安全地实现分布式锁,防止锁持有者崩溃导致的死锁问题。
  7. 避免内存滥用:过期时间可以防止缓存中的数据无限期占用内存,从而避免内存资源被滥用。
  8. 提高响应速度:由于 Redis 是基于内存的存储系统,设置过期时间的数据可以快速被访问,这有助于提高应用程序的响应速度。
  9. 实现定时任务:虽然 Redis 不是定时任务调度器,但可以通过设置过期时间来模拟定时任务,例如,定期清理或更新数据。
  10. 优化资源分配:通过过期时间,Redis 可以更有效地分配内存资源,确保重要的数据被保留,而不重要的数据被清除。

总的来说,Redis 设置过期时间的最大用处在于它为缓存数据提供了一种自动和灵活的过期机制,这有助于提高应用程序的性能,减少系统资源的消耗,并确保数据的时效性。

可以设计类似jwt的模式设计邀请链接

将服务器id和过期时间等内容生成一个加密的串,使用时由后端进行解析,而不是生成随机数存入redis。

jwt是什么?

JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象的形式安全地传输信息。每个JWT都是经过数字签名的,因此可以被验证和信任。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。

JWT通常包含三部分,用点(.)分隔:

  1. Header(头部):通常包含两部分:令牌的类型(即JWT)和所使用的签名算法,如HMAC SHA256或RSA。
  2. Payload(负载):包含所要传递的信息。负载可以包含多个声明(claim)。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型:注册的声明、公共的声明和私有的声明。

    • 注册的声明:一组预定义的声明,它们不是强制的,但是推荐使用,以提供一组有用的、可互操作的声明。例如iss(发行者)、exp(过期时间)、sub(主题)、aud(受众)等。
    • 公共的声明:这些可以由使用JWT的各方自定义,但为了避免冲突,建议使用公共的声明名称。
    • 私有的声明:这些是为在客户端和服务器之间传递信息而创建的自定义声明。
  3. Signature(签名):用于验证消息在传输过程中未被篡改,并且,对于使用私钥签名的令牌,还可以验证发送者的身份。签名是使用头部指定的算法和密钥生成的。

JWT的使用场景包括但不限于:

  • 身份验证:用户登录后,服务器可以生成一个JWT,将其发送给客户端。客户端在随后的每个请求中将JWT发送回服务器,服务器通过验证JWT来识别用户。
  • 信息交换:JWT可以安全地在各方之间传输信息,因为JWT是经过签名的,接收方可以验证发送方的身份并确保数据未被篡改。
  • 授权:通过JWT中的声明,可以轻松地检查用户是否有权限执行特定的操作。

JWT的一个关键特点是它的状态lessness(无状态),这意味着一旦JWT被签发,服务器就不需要存储任何关于它的信息,直到它被验证。这使得JWT非常适合分布式系统和大规模应用。

go中的 \`\` 反引号是什么,写在校验后时的反引号又是什么?

在Go语言中,反引号 ` 用于表示 raw string literals,即原始字符串字面量。与传统的双引号 " " 包围的字符串不同,原始字符串字面量中的任何字符都被视为字符串的一部分,不会进行转义处理。这意味着你可以在字符串中包含双引号、反引号本身以及其他特殊字符,而不需要使用反斜杠 \ 进行转义。

type UserListReq struct {
    g.Meta   `path:"/users/{serverId}" method:"get" tags:"UserService" summary:""`
    ServerId uint64 `p:"serverId" v:"required"`
}

这里的 \`p:"serverId" v:"required"\` 是键值对。

validated是如何进行校验的,为什么添加这个注解就能进行校验?

在Java中,Validator 是 Java Bean Validation API(JSR 303/JSR 380)的核心组件,它用于验证Java对象的属性是否符合特定的约束条件。当你在代码中添加了 @Valid@Validated 注解时,实际上是在告诉Spring框架,需要在运行时对这些对象进行验证。

@Valid 注解是JSR 303规范的一部分,它用于触发对象的验证过程。当你在一个对象上使用 @Valid 注解时,框架会自动对该对象进行验证,确保它符合所有定义的约束条件。@Valid 支持嵌套验证,这意味着如果一个对象中包含了其他对象,@Valid 可以递归地验证这些对象,确保整个数据结构都是有效的。

@Validated 注解是Spring框架对JSR 303规范的扩展,它提供了额外的功能,比如分组验证。分组验证允许你为不同的验证场景定义不同的验证规则集合,这样你就可以在不同的上下文中对同一个对象应用不同的验证逻辑。@Validated 通常用于方法级别的验证,并且可以与Spring的AOP功能结合使用,以实现方法执行前的自动验证。

当你在方法参数上添加 @Valid@Validated 注解时,Spring会使用 MethodValidationPostProcessor 在方法执行前进行增强,以确保参数通过验证。如果验证失败,会抛出 MethodArgumentNotValidException 异常,这通常由全局异常处理器捕获并处理,以返回一个友好的错误响应给客户端。

此外,Validator 接口的 forExecutables() 方法用于获取一个专门用于验证方法和构造函数的 ExecutableValidator 实例。这允许你不仅验证对象的属性,还可以验证方法参数和返回值,以及构造函数的参数。

总结来说,添加 @Valid@Validated 注解后,Spring框架会在运行时自动触发验证机制,这是通过Java Bean Validation API提供的基础设施来实现的。这些注解使得开发者可以以声明的方式添加验证规则,而不需要编写冗长的验证逻辑代码,从而提高了代码的可读性和可维护性。

为什么前端项目build后会生成 名字-8位哈希 的文件形式?

将这个文件转化成8位哈希为了确保这个文件没被更改,如果文件或者说项目有更新那么这8位哈希就会发生变化。

ai是这么说的:

  1. 缓存优化:当浏览器加载资源时,它会根据文件名来决定是否使用缓存中的资源。如果文件内容没有变化,浏览器会使用缓存中的版本,而不是重新下载。通过在文件名中包含哈希值,可以确保当文件内容发生变化时,文件名也会变化,这样浏览器就会认为这是一个新文件,并重新下载它。这有助于减少不必要的网络请求和提高页面加载速度。
  2. 并行下载:在构建过程中,可能会生成多个版本的同一资源文件,例如不同主题或语言版本的CSS或JavaScript文件。哈希值确保了即使文件内容相似,它们的文件名也是唯一的,这允许浏览器并行下载这些文件,而不是等待一个文件下载完成后再下载另一个。
  3. 避免硬编码:在构建过程中,资源文件可能会被压缩、合并或其他方式处理。哈希值作为文件名的一部分,可以自动反映文件内容的变化,开发者无需手动更新引用路径。
  4. 自动化部署:在自动化部署流程中,哈希值可以帮助版本控制和回滚。如果新版本的构建出现问题,可以通过哈希值快速定位并回滚到之前的稳定版本。
  5. 安全性:哈希值可以作为一种安全措施,防止攻击者通过篡改文件名来替换资源文件。由于哈希值是内容的函数,任何未经授权的更改都会导致哈希值不匹配,从而可以检测到文件被篡改。

为什么orm框架(mybatis)写sql时要使用 ? server_id = ?,为什么不直接使用字符串拼接呢?

sql注入,学mybatis的时候就讲了,防止sql注入,如果以字符串的形式进行拼接,假设前端在传来字符的同时传来了 where=1 形成 XXX where=1 那么由于是拼接字符串所以这一整串就会被当成sql执行,因为这串sql是正确的不报错的,那么就会执行前端传来的这一串字符,在增删改查时就会出现可怕的问题。

哈希是什么?

哈希是一种将任意长度的输入(通常是数据,如文本、数字、图片等)通过哈希算法转换成固定长度的输出(哈希值)的单向转换过程。哈希值通常被用来表示原始数据的“指纹”或“摘要”。

什么是bean?

在Spring框架中,"Bean" 是一个被广泛使用的术语,它指的是由Spring容器管理的对象。在Spring中,几乎所有的对象都是Beans。Spring框架的核心是其控制反转(IoC)容器,它负责实例化、配置和组装对象,这些对象被称为"Beans"。

以下是Spring中Bean的一些关键概念:

  1. 由Spring容器管理:Bean的生命周期由Spring容器管理,包括它们的创建、销毁、以及它们之间的依赖关系。
  2. 配置元数据:Bean的定义通常在XML配置文件、注解或Java配置类中进行声明。这些配置元数据告诉Spring如何创建和组装Bean。
  3. 单例或原型:Spring Beans默认是单例模式,意味着每个由Spring容器管理的Bean有且仅有一个实例;然而,也可以配置为原型模式,即每次请求都会创建一个新的Bean实例。
  4. 依赖注入(DI):Spring容器使用DI来满足Bean的依赖关系。它可以将Bean的依赖关系以setter方法、构造函数或字段注入的方式注入到Bean中。
  5. 作用域:除了单例(singleton)和原型(prototype),Spring还支持其他作用域,如请求(request)、会话(session)和应用(application)等,这些作用域通常用于Web应用程序。
  6. 生命周期回调:Spring提供了几种生命周期回调方法,如init-methoddestroy-method,以及通过实现InitializingBeanDisposableBean接口来定义自定义的初始化和销毁逻辑。
  7. 自动装配:Spring可以根据配置自动装配Bean之间的依赖关系,这减少了代码中的硬编码耦合。
  8. 模板方法模式:Spring框架本身也使用了模板方法模式,定义了一组模板方法(如getBeanregisterBean等),具体的子类(如XmlBeanFactoryAnnotationConfigApplicationContext等)实现了这些模板方法的细节。

在Spring应用程序中,几乎所有的对象都是Beans,包括服务、数据访问对象(DAO)、控制器、工具类等。通过使用Spring框架,开发者可以更加专注于业务逻辑的实现,而不必关心对象的创建和管理。

要学会(好)go开发后端就要先熟练java,spring那一套

反问和思考

@Component和@Bean的区别是什么?

@Component@Bean 是Spring框架中两个非常重要的注解,它们都用于定义Spring容器中的bean,但它们的使用场景和含义有所不同。

  1. @Component

    • @Component 是一个类级别的注解,用于声明一个类是Spring容器中的一个组件。
    • @Component 注解的类会自动被Spring扫描并注册为bean,这意味着你可以在需要的时候通过依赖注入(DI)来使用这个类的实例。
    • @Component 可以放在接口的实现类上,也可以放在具体的类上,但通常不推荐放在接口或者抽象类上,因为这样不会实例化。
    • @Component 还有几个衍生注解,如 @Service@Repository@Controller,它们是 @Component 的特化,提供了额外的语义信息,但本质上都是用来声明组件的。
  2. @Bean

    • @Bean 是一个方法级别的注解,用于声明一个方法的返回值应该是Spring容器中的一个bean。
    • 当Spring容器创建和初始化带有 @Bean 注解方法的类时,会调用这些方法并将返回值注册为bean。
    • @Bean 注解通常用在配置类中,这些配置类通常带有 @Configuration 注解,表示它们包含了一系列的bean定义。
    • 使用 @Bean 注解可以更灵活地定义bean,因为你可以在方法中编写复杂的逻辑来生成bean实例,比如进行一些计算或者根据条件返回不同的实例。
    • @Bean 注解提供了更多的配置选项,比如 initMethoddestroyMethod,允许你指定bean的初始化和销毁方法。

总结区别:

  • @Component 用于声明类作为bean,而 @Bean 用于声明方法的返回值为bean。
  • @Component 通常用于简单的bean定义,而 @Bean 用于更复杂的bean定义,需要在创建过程中进行额外的处理。
  • @Component 是类级别的注解,而 @Bean 是方法级别的注解。
  • @Component 可以自动被Spring扫描并注册,而 @Bean 需要在配置类中显式定义。

在实际开发中,你可以根据需要选择合适的方式来定义你的bean。

0

评论 (0)

取消