常见场景面试题(二)


typora-copy-images-to: imgs
theme: cyanosis

敏感词库的设计,要求增删改查敏感词。敏感词文本匹配,敏感词一万个,文本长度在 20 - 1000

答:使用 trie 树来实现敏感词库的设计,可以利用字符串公共前缀来节约存储空间。

生成 trie 树结构如下:

1697471536524.png

1亿数据只有 1gb 内存怎么去重?

答:问题的本质是海量数据去重,解决方案有两种 bitmap、布隆过滤器。

方案一:bitmap

对于 1 亿的数据来说,如果直接将所有数据读入内存使用 bitmap 来去重的话,对每条数据使用 1 个 bit 标记是否存在即可,1 亿 bit ≈ 12MB,对于一条数据 a 来说,会在 bitmap 中计算出他所放入的下标 x,之后将 x 这个位置标记为1,这样判断一个数据是否存在,只占用 1 bit。

bitmap 方案适用场景:

  • bitmap 适合值域较小的场景,如果值域较大会导致计算出在 bitmap 数组中的下标过大,比较占用存储空间
  • 适合数据密集场景,对于数据稀疏场景比较浪费存储空间,比如数据a下标为0,但是数据b下标为1000000,两个数据中间并没有数据,但是却需要占用存储空间。

方案二:布隆过滤器

当值域较大的情况下,可以使用布隆过滤器进一步压缩 bitmap 的存储空间。

在布隆过滤器中,对一个数据a,布隆过滤器会使用 k 个哈希函数,计算出 k 个哈希值,在 bitmap 中将这 k 个位置都标记为1,来表示这个数据存在。

布隆过滤器适用场景:

  • 适用于不严格去重的场景,因为布隆过滤器的特性会导致存在误判率,当判断为true时,该数据可能在集合中;当判断为 false 时,该数据一定不在集合中。
  • Java中可以使用第三方库来实现布隆过滤器,常见的有Google Guava库和Apache Commons库以及Redis。

项目的登陆密码怎么存储,用的什么加密算法,为什么用 MD5?

答:项目登陆密码都会通过 MD5 + 加盐 操作对明文密码加密存储在数据库中。

MD5 会对每一个铭文密码生成一个对应的固定密码,虽然 MD5 不可逆,但是可以被暴力枚举出来,所以在 MD5 的基础上还会添加加盐操作,通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符。

订单到期后,如何关闭订单?

答:参考文章:https://mp.weixin.qq.com/s/BG1PqUWX0XwJX6aMCXCgvw

  • 方案一:定时任务,定时去扫描所有到期的订单,然后执行关单的动作。

    • 缺点:
      1. 时间不精确,可能订单已经到了超时时间,但是还没有到定时任务执行时间,导致订单关闭时间比超时时间晚。
      2. 无法处理大订单量,如果订单量较大,会导致定时任务执行时间很长,导致后边订单被扫描到的时间很晚。
      3. 对数据库造成压力,定时任务集中扫描表,会大量占用数据库io,可以将定时任务将其他正常业务做好隔离
      4. 分库分表问题,订单系统,在订单量大时会分库分表,在分库分表中进行全表扫描很不推荐
    • 适用场景:
      1. 对过期时间精度要求不高,业务量不大的场景
  • 方案二:JDK自带的延迟队列,DelayQueue,在用户创建订单时,把订单加到 DelayQueue 中,此外,还需要一个常驻任务不断从队列读取已经超时的订单,并进行关闭,之后再将该订单从队列中删除。

    该方案需要有一个线程添加 while(true) 循环,才能确保任务不断执行并及时取出超时订单。

    • 缺点:
      1. 该方案是基于 JVM 内存的,一旦机器重启,会导致数据消失,虽然可以配合数据库的持久化一起使用,但是应用一般都是集群部署,集群中的多台实例的 DelayQueue 如何配合也是一个很大的问题。
      2. 当订单量过大时,可能会导致 OOM 的问题。
    • 适用场景:
      1. 单机,订单量不大
  • 方案三:RockerMQ延迟消息,在订单创建好之后,发送一个延迟消息,指定延迟时间,在延迟时间到达之后,消息就会被消费者消费。

    • 缺点:
      1. RocketMQ的延迟时间不支持任意的,只支持:1s、5s、10s、30s,1m、2m等等(商业版支持任意时长)
    • 适用场景:RocketMQ支持延迟时间和我们所需延迟时间正好符合
  • 方案四:RabbitMQ插件,基于 rabbitmq_delayed_message_exchange 插件,该插件从 RabbitMQ 的 3.6.12 版本开始支持,该插件为官方开发的。

    在 RabbitMQ 中,我们设置一个消息,并且不去消费他,当过了存活时间之后,这个消息会变成死信,会被发送到死信队列中。

    在该插件中,消息并不会立即进入队列,而是先将他们保存到一个基于 Erlang 开发的 Mnesia 数据库,再通过一个定时器去查询需要被投递的消息,再投递到 x-delayed-message 队列中。

    • 适用场景:基于 RabbitMQ 插件的方式实现延迟消息,最大延长时间大概为 49 天,超过时间会被立即消费。可用性,性能都不错。
  • 方案五:Redis 过期监听,监听 key 的过期消息,在接收到过期消息之后,进行订单的关单操作。

    • 缺点:
      1. Redis 不保证 key 在过期时会被立即删除,也不保证消息能立即发出,因此存在消息延迟
      2. 在 Redis5.0 之前,这个消息是通过 PUB/SUB 模式发出的,不会进行持久化,如果发送消息时,客户端挂了,之后再恢复的话,这个消息就会彻底丢失。
  • 方案六:Redis 的 zset

    zset 是一个有序集合,每一个元素关联一个 score,通过 score 来对集合中的元素进行排序

    我们可以将(下单时间 + 超时时间) 与订单号分别设置为 score 和 元素值,通过 redis 进行排序之后,再开启 redis 扫描任务,获取 “当前时间 > score” 的任务,扫描到之后取出订单号,进行关单操作。

    • 优点:使用 redis zset 可以借助 redis 的持久化、高可用机制,避免数据丢失。在高并发场景中,可能多个消费者同时获取同一个订单号,一般采用分布式锁进行解决,也可以做幂等性(多个消费者获取同一个订单号也不影响)进行处理。

      # 命令示例
      # 添加两个元素 a、b 分数为 10、25
      127.0.0.1:6379> zadd delay_queue 10 a
      (integer) 1
      127.0.0.1:6379> zadd delay_queue 25 b
      (integer) 1
      # 查询分数为 9-12 的元素
      127.0.0.1:6379> zrangebyscore delay_queue 9 12 limit 0 1
      1) "a"
      
  • 方案七:Redission,Redission 中定义了分布式延迟队列 RDelayedQueue,即在 zset 基础上增加了一个基于内存的延迟队列,当我们添加一个元素到延迟队列时,redission 会把 数据+超时时间 放到 zset 中,并且启动一个延时任务,当任务到期时,再去 zset 中把数据取出来进行消费,允许以指定的延迟时长将元素放到目标队列中。

    • 优点:可以解决方案六中的并发问题,稳定性,性能较高
  • 方案八:RocketMQ时间轮(https://mp.weixin.qq.com/s/I91QRel-7CraP7zCRh0ISw)

  • 总体来讲,Redission + Redis、RabbitMQ插件、Redis的zset、RocketMQ延迟消息这几种方案比较推荐

一个系统用户登陆信息保存在服务器A上,服务器B如何获取到Session信息?(分布式 Session 共享的解决方案)

答:将 Session 数据存储到分布式缓存比如 Redis 中,所有的服务器都可以访问。

  • 优点:性能优秀、支持横向扩展(Redis集群)
  • 缺点:存在数据丢失风险(虽然 Redis 支持数据持久化,但仍可能丢失小部分数据)

如果让你来评估项目的QPS的话,你会用什么方式来评估?(补充: 不要做压测,就通过现在的设计以及硬件配置推导OPS应该达到什么水准?)

答:首先需要根据业务提供的推广规模、渠道、人数,来评估。这里根据 28 原则进行评估,即 80% 的请求访问在 20% 时间内到达

假如系统有1000万用户,那么每天来点击页面的占比20%,也就是200万用户访问。

假设平均每个用户点击50次,那么总用有1亿的PV(页面浏览量)

一天24个小时,平均活跃时间段算在5个小时内【24*20%】,那么5个小时预计有8000万点击,也就是平均每秒4500个请求。

4500是一个均值,按照电商类峰值的话,一般是3~4倍均值量,也就是5个小时每秒18000个请求【QPS=1.8万】

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Elasticsearch 作为向量数据库:深入研究 dense_vector 和 script_score

Elasticsearch 是一个非常强大且灵活的搜索和分析引擎。 虽然其主要用例围绕全文搜索,但它的用途广泛,足以用于各种其他功能。 其中一项引起许多开发人员和数据科学家关注的功能是使用 Elasticsearch 作为向量数据库。 随着 dense_vector 数据类型的出现…

基本分段存储管理方式(分段,段表,地址转换以及与分页管理对比)

1.分段 1.进程的地址空间: 按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名 (在低级语言中,程序员使用段名来编程),每段从0开始编址. 2.内存分配规则: 以段为单位进行分配,每个段在内存中占据…

学习笔记---超基础+详细+新手的顺序表~~

目录 1.顺序表的前言 1.1 顺序表--->通讯录📇 1.2 数据结构的相关概念🏇 1.2.1 什么是数据结构 1.2.1 为什么需要数据结构 2. 顺序表概念及分类 2.1 顺序表的概念🐙 2.2 顺序表的分类🐫 2.2.1 顺序表和数组的区别 2.…

金x软件有限公司安全测试岗位面试

目录 一、自我介绍 二、你是网络空间安全专业的,那你介绍下网络空间安全这块主要学习的东西? 三、本科专业是网络工程,在嘉兴海视嘉安智城科技有限公司实习过,你能说下干的工作吗?(没想到问的是本科实习…

第一个Spring程序

目录 一、怎么创建Spring项目 1.1 使用maven创建Spring项目 1.2 导入Spring相关依赖 二、Spring的配置文件 三、使用Spring配置文件创建类对象 3.1 Spring核心api 3.2 Spring程序开发 一、怎么创建Spring项目 1.1 使用maven创建Spring项目 在创建新项目的时候使用maven去创建…

NLP算法面经 | 腾讯 VS 美团

作者 | 曾同学 编辑 | NewBeeNLP 面试锦囊之面经分享系列,持续更新中 后台回复『面试』加入讨论组交流噢 lz从3月初脚因打球扭伤了开始,投递简历,接二连三的面试鞭尸又面试,昨天才终于上岸了,分享经验~ 腾讯PCG看点&…

【Python-Django】基于TF-IDF算法的医疗推荐系统复现过程

复现步骤 step1: 修改原templates路径,删除,将setting.py中的路径置空 step2: 注册app python manage.py startapp [app名称]在app目录下创建static和templates目录 step3: 将项目中的资源文化进行拷贝 step4&#…

新能源电池试验中准确模拟高空环境大气压力的解决方案

摘要:针对目前新能源电池热失控和特性研究以及生产中缺乏变环境压力准确模拟装置、错误控制方法造成环境压力控制极不稳定以及氢燃料电池中氢气所带来的易燃易爆问题,本文提出了相应的解决方案。方案的关键一是采用了低漏率电控针阀作为下游控制调节阀实…

《省级国土空间规划编制技术规程》国家标准(GB/T 43214-2023)原文下载

《省级国土空间规划编制技术规程》国家标准(GB/T 43214-2023,以下简称《规程》),将于2024年1月1日起实施,该《规程》由市场监管总局(国家标准委)9月7日批准发布。 《规程》由自然资源部组织编制…

Steam将强制执行短信验证以遏制肆虐的恶意更新

为应对最近爆发的恶意更新,著名游戏平台Steam出品方Valve近日发布公告称,将为Steam 上发布游戏的开发者实施额外的安全措施,包括基于短信的确认码。 游戏及软件开发商在 Steam 平台上分发其产品需要用到Steamworks,它支持DRM&…

GEO生信数据挖掘(九)WGCNA分析

第六节,我们使用结核病基因数据,做了一个数据预处理的实操案例。例子中结核类型,包括结核,潜隐进展,对照和潜隐,四个类别。第七节延续上个数据,进行了差异分析。 第八节对差异基因进行富集分析。…

数据分析案例-基于snownlp模型的MatePad11产品用户评论情感分析(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

Android 内容提供者和内容观察者:数据共享和实时更新的完美组合

任务要求 一个作为ContentProvider提供联系人数据另一个作为Observer监听联系人数据的变化: 1、创建ContactProvider项目; 2、在ContactProvider项目中用Sqlite数据库实现联系人的读写功能; 3、在ContactProvider项目中通过ContentProvid…

深度学习-卷积神经网络

文章目录 应用卷积神经网络卷积处理分类问题 应用 图片分类图片检索图片分割图片风格迁移姿态估计OCR等 卷积神经网络 核概念计算机视觉中处理图片的核大小是通过经验得来的,而深度学习中的权重大小是自己学习出的。卷积VS神经网络:一个是局部观察一个…

Go-Python-Java-C-LeetCode高分解法-第十周合集

前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接:LeetCode-Go-Python-Java-C 欢迎订阅CSDN专栏,每日一题,和博主一起进步 LeetCode专栏 我搜集到了50道精选题,适合速成概览大部分常用算法 突…

【基于windows desktop上的docker配置nacos,并采用宿主机访问】

1、拉取镜像(以下命令全部基于powershell) docker pull nacos/nacos-server2、启动容器 docker run -d -e PREFER_HOST_MODEhostname -e MODEstandalone -e JVM_XMS256m -e JVM_XMX256m -e JVM_XMN128m -p 8848:8848 --name nacos --restartalways nac…

【2】c++11新特性(稳定性和兼容性)—>超长整型 long long

c11标准要求long long整型可以在不同的平台上有不同的长度,但是至少64位,long long整型有两种: 有符号long long:–对应类型的数值可以使用LL或者ll后缀 long long num1 123456789LL; long long num2 123456789ll;无符号unsign…

LeetCode 376. 摆动序列

最长递增子序列 题目链接: 376. 摆动序列 题目描述: 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 **摆动序列 。**第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如…

ArcGIS笔记8_测量得到的距离单位不是米?一经度一纬度换算为多少米?

本文目录 前言Step 1 遇到测量结果以度为单位的情况Step 2 简单的笨办法转换为以米为单位Step 3 拓展:一经度一纬度换算为多少米 前言 有时我们会遇到这种情况,想在ArcGIS中使用测量工具测量一下某一段距离,但显示的测量结果却是某某度&…

雷电模拟器上使用第一个frida(四)第一个HOOK

经过上述三篇,已经可以使用python3.8.10编写代码,利用frida14.2.18和雷电模拟器9.0.60(9),Android 9交互。 雷电模拟器上使用第一个frida(一)之安装-CSDN博客 雷电模拟器上使用第一个frida(二&#xff09…