一般会通过定时任务或者消息队列的延迟消息来实现订单超时取消功能。
定时任务定时任务的逻辑就是扫描已创建未支付的订单,判断订单的创建时间与当前时间的差值,如果已经超过了预设的超时时间,比如 10 分钟,那么就将订单状态更新为已取消。
比如可以每 1 分钟扫描一次表,直接根据当前时间和超时时间得到筛选的时间,比如当前是 14:00,那么 13:50 分之前创建的订单未付款其实都超时了,将这个时间...
所谓的单例一般指的是一个进程中一个类对应只有一个实例对象,也就是进程唯一。
而分布式,不过是一个机器部署多个服务,还是多个机器部署,本质上就是多进程,所以所谓的分布式单例指的是这个实例对应需要在多进程中保持唯一。
按照这个思路,我们仅需控制同一时刻,只会有一个进程使用这个单例对象即可,而分布式场景下的分布式锁就很容易实现这个功能。
多个进程竞争分布式锁,谁抢到锁,谁此时就可以使用这个单例对象...
限流是什么?首先来解释下什么是限流?
在日常生活中限流很常见,例如去有些景区玩,每天售卖的门票数是有限的,例如 2000 张,即每天最多只有 2000 个人能进去游玩。
那在我们工程上限流是什么呢?限制的是 「流」,在不同场景下「流」的定义不同,可以是每秒请求数、每秒事务处理数、网络流量等等。
而通常我们说的限流指代的是 限制到达系统的并发请求数,使得系统能够正常的处理 部分 用户的请求,来...
根据问题推断这个排行榜是一个动态的排行榜,店铺内商品一直在售卖,因此排行榜也会一直在变,所以如果利用数据库来排行计算效率会非常低,总不能每卖一单就利用数据库排序计算得到排行榜吧?
所以排除数据库这个方案。
应对数据库效率差的情况,我们常用的替代方案就是缓存,而 Redis 内有个 zset 可以实现排行榜的功能。
每个商家都对应有个 zset,score 存储商品售卖的数量,value 存储...
首先我们要理清朋友圈点赞具体需要涉及哪几个功能点:
1)存储点赞信息
需要存储哪些用户点赞了这条朋友圈,具体需要存储用户ID、点赞时间即可。
2)取消点赞
需要快速找到这名用户,将其移除点赞列表。
3)获取点赞列表
朋友圈需要展示点赞的用户头像列表信息.
核心就是这么三点,其实就是增删查,那用什么来实现比较合适呢?
实现快速存储和删除,Set 就挺合适,而且还能天然去重,但是常见的 Hash...
回答重点HashMap 是 非线程安全 的。因为 HashMap 的内部实现并没有加锁,多个线程同时访问和修改时可能会引发数据竞争,导致数据不一致或陷入死循环等问题。
如何实现一个线程安全的 HashMap要实现一个线程安全的 HashMap,有多种设计方案,下面是几种常见的实现方法:
使用 Collections.synchronizedMapJava 提供了一个简单的方法,可以将非线程安...
最简单的可以使用 ConcurrentHashMap + AtomicInteger + 定时任务实现内存中的统计。
ConcurrentHashMap 的 key 为方法的名称、value 为 AtomicInteger 类型,记录调用次数,可以通过 aop 切面实现每个方法调用都记录到 ConcurrentHashMap 中,然后利用定时任务每 60 s 统计一次所有方法的数量,再清空 ...
回答重点Dubbo 是一个 RPC 框架,其支持 HTTP 调用和 RPC 调用。
Feign 是一个 HTTP 客户端,它通过 HTTP 协议进行通信,通常用于调用 RESTful API。
我们这里还是使用表格的方式来列举,如下所示:
回答重点PostgreSQL 的体系结构主要包括:进程结构、存储结构、共享内存、后台进程和 WAL(Write-Ahead Logging)。
与 MySQL 的主要区别:
1)SQL 标准的兼容性:PostgreSQL 更加接近 SQL 标准,而 MySQL 在某些情况下会有具体的实现在标准之外。2)事务处理:PostgreSQL 提供了全面的 ACID(原子性、一致性、隔离性、持久性)支...
回答重点MyISAM :1)MyISAM 是基于 ISAM 引擎而来的,支持全文检索、数据压缩、空间函数,不支持事务和行级锁,只有表级别锁,它适用于 OLAP 场景,也就是分析类的,基本上都是读取,不会有什么写入动作的场景。
2)MyISAM 的索引也是 B+ 树,只是不像 InnoDB 那种叶子节点会存储完整的数据,MyISAM 的数据是独立于索引单独存储的,所以主键和非主键索引差别不大。...
回答重点Dubbo 是一个 RPC(远程过程调用)框架,主要用于服务之间的通信。它提供高性能的 RPC 调用、负载均衡、服务发现、服务注册、服务治理等功能。
适用于需要高性能 RPC 调用的分布式系统,常用于内部服务通信。
Spring Cloud Gateway 是一个 API 网关,用于处理外部客户端请求并将其路由到后端服务。它提供请求路由、负载均衡、协议转换、安全管理、流量控制、日志和...
回答重点explain 主要用来 SQL 分析,它主要的属性详解如下:
id:查询的执行顺序的标识符,值越大优先级越高。简单查询的 id 通常为 1,复杂查询(如包含子查询或 UNION)的 id 会有多个。
select_type(重要):查询的类型,如 SIMPLE(简单查询)、PRIMARY(主查询)、SUBQUERY(子查询)等。
table:查询的数据表。
type(重要):访问...
回答重点选择执行计划一般需要经过以下几个步骤:
1)将 SQL 语句解析为解析树。
2)预处理,包括语法检查、权限验证、查询重写(例如常量表达式计算、子查询展开等)。
3)生成多个执行计划,并选择成本最低的执行计划。
扩展知识优化器成本的计算方式实际上优化器的内部实现方式比较复杂,我们仅需着重关心它的成本计算,这样能更好地理解 SQL 的执行计划是如何选择的。
MySQL 会根据成本来选择最...
回答重点Elasticsearch 索引文档的具体流程如下:
1)客户端发送索引请求给某个节点(称为协调节点)。2)协调节点根据文档的 ID 计算其所属的主分片(primary shard)。3)协调节点将请求转发给对应主分片所在的节点(称为主分片节点)。4)主分片节点进行索引操作,并将结果同步给其所有副本分片(replica shards)。5)所有副本分片确认接收到数据并完成索引操作后,...
回答重点Elasticsearch 数据写入的工作原理主要包括以下几个步骤:
1)首先,客户端发送写请求到 Elasticsearch 集群的某个节点,通常是协调节点。2)协调节点将请求转发到相应的主分片。3)主分片负责将数据写入并创建一个新的版本号。4)主分片将数据同步到所有的副本分片。5)所有副本分片确认收到数据后,协调节点返回成功响应给客户端。
扩展知识1)客户端发送请求:客户端将写操...
回答重点在Elasticsearch中,倒排索引的原理主要是基于文档和词项之间的映射关系。倒排索引包含两个主要部分:词典和倒排表。词典存储了所有词项的集合,而倒排表则保存了每个词项在所有文档中的位置。通过这种结构,Elasticsearch可以快速地从词项找到相关的文档,从而实现高效的全文检索。
简单来说,当你向Elasticsearch提交一个文档时,系统会将文档拆分成单词(词项),并在倒...
回答重点Elasticsearch 是一个分布式搜索和分析引擎,当接收到一次数据搜索请求时,主要经历以下几个流程:
1)客户端发起请求:用户或应用程序通过 RESTful API 或者其他客户端工具发起搜索请求。2)请求到达节点:请求被发送到 Elasticsearch 集群中的某个节点,这个节点被称为“协调节点”或者“客户端节点”。3)请求解析和路由:协调节点解析请求并确定需要查询的索引和...
回答重点全文检索(Full-Text Search)指的是对文本数据进行索引,以便快速、高效地通过自然语言查询找到相关文档的技术。它不仅关注单词的完全匹配,还试图理解和处理语言的复杂性,如同义词、词形变化等。
Elasticsearch 的全文检索通过以下步骤实现:
1)文档存储:Elasticsearch 将数据存储为文档(JSON格式)。
2)索引创建:文档中的文本数据会被分词器(Ana...
回答重点正向索引是一种根据文档内容构建索引的方式,每个文档都包含了自己所包含的词项信息及其在文档中的位置。这种索引方式类似于传统的数据库,数据存储方式比较直观,方便快速检索单个文档的内容。
正向索引和倒排索引在Elasticsearch中最主要的区别在于:1)结构不同:正向索引是由文档到词项的映射,而倒排索引是由词项到文档的映射。2)使用场景不同:正向索引更适合检索单个文档,而倒排索引更适合...
回答重点字典树,也叫前缀树(Trie),是一种用于高效存储和检索字符串集合的数据结构。它是树形结构,通常用于搜索引擎自动补全、拼写检查、前缀匹配等应用场景。在字典树中,每个节点表示一个字符,根节点为空字符,路径代表单词或字符串。
Elasticsearch 利用字典树来构建和索引反向字典索引。这种结构使得它能够快速且高效地执行全文搜索和前缀匹配。
扩展知识1)字典树的特点:
每个节点包含一...
回答重点在 Elasticsearch 中,有几个核心的数据模型概念需要掌握:1)索引(Index):这是 Elasticsearch 中数据的逻辑集合。一个索引类似于数据库,是具有相同特性的数据集合。2)类型(Type):在6.x版本之前,索引中可以有多个类型(类似于表),每种类型有唯一标识符。但从7.x版本开始,索引只能有一个类型 _doc。3)文档(Document):这是数据的最小单...
回答重点倒排索引(Inverted Index)是 Elasticsearch 的核心数据结构之一。它类似于一本书的索引,可以快速找到包含某个单词的所有文档。倒排索引的作用主要是提高搜索效率,使得全文搜索能够在一个大数据集上进行快速而精确的查找。
扩展知识1)倒排索引的基本概念:倒排索引与传统的正向索引(Sequential Index)相对。正向索引是按照文档顺序记录每个文档的内容,而倒排...
回答重点在 Elasticsearch 中,Term Dictionary(术语词典)是用来存储索引中的所有唯一词条(terms)的数据结构。其主要功能是支持快速高效的检索和过滤操作。Elasticsearch 使用倒排索引来实现全文检索,而 Term Dictionary 则是这个倒排索引的核心部分之一。
具体实现方面,Elasticsearch 使用 Lucene 库来管理和维护术语词典...
回答重点NRT(Near Real-Time,近实时)搜索是指一种系统架构使得查询语句能够在接近实时的情况下得到最新的数据结果。通俗地讲,它是在数据写入到系统之后的极短时间内(通常是秒级),用户可以对这些数据进行搜索和分析。这一点显著区别于传统的批处理系统,后者通常会有比较长的延迟。
在 Elasticsearch 中,NRT 是其核心特性之一。Elasticsearch 通过将数据分片存储...
回答重点Elasticsearch 中的分析器(Analyzer)是处理文本数据的核心组件之一。具体来说,分析器是由一个或多个过滤器和一个分词器组成的。它的主要工作是将一段文本解析成词或词组,并进行清洗和标准化处理,从而便于索引和搜索。
1)分析器的组成部分:
字符过滤器:用于预处理文本,比如去除 HTML 标签或者转换特殊字符。
分词器:把文本分解成一个个词或词组。主流的分词器包括标准分...
回答重点Shard Allocation Awareness(分片分配意识)是 Elasticsearch 中的一项功能,旨在增强集群的弹性和高可用性。它通过对数据分片的分配规则进行自定义,使数据在物理节点上分布得更合理,进而提高集群的容错能力和性能。
在设定 Shard Allocation Awareness 时,我们通常会指定一些”识别标签”(如机架名、数据中心名等),让 Elasti...
回答重点Elasticsearch 中的 River 是一个用于从外部数据源(如 MySQL、MongoDB、Twitter 等)导入数据到 Elasticsearch 的插件。它可以自动地从指定的数据源获取数据并索引到 Elasticsearch 中。早期,River 是 Elasticsearch 提供的一种常见的数据导入方法。
但是,现在 River 不再推荐使用了,主要原因有以下几点...
回答重点Elasticsearch 在分布式环境下的数据分布主要通过分片(Shard)和副本(Replica)来实现。一个索引中的数据会被拆分成多个主分片(Primary Shards),每个主分片又可以有多个副本,以确保数据的高可用性和容错性。主分片和副本分片会分布在集群中的不同节点上,具体来说:
1)分片(Shard)是Elasticsearch水平扩展的基础。每个索引可以设置若干主分片...
回答重点Elasticsearch 集群中会出现脑裂(“split brain”)的情况主要是由于网络分区或节点故障,导致集群中的子集相互之间无法通信,各自选出自己的主节点,形成多个彼此独立的集群。这种情况会带来数据不一致和严重的数据丢失。
要解决脑裂问题,可以采取以下措施:1)确保使用奇数个节点来避免平局情况。2)合理配置最小主节点数(discovery.zen.minimum_maste...
回答重点FST是Finite State Transducer的缩写,翻译过来叫有限状态转换器。它是一种数据结构,用于高效地存储和操作有限状态自动机(Finite State Automaton, FSA),特别擅长处理像字符串的前缀压缩和自动补全等需要高效查询的情况。在Elasticsearch中,FST被广泛应用于倒排索引、自动补全、拼写纠正等方面。
扩展知识1)倒排索引:在Elasti...