前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【面经】淘天Java一面面经(上)

【面经】淘天Java一面面经(上)

原创
作者头像
后端码匠
发布2023-11-07 16:22:31
2890
发布2023-11-07 16:22:31
举报
文章被收录于专栏:后端码匠

一、为什么要用Redis,有预估QPS的提升幅度吗?

简介

Redis(Remote Dictionary Server),即「远程字典服务」是一个使用 ANSI C 编写的、开源的、支持网络的、基于内存的、可选持久化的键值对存储系统。

根据数据库使用排行网站 http://db-engines.com 上的排名,Redis 是目前最流行的键值对存储系统。

选型

目前业内主要的缓存组件有:redis、memcached,主要特点如下:

Redis:C语言编写、resp协议、数据结构丰富(string、list、hash...)、单线程模型、淘汰策略(LRU、LFU、随机...)、持久化(RDB、AOF)支持副本机制、支持高可用(主从、哨兵)、支持集群(采用分片集群);

memcached:C语言编写、memcached协议、数据结构单一(仅支持string)、多线程模型、淘汰策略仅支持LRU策略、不支持持久化、不支持副本机制、不支持高可用、支持集群(采用客户端路由)。

用一句话总结:在性能相差不大的情况下,Redis 提供了更丰富的数据类型,同时,对可靠性以及扩展性也提供了较好的支持。

预估QPS的提升幅度吗?具体业务具体分析。

二、Redis内存不够用怎么办

Redis是基于内存的数据库,当数据量过大或者配置不合理时,就有可能导致Redis的内存满。内存满的情况会严重影响Redis的性能和可用性,甚至导致系统崩溃。因此,了解Redis内存满的原因以及如何应对是非常重要的。

Redis造成内存满的几种原因包括:

1、数据量过大;

2、键过期策略机制不合理;

3、内存碎片:Redis使用内存分配器来管理内存,当频繁进行键的删除和修改操作时,可能会产生内存碎片。内存碎片会导致内存无法被充分利用,最终导致内存满;

4、内存泄露;大量短期数据存储;

为了避免Redis内存满的问题,需要合理配置Redis的内存大小,设置合理的键过期时间,定期清理过期的键值对,避免内存碎片和内存泄漏问题,并根据实际需求进行监控和调优。

解决方案如下

1、增加内存:可以通过增加Redis实例的内存大小来解决内存满的问题。可以通过修改Redis配置文件中的maxmemory参数来设置Redis实例的最大内存限制。如果Redis实例运行在集群模式下,可以增加集群中的节点数量来增加总体的内存容量;

代码语言:shell
复制
# Redis最大内存限制
>CONFIG SET maxmemory 100mb 
# 达到限制时淘汰策略
>CONFIG SET maxmemory-policy allkeys-lru

通过Redis命令动态设置

代码语言:shell
复制
config set maxmemory 100mb

2、设置过期时间:可以通过设置键的过期时间来释放一些不再使用的键值对。可以使用EXPIRE命令或者在插入键值对时设置过期时间;

代码语言:shell
复制
# 这个key将在5秒后自动删除
set key value EX 5
# 在set命令中指定过期时间(毫秒),这个key将在100000毫秒(100秒)后自动删除
set key value PX 100000
# 使用expire命令为已有key设置过期时间(秒),为已存在的key设置20秒过期时间
expire key 20
# 使用pexpire命令为已有key设置过期时间(毫秒),为已存在的key设置120000毫秒(120秒)过期时间
pexpire key 120000 
# 使用expireat命令直接设置key的过期时间,将key的过期时间设置为Unix时间戳1655097600
expireat key 1655097600

3、使用LRU算法:可以通过设置Redis的maxmemory-policy参数为allkeys-lru来启用LRU(最近最少使用)算法。当内存满时,Redis会自动删除最近最少使用的键值对来腾出空间。

代码语言:shell
复制
# 达到限制时淘汰策略
CONFIG SET maxmemory-policy allkeys-lru

LRU(Least Recently Used) 是一种常用的页面置换算法, 主要用于缓存系统中淘汰对象的策略。 其核心思想是: 最近最少使用的对象会被优先淘汰。 即当缓存已满时, 会优先删除最久未被访问的对象, 以腾出空间缓存热点数据。

基本思路就是:按对象的访问时间来排序, 最近访问的对象排在前面, 最久未访问的排在后面;当需要淘汰对象时, 选择列表尾部的对象(最久未访问的)进行淘汰;当一个对象被访问时, 将其从原位置删除, 并重新插入列表头部。

这样随着访问过程的演变, 列表头部始终为热点数据, 列表尾部始终为最冷的数据。

代码语言:java
复制
import java.util.HashMap;
import java.util.Map;

class LRUCache {
   private int capacity;
   private Map<Integer, Node> cache;
   private Node head;
   private Node tail;

   class Node {
      int key;
      int value;
      Node prev;
      Node next;

      Node(int key, int value) {
         this.key = key;
         this.value = value;
      }
   }

   public LRUCache(int capacity) {
      this.capacity = capacity;
      cache = new HashMap<>();
      head = new Node(0, 0);
      tail = new Node(0, 0);
      head.next = tail;
      tail.prev = head;
   }

   public int get(int key) {
      if (cache.containsKey(key)) {
         Node node = cache.get(key);
         removeNode(node);
         addToHead(node);
         return node.value;
      }
      return -1;
   }

   public void put(int key, int value) {
      if (cache.containsKey(key)) {
         Node node = cache.get(key);
         node.value = value;
         removeNode(node);
         addToHead(node);
      } else {
         if (cache.size() == capacity) {
            cache.remove(tail.prev.key);
            removeNode(tail.prev);
         }
         Node newNode = new Node(key, value);
         cache.put(key, newNode);
         addToHead(newNode);
      }
   }

   private void removeNode(Node node) {
      node.prev.next = node.next;
      node.next.prev = node.prev;
   }

   private void addToHead(Node node) {
      node.next = head.next;
      node.next.prev = node;
      node.prev = head;
      head.next = node;
   }
}

4、持久化数据:可以使用Redis的持久化机制将数据写入磁盘,以释放内存空间。Redis支持两种持久化方式:RDB(Redis Database)和AOF(Append-Only File)。可以根据实际需求选择适合的持久化方式。

5、分片数据:可以将数据分片存储在多个Redis实例中,减少单个实例的内存压力。可以使用Redis的分片技术,如Redis Cluster或者使用第三方的分片方案。

6、优化数据结构:可以通过优化数据结构来减少内存占用。例如,使用Redis的数据结构中最适合的类型,避免使用不必要的数据结构。

7、监控和调优:可以使用Redis的监控工具来监控内存使用情况,并根据监控结果进行调优。可以使用Redis的命令行工具或者第三方的监控工具。

Redis内存满是一个常见的问题,但我们可以采取一些措施来应对这个问题。首先,合理配置Redis的内存大小,确保它能够容纳所需的数据量。其次,设置合理的键过期时间,及时清理过期的键值对,避免内存不断增长。此外,定期监控Redis的内存使用情况,及时发现并解决内存泄漏、内存碎片等问题。最后,根据实际需求进行性能调优,例如使用持久化机制、使用压缩算法等,以减少内存占用。通过以上措施,我们可以有效应对Redis内存满的问题,保证系统的稳定性和性能。

三、是否定义、设计过业务模型

业务模型是一种抽象表现用来描述和解释组织或公司如何运作。它涵盖了组织的目标、策略、业务流程、组织结构、操作规则、信息流等。业务模型作为桥梁,连接了组织的战略目标与具体实现,它是理解和改进业务的关键工具。

业务模型的核心构成

  1. 业务目标:明确组织的战略目标和追求的价值。
  2. 业务流程:描述了组织如何创建价值,包括核心和支持流程。
  3. 组织结构:展示了公司的部门、团队和职责分工。
  4. 价值主张:组织提供给客户的独特价值和优势。
  5. 客户关系:如何与客户互动和满足客户需求。
  6. 合作伙伴:外部的合作关系和资源共享。
  7. 收益结构:收入来源和盈利模式。

业务模型的类型

  1. B2C模型:直接面向消费者提供产品或服务。
  2. B2B模型:专注于为其他企业提供解决方案。
  3. 混合模型:结合了B2C和B2B的特点。
  4. 订阅模型:通过定期订阅获取收益。
  5. 共享经济模型:通过平台共享资源。

创建业务模型

  1. 识别组织目标:明确业务的使命、愿景和战略方向。
  2. 分析市场环境:了解市场趋势、竞争对手和目标客户。
  3. 设计业务流程:规划如何提供价值和实现目标。
  4. 选择合适模型:根据实际情况选择或创造适合的业务模型。
  5. 实施与评估:执行业务模型,并不断评估和优化。

业务模型与软件开发

在软件开发中,业务模型可以帮助开发团队理解和精确捕捉用户需求。通过分析和建立业务模型,可以更好地定义软件系统的功能、架构和界面。

实事求是。

四、百万级用户规模服务上线的话需要做什么

将一个百万级用户规模的服务上线需要综合考虑多个因素,包括技术、基础设施、性能、安全和可伸缩性。

  1. 需求分析和规划
    • 了解用户需求,确保您的服务满足其期望。
    • 制定清晰的发展规划,包括功能扩展和性能提升计划。
  2. 架构设计
    • 设计高可用性架构,包括负载均衡、冗余、故障恢复和容灾计划。
    • 考虑微服务架构,以提高可伸缩性和模块化。
  3. 性能优化
    • 进行性能测试,确保系统能够承受高负载。
    • 使用缓存和CDN(内容分发网络)来加速内容传输。
    • 优化数据库查询和索引以提高数据访问性能。
  4. 安全性
    • 实施强大的身份验证和授权措施,以保护用户数据。
    • 定期进行安全审计和漏洞扫描,以确保系统的安全性。
    • 建立应急响应计划,以应对潜在的安全事件。
  5. 可伸缩性
    • 考虑水平扩展,使用云服务或容器化技术。
    • 使用自动化工具来管理和扩展基础设施。
    • 实施负载测试,以确保系统能够满足用户规模的需求。
  6. 监控和日志
    • 部署监控系统,以实时监视性能、可用性和安全性。
    • 配置日志记录,以便进行故障排查和审计。
  7. 数据管理
    • 开发数据备份和恢复策略,以应对数据丢失或损坏的情况。
    • 考虑数据隐私法规,确保合规性。
  8. 用户支持
    • 建立客户支持团队,以满足用户的需求和问题。
    • 提供多种沟通渠道,如在线聊天、电子邮件和电话支持。
  9. 合规性
    • 遵守适用的法规和法律,特别是涉及用户数据的法规,如GDPR或CCPA。
  10. 发布和营销
    • 制定上线计划,并确保系统准备好接受流量。
    • 有效地宣传和营销您的服务,以吸引用户。
  11. 反馈和改进
    • 收集用户反馈,并持续改进服务。
    • 考虑用户体验,使其易于使用和导航。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、为什么要用Redis,有预估QPS的提升幅度吗?
  • 简介
    • 选型
    • 二、Redis内存不够用怎么办
    • 三、是否定义、设计过业务模型
    • 四、百万级用户规模服务上线的话需要做什么
    相关产品与服务
    云数据库 Redis
    腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档