Published on

面试 Web 后端

Authors
  • avatar
    Name
    Shelton Ma
    Twitter

web后端

1. 使用redis做缓存的功能

Redis 缓存的工作原理:

  1. 缓存命中(Cache Hit):当请求的数据存在于 Redis 中时,就直接返回 Redis 的缓存数据,这样就能避免去数据库查询,提高响应速度。
  2. 缓存未命中(Cache Miss):当请求的数据不在 Redis 中时,系统会查询数据库获取数据,并将数据存入 Redis,以便下次访问时能够命中缓存。
  3. 缓存失效(Cache Expiration):缓存中的数据设置了过期时间,到了过期时间后,数据就会从 Redis 中删除。这个机制可以有效避免缓存的“脏数据”问题。

关键点

  • 缓存过期:通过 setex 方法可以为缓存设置过期时间,防止缓存数据长期存在导致不一致。
  • 缓存穿透:如果查询的内容非常频繁,缓存的数据被清除后,可能会导致数据库压力增大。可以通过布隆过滤器等方式来避免缓存穿透。
  • 缓存雪崩:如果大量缓存数据在同一时刻过期,可能导致数据库压力增大。可以通过随机设置过期时间来分散过期时间,减少瞬间压力。

2. 消息队列

Redis 和 RabbitMQ 都是常见的消息中间件,但它们的设计目标、功能和适用场景有所不同。下面是它们的对比分析:

  1. redis 主要用于高速读写、数据缓存、实时数据处理、临时存储等场景。
  2. RabbitMQ 主要用于高可靠性、消息队列、事件驱动架构、任务调度等场景。
特性RedisRabbitMQ
设计目标高速缓存、临时数据存储、Pub/Sub消息队列、任务调度、异步消息传递
消息持久化不持久化(默认),可以持久化数据支持消息持久化,确保消息不丢失
消息确认不支持消息确认支持消息确认(ACK)
性能极高的性能,低延迟,高吞吐量性能较低,但高可靠性
可靠性消息丢失风险大消息可靠性高,支持消息重试和确认
适用场景高并发、实时数据、缓存、Pub/Sub任务调度、异步处理、事件驱动架构
扩展性支持水平扩展(Redis Cluster)支持集群模式和高可用队列

3. 关系型数据库与非关系型数据库

非关系型数据库: 数据结构灵活(如爬虫数据), 简单数据查询, 不涉及复杂查询和连接操作

4. JWT(JSON Web Token)

JWT(JSON Web Token)包含三部分:

  1. 头部(Header)

    • 头部通常由两部分组成:

    • alg:签名算法,常见的有HS256、RS256等。

    • typ:令牌类型,通常是JWT。

        { 
          "alg": "HS256",
          "typ": "JWT"
        }
      
  2. 载荷(Payload)

  3. 签名(Signature)签名部分用于验证令牌的完整性以及身份验证。签名是使用头部中的alg指定的算法,通过对头部和载荷进行编码,并与密钥一起计算得到的。其目的是确保JWT在传输过程中未被篡改。

5. JWT 和 Session 存储的方式和机制

简而言之:

  • JWT 存储在客户端,是无状态的,适合于分布式、无状态的应用。
  • Session 存储在服务器端,是有状态的,适合于单一应用或需要维护会话的场景。