1、java基础(1)2、javaweb(1)3、ssm+springboot+springCloud(1.5)
9.1 Spring Cloud 你们在项目中如何使用?9.2 Spring Cloud 的各个组件说明
9.2.1 Eureka组件: SpringCloud的服务发现和注册的组件(作用阿里的Nacos)9.2.2 Ribbon:负载均衡客户端,需要结合RestTemplate(HttpClient)进行服务的调用9.2.3 Feign:Feign默认集成了Ribbon,用它来管理服务(管理controller配置的路径)9.2.4 Hystrix : 熔断限流的组件9.2.5 GateWay :网关组件 9.3 Ribbon和Feign区别9.4 Spring Cloud 注意的细节9.5 springCloud版本号更新的方式9.6 SpringCloud和SpringBoot有版本兼容的 4、企业开发的项目: 技术说明(1.5)
4.1 针对电商项目来说: SPU和SKU是什么, 用来表示什么?4.2 前后端分离4.3 Shiro和SpringSecurity权限校验框架的区别4.4 分布式缓存redis在项目中如何实现高可用
4.4.1 项目中哪些地方用到redis4.4.2 介绍以下redis的数据类型以及应用场景4.4.3 描述以下redis的持久化机制4.4.4 描述以下redis的两种持久化机制的区别4.4.5 AOF持久化文件越来越大怎么办4.4.6 redis为什么被称为单线程,以及为什么单线程效率还这么高4.4.7 Redis为什么这么快4.4.8 Redis操作中常见的问题4.4.9 如何保证redis在高并发下的高可用?4.4.10 如何保证Redis缓存中: 热门商品的同步? 4.5 常用的消息中间件有那些,底层都用什么协议,有什么区别4.6 常用的高并发解决方案有那些4.7 如何实现CAS单点登录4.8 用户恶意频繁添加购物车, 添加购物车跨域问题, cookie禁用怎么办等常见的购物车问题如何解决(面试官: 项目中遇到了那些问题4.9 怎么实现微信支付接入4.10 为什么对数据库分库分表?4.11 如何处理超时无效订单4.12 如何完成一个秒杀,涉及的技术有那些,如何实现4.13 如果保证不同数据库的事务一致性4.14 描述openrestry(nginx+lua)和nginx的区别4.15 git代码冲突解决常见的解决方式4.16 如何实现项目的限流,解决方式是什么?4.17 项目中如何实现文件的存储和管理的?FastDFS4.18 FastDFS分布式文件存储和管理常见的坑有那些,如何避免4.19 第三方oauth技术是如何实现的,采用的qq,微信,还是微博,具体怎么实用的 5、面试总结(3,4) 1、java基础(1) 2、javaweb(1) 3、ssm+springboot+springCloud(1.5) 9.1 Spring Cloud 你们在项目中如何使用?
SpringCloud概述
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。SpringCloud(SpringBoot)如何构建微服务项目 创建一个父级项目:
统一springboot, springcloud的版本创建一个子级项目:公共类的子级项目
统一维护其它自己项目要用到类创建一个子级项目: 数据源的子级项目创建一个网关的子级项目: GateWay创建一个业务的子级项目: service
比如:
==商品业务的子级项目
==订单业务的子级项目
==秒杀业务的子级项目创建一个业务接口的子级项目: openFeign
比如:
==商品业务接口的子级项目
==订单业务接口的子级项目
==秒杀业务接口的子级项目创建一个用户访问入口的子级项目: web
SpringCloud构建的微服务项目之间的调用关系(执行流程)
用户通过客户端访问—>web入口---->GateWay子级项目 ---->openFeign子级项目—>service子级项目—>数据库 9.2 Spring Cloud 的各个组件说明 9.2.1 Eureka组件: SpringCloud的服务发现和注册的组件(作用阿里的Nacos) 注册中心 : Eureka server, 负责"保存"的服务(服务指的service子级项目的controller配置路径)生产者: Eureka Client, 负责将服务发送到注册中心,由注册中心负责保存.消费者: Eureka Client, 作用: 用户就是消费者,在客户端输入访问地址(地址服务),如果在注册中心由服务,就去访问,
如果在注册中心没有改服务,就报404
总结: 注册中心, 生产者, 消费者 三者之间的关系,以及通过心跳机制来管理服务
9.2.2 Ribbon:负载均衡客户端,需要结合RestTemplate(HttpClient)进行服务的调用
默认的负载均衡:轮询服务器启动时,先从Eureka server获取服务列表,然后在请求微服务时,通过RestTemplate进行http调用自定义访问策略
实现步骤: 自定义一个类, 实现Rule接口,那么我们自定义的类就是一个策略类(代码里面就是算法,确定访问方式)
方式一: 在定义的类上面加上@Configuration这个注解(注意: 该配置类不能被springboot扫描到)
方式二:在全局配置文件application.yml配置 策略类、9.2.3 Feign:Feign默认集成了Ribbon,用它来管理服务(管理controller配置的路径)
Feign可以通过@FeignClient 注解标识一个接口,通过该接口生成一个代理类来进行远程的微服务调用
9.2.4 Hystrix : 熔断限流的组件为了防止微服务直接调用时,由于某一个微服务宕机导致整个无法雪崩,这里采用Hystrix来阻断对存在宕机,异常情况的请求,直接本地返回
1)Ribbon集成,首先引入相关的依赖,接着开启@EnableHystrix
接着在调用微服务方法上添加 @HystrixCommand(fallbackMethod = “hiError”)指定服务异常的之后本地执行的方法2)Feign集成,在微服务绑定的接口@FeignClient(value = “service-hi”,fallback = SchedualServiceHiHystric.class)中指定异常时调用本地接口实现判定失败:Hystrix会在某个服务连续调用N次不响应的情况下,立即通知调用端调用失败,避免调用端持续等待而影响了整体服务,执行本地业务。恢复服务:Hystrix间隔时间会再次检查此服务,如果服务恢复将继续提供服务。Hystrix间隔几秒会让其中一个请求去调用远程微服务,如果调用成功,就表示服务正常,后面就重新链接开路 断路 9.2.5 GateWay :网关组件
GateWay (网关):
GateWay的主要功能是路由转发和过滤器。路由功能是微服务的一部分,
比如/api/user转发到到user服务,/api/shop转发到到shop服务。GateWay默认和Ribbon结合实现了负载均衡的功能。
作用:限流处理,认证和授权,单点登录,日志管理等等
GateWay的位置:
客户端发送请求---------所有请求------->GateWay网关: 路由分发----------->openFeign: 远程调用-------->service业务
Ribbon添加maven依赖 spring-starter-ribbon 使用@RibbonClient(value=“服务名称”) 使用RestTemplate调用远程服务对应的方法
feign添加maven依赖 spring-starter-feign 服务提供方提供对外接口 调用方使用 在接口上使用@FeignClient(“指定服务名”)
Ribbon和Feign的区别: Ribbon和Feign都是用于调用其他服务的,不过方式不同。
启动类使用的注解不同,Ribbon用的是@RibbonClient,Feign用的是@EnableFeignClients。服务的指定位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。Feign则是在Ribbon的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建http请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。 9.4 Spring Cloud 注意的细节
注意: 配置Feign,以及Rabbion的配置类上, 一定不能被springboot的引导类扫描到.
9.5 springCloud版本号更新的方式
采用版本名+版本号,其中版本名采用伦敦地铁站命名,其中按照地铁首字母A-Z依次命令如Hoxton.SR9。但是现在已更改为主版本号.次版本号.修订号如2020.0.0
旧版本命名方式中,开发的快照版本(BUILD-SNAPSHOT)到里程碑版本(M),开发的差不多到会发布的候选发布版(RELEASE),最后到正式版(SR)版本。
新版本命名是YYYY.MINOR.MICRO[-MODIFIER],拿2020.0.1-SNAPSHOT 这个版本来说,其中YYYY为年份全称、MINOR为辅助版本号、MICRO为补丁版本号。MODIFIER同上述修饰关键节点,BUILD-SNAPSHOT、里程碑M,正式发行版本REALSE等
当前已发布SpringCloud稳定版本见下图,在线查看地址:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies
9.6 SpringCloud和SpringBoot有版本兼容的 浏览器访问https://start.spring.io/actuator/info,在返回的数据中找到spring-cloud即可以查看SpringCloud与SpringBoot版本对应关系。
==SPU: strand product unit 标准产品单位(并不是一个具体的商品)
比如: 华为 P40 (商品详情页,规格和包装介绍)
华为P40产品标准: cpu高通870, 尺寸6.7
==sku: strored keeping unit 进入库存储单位(表示的就是一个具体的商品)
比如: 华为P40 红色,内存8G+256,表示一个具体的商品
4.2 前后端分离 前后端分离的目的: 实现前端和后台的数据不耦合,最终的效果是前后端都能够独立存在
前端人员开发: 独立开发前端代码
对于前端工程师:调用接口地址,接收json,解析json
后端人员开发: 独立开发后端代码
对于后端java工程师:提供业务的具体接口,响应json数据
后端人员通过swagger自动生成接口地址文档,
swagger使用参考地址: 点击访问swagger
相同点:
1:认证功能: 判断当前用户登录是否正确
2:授权功能: 如果用户登录成功,根据用户的角色把角色对应的权限数据(用户能够方位的资源)查询出来,赋值给当前用户.
3:加密功能
4:会话管理
5:缓存支持
6:rememberMe功能…
不同点:
优点:
1:Spring Security基于Spring开发,项目中如果使用Spring(SpringBoot)作为基础,配合Spring Security做权限更加方便.
2:Spring Security功能比Shiro更加丰富些,例如安全防护
=SpringSecutity: 使用比较麻烦(1.认证和授权代码 2.配置等比较麻烦)
=Shiro可以脱离任何第三方框架,也就是说Shiro可以独立使用: 上手容易,配置简单
3:Spring Security社区资源比Shiro丰富
缺点:
1:Shiro的配置和使用比较简单,Spring Security上手复杂
2:Shiro依赖性低,不需要任何框架和容器,可以独立运行,而Spring Security依赖于Spring容器
总结:
权限校验时,设计表来管理权限数据,一般情况下需要设计4张表,里面不包含用户表
=用户表: tab_user
=用户和角色的中间表: user_role(第一张表)
=角色表(第二张表): tab_role(角色数据,书写:游客,普通用户, 管理员,vip用户等)
=角色和权限的中间表: role_resource(第三张表)
=权限表(第四张表): tab_resource(资源数据,书写的资源路径)
比如: redis缓存来实现用户最近浏览的商品列表
1.最近浏览的记录肯定是需要失效时间的
2.最近浏览的记录肯定是有个数限制的,不可能记录所有的浏览记录
比如: redis保存秒杀的商品信息(快),同时保存秒杀的用户信息(set保存ip保证同一个用户不能重复秒杀)
防止秒杀过程中,同一个用户多次秒杀: 将用户的ip地址存到set集合
比如: redis保证手机验证码(设置失效时间)
比如: redis缓存不经常修改的数据,比如: 首页显示的模板数据和分类数据
比如: redis保存实时在线人数(来人了,人走上了), 点赞次数
总结一下:项目中使用redis的场景
(1)为热点数据加速查询(主要场景)。如热点商品、热点新闻、热点资讯、推广类等高访问量信息等。
(2)即时信息查询。如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等。
(3)时效性信息控制。如验证码控制、投票控制等。
(4)分布式数据共享。如分布式集群架构中的 session 分离,消息队列.
redis的数据结构: key=value, key是String字符串类型,value常用的有五种数据类型数据类型: string、 hash、list, set、 sorted setredis的应用场景 数据不经常修改的,保存到redis时效性数据保存到redis生成自增 id
利用redis原子性,生成id(id不会重复,也就是唯一的,因为redis是单线程的)
在分库分表时,为了保证不同数据库下面相同表的主键唯一性: 主键使用redis自增id.
redis自增id的解释说明:
当 redis 的 string 类型的值为整数形式时,redis 可以把它当做是整数一样进行自增(incr)自减(decr)操作。由于 redis 所有的操作都是原子性的,所以不必担心多客户端连接时可能出现的事务问题。
incr 对值进行加1操作,如果不是整数,返回错误,如果不存在按照从0开始 decr同incr,但是是减1操作 incrby,decrby 增加减去指定的数共享session,其实使用redis+session(redis保存session中数据,实现session的跨域)自动定时过期时间 4.4.3 描述以下redis的持久化机制
持久化:就是把内存中的数据序列化到硬盘,保证数据不丢失持久化方式:分别是rdb和aof的持久化方式 4.4.4 描述以下redis的两种持久化机制的区别
rdb持久化:Redis为我们提供了一个rdb的持久化方式具体每隔一定时间,或者当key的改变达到一定的数量的时候,就会自动往磁盘保存一次
方式1 save 900 1(900秒后1个key改变)
方式2 save 300 10(300秒后10个key改变)
方式3 save 60 10000(60秒后10000个key改变)
aof持久化:Redis还为我们提供了一个aof的持久化方式,这种方式是通过记录用户的操作过程(用户每执行一次命令,就会被Redis记录在XXX.aof文件里,如果突然断电了,Redis的数据就会通过重新读取并执行XXX.aof里的命令记录来恢复数据)来恢复数据
优缺点:
优点: 都是为了防止数据丢失
缺点:
rdb:假如三种方式没有一种被满足,触发不了保存,突然断电,那就会丢失数据
aof:为了解决rdb的弊端,就有了aof的持久化,始终在一个文件里保存记录,但aof 的持久化随着时 间的推移数据量会越来越大,占用很大的空间
更详细了解持久化: 请参考点击网址
Redis引入了AOF重写机制压缩文件体积。AOF文件重 写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。简单说就是将对同一个数据的若干个条命令执行结果转化成最终结果数据对应的指令进行记录。
4.4.6 redis为什么被称为单线程,以及为什么单线程效率还这么高 redis单线程:指的网络请求时,发送一次请求操作redis、只能当前网络请求操作redis结束以后,下个网络请求操作redis.redis的底层操作是多线程
指的redis进行数据操作时,比如: 设置string ,或者设置hashmap
是通过多线程进行数据操作(提高redis的效率)
详解: Redis为什么是单线程
注意:redis 单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块仍用了多个线程。
因为CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者网络带宽,既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。
比如:
情况一: redis缓存数据库, 以及mysql(硬盘)数据库
第一次查询时: 10个数据保存到redis缓存中, mysql保存了10个数据
下次操作时: 将mysql数据库中的10个数据删除了2个,mysql剩余了8个数据库
造成的结果: redis是10个数据, mysql是8个数据 数据不一致性?
解决方案: 在操作mysql数据时,同时清空redis缓存中的数据.
等下次从redis缓存中取数据,首先从数据库中查询.
springboo+redis开发的项目:
@Cacheable 应用到读取数据的方法上,先从缓存中读取,如果没有再从 数据库获取数据,然后把数据添加到缓存中 注解的属性说明: key = redis的key condition= 当符合条件时,将从数据库中查询的数据存到redis @CachePut :应用到修改和添加方法, 当执行新增/修改方法,调用方法时会自动把相应的数据放入缓存 @CacheEvict 应用到删除数据的方法上,当执行删除方法时, 调用方法时会从缓存中删除对应 key 的数据
比如:
情况二: 向redis里面写数据, 同时也向数据库写数据, 也就是双写数据.
在redis写数据时, 由于某种原因(服务器宕机),没有及时向数据库写数据(没有成功 )
出现情况一般是无法解决的.
分析:一致性问题是分布式常见问题,还可以再分为最终一致性和强一致性。数据库和缓存双写,就必然会存在不一致的问题。答这个问题,先明白一个前提。就是如果对数据有强一致性要求,不能放缓存。我们所做的一切,只能保证最终一致性。另外,我们所做的方案其实从根本上来说,只能说降低不一致发生的概率,无法完全避免。因此,有强一致性要求的数据,不能放缓存。首先,采取正确更新策略,先更新数据库,再删缓存。其次,因为可能存在删除缓存失败的问题,提供一个补偿措施即可,例如利用消息队列。
缓存雪崩问题(redis失效了)缓存雪崩,即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而 导致数据库连接异常。
解决方案:
~~~(一)给缓存的失效时间,加上一个随机值,避免集体失效。(二)使用互斥锁,但是该方案吞吐量明显下降了。(三)双缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。然后细分以下几个小点I 从缓存A读数据库,有则直接返回II A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。III 更新线程同时更新缓存A和缓存B~~~
缓存击穿(穿透)问题缓存穿透,即黑客故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库 上,从而数据库连接异常
解决方案:
网路请求时–>“过滤器”: 获取请求的key, 去查询redis,判断是否有这个key,如果没有这个key,拒绝该请求->redis
(一)利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试(二)采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作(三)提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出,请求所携带的Key是否合法有效。如果不合法,则直接返回。
4.4.9 如何保证redis在高并发下的高可用?Redis 主从架构: 主从复制Redis 哨兵集群实现高可用Redis 压缩持久化文件详细了解: 点击参考该网址 4.4.10 如何保证Redis缓存中: 热门商品的同步?
说明: 热门商品需要在网站首页展示,确定热门商品的遴选规则.
热门商品: 情况一: 根据商品的购买次数,定为热门商品、情况二: 新上架的商品把它定为热门商品.等等
以情况二为主: 数据库中的热门商品 和 redis缓存中热门商品数据一致性问题?
解决: 通过定时器(spring Task),定时查询数据库,如果有热门商品, 直接set到redis缓存中了.
消息中间件
作用一: 可以实现后台的异步操作.
作用二: 可以实现分布式事务
作用:等等常用的消息中间件 ActiveMQRocketMQRabbitMQ
底层通信协议:
== AMQP协议
AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。
优点:可靠、通用
==MQTT协议
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。
优点:格式简洁、占用带宽小、移动端通信、PUSH、嵌入式系统
==STOMP协议
STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理(Broker)进行交互。
优点:命令模式(非topicqueue模式)
详细请参考: 消息中间件详细介绍
4.6 常用的高并发解决方案有那些 页面静态化: 将动态页面数据静态化(用户在访问服务器端,不用每次发送请求)使用缓存技术搭建集群用户访问来说: 搭建web服务器集群操作数据库来说: 搭建数据库集群 分库分表
从查询数据表来说: 提供查询效率
比如: 一张表有10000条数据, 可以把一张表分为10张表: 每张1000条 读写分离
对于不经常修改的数据,读操作频率比较高: 把数据放在读表 搭建消息队列服务器
比如:
订单模块操作时,生成订单可以异步(服务器端的异步)给当前用户增加积分
结论: 从数据库层面一定程度上解决高并发,操作数据库用到connection
生成订单---->当前用户异步进行积分的累加(生成消息添加到队列), 节省用户的访问时间.
生成订单的同时,立即给当前用户进行积分累加操作: 用户访问时间长了
详细请参考: 高并发常用的解决方案 4.7 如何实现CAS单点登录
单点登录
一个大的系统里面,包含多个子系统,登录一个子系统,同时访问其它几个子系统.
比如:
百度—>大的系统
知乎---->子系统
新闻—>子系统
在知乎上登录成功以后,访问其它系统.单点登录技术 spring securityshirocas
cas说明单点登录流程以及底层实现.
4.8 用户恶意频繁添加购物车, 添加购物车跨域问题, cookie禁用怎么办等常见的购物车问题如何解决(面试官: 项目中遇到了那些问题
问题一: 1.用户恶意频繁添加购物车,
(1)、限制每个用户或者IP对应的购物车购买数量
(2)、如果频繁添加购物车,当同一用户或者同一IP,在某个时间间隔(5秒)之类添加次数超过10次,就需要输入验证码才能进行再次添加
问题二: 2.添加购物车跨域问题,
解决方式一:
前端使用异步请求的jsonp解决方式二:(最简单)
后端在web层的controller里面: @Crossrign解决方式三:
使用cookie携带数据
由于系统采用的是分布式部署,存在多个系统可以添加购物车。此时就涉及到跨域请求的问题,跨域请求解决方案有JSONP和CORS。采用CORS来解决跨域请求,CORS跨来源资源共享是一份浏览器技术的规范只需要在服务端设置一个允许响应请求的响应头信息,同时由于购物车需要获取和响应cookie还要分别在浏览器请求设置允许请求带上cookie和服务端运行响应带上cookie.
问题三: cookie禁用怎么办等常见的购物车问题如何解决
解决方案一: 在地址栏重写url(在地址栏拼接cookie),这种方案不用
解决方案二: 在前端代码里面判断用户的浏览器是否禁用了cookie, 如果禁用cookie,提醒开启cookie、4.9 怎么实现微信支付接入
参考地址: 微信Native扫码支付
4.10 为什么对数据库分库分表? 为什么需要分库分表如何保证不同数据库同一张表的主键唯一性分库分表的实施策略分表的方式:
水平拆分: 表中的字段都一样
根据表的数据量进行拆分,比如: 10000条数据,分成每张表100条数据
情况: 表中的数据是动态增长的, 如果进行水平拆分.
水平拆分的实施策略: 1、每月15号拆分 2、当表中数据增长的10万条数据等等
垂直拆分:
根据查询字段出现的频率来进行拆分,每张表的字段不一样.
表中的数据非常庞大,表中的字段特别多: select id from 表中1
表中只有一个字段id,同样的数据量: select id from 表中2(查询效率高)开源数据库中间件-MyCat数据库读写分离
进行表拆分: 根据数据查询情况和更新情况(add, update ,delete)
读表: 表中的数据不允许修改
写表: 执行更新操作 4.11 如何处理超时无效订单
无效订单说明
指的生成订单后,未付款、那些未付款的订单就是无效订单.
具体给定一个付款时间,比如30分钟内没有付款,当作无效订单.无效订单清除,具体如何操作.
通过定时器调度,去查询数据库,订单数据表里面有两个时间字段:order_create_time, order_end_time
如果说: 结束时间-生成时间>30分钟,且付款状态为未付款状态, 将该订单删除.具体操作的方式: 在生成订单时,同时向订单表中添加订单创建时间order_create_time开启定时器,间隔30分钟(并没有一个严格的限定),执行查询数据库操作.
查询(order_end_time-order_create_time)>30分钟 并且 订单state=未付款状态.
将生成无效订单消息, 添加到消息队列中(死信消息队列)消费无限订单消息: 异步删除无效订单
具体实现参考: 消除超时的无效订单 4.12 如何完成一个秒杀,涉及的技术有那些,如何实现
从数据库层面来说:
设计一张秒杀表 ,以及秒杀的订单表,为了提高查询秒杀商品的效率
tab_kill_products表: 定义两个字段秒杀的开始时间,以及结束时间.防止同一个用户秒杀多次
将用户的ip添加到redis的set集合中.秒杀的实现流程,具体涉及的技术 redis保存: 秒杀的商品信息限流: GateWay限流定时调度器(spring task): 按照秒杀商品的(end-start)时间,去定时查询秒杀商品
将秒杀的商品存到redis缓存,同时将秒杀的商品展示到秒杀页面.异步支付(消息队列): 秒杀商品成功,自动生成订单,异步给该订单付款(节省时间)
异步支付时,如何防止订单消息丢失?
消息队列/confirm/i机制.秒杀的执行流程
1.执行定时任务: 查询秒杀的商品,展示到秒杀页面 用户访问秒杀页面,点击秒杀商品,如果秒杀成功,生成订单,将订单数据信息添加到消息队列中(生产消息)通过消息队列: 异步消息订单数据信息,其实给订单付款 4.13 如果保证不同数据库的事务一致性
解决方案有两种:
方式一: 使用分布式事务框架,比如: seata
缺点: 效率低, 优点: 保证数据不丢失
方式二: 使用消息队列解决分布式事务.
优点: 执行效率高, 缺点: 存在数据丢失,就不能保证事务的最终一致性.
具体实现: 参考分布式事务的执行
openrestry(nginx+lua)是反向代理web服务器, 底层是封装了nginx+lua(脚本)nginx是反向代理的web服务器 4.15 git代码冲突解决常见的解决方式
1、git冲突的场景
情景一:多个分支代码合并到一个分支时;情景二:多个分支向同一个远端分支推送代码时;
实际上,push操作即是将本地代码merge到远端库分支上。
关于push和pull其实就分别是用本地分支合并到远程分支 和 将远程分支合并到本地分支
所以这两个过程中也可能存在冲突。
git的合并中产生冲突的具体情况:
<1>两个分支中修改了同一个文件(不管什么地方)
<2>两个分支中修改了同一个文件的名称
两个分支中分别修改了不同文件中的部分,不会产生冲突,可以直接将两部分合并。
2、冲突解决方法情景一:在当前分支上,直接修改冲突代码—>add—>commit。情景二:在本地当前分支上,修改冲突代码—>add—>commit—>push
注:借用vim或者IDE或者直接找到冲突文件,修改
总结:
四种方式:
1、使用“git fetch origin master”将远程分支拉下来;
2、执行命令来手动合并冲突的内容;
3、使用“git add xxx”和“git commit -m…”将改动提交;
4、执行命令将改动提交到远程分支。 4.16 如何实现项目的限流,解决方式是什么?
在项目中的那个位置,实现限流的解决方案
网关位置.在网关位置,如何实现限流 计算器思想: 计算器算法漏桶思想: 漏桶算法令牌桶思想: 令牌桶算法
等等 4.17 项目中如何实现文件的存储和管理的?FastDFS
实现文件的存储和管理 通过分布式文件存储和管理技术,搭建文件服务器,比如: fastDFS(开源技术)通过Aache提供的分布式文件存储和管理技术,搭建文件服务器,比如: MIO(开源技术)通过云存储技术,比如: 购买七牛云, 阿里云等等 4.18 FastDFS分布式文件存储和管理常见的坑有那些,如何避免 4.19 第三方oauth技术是如何实现的,采用的qq,微信,还是微博,具体怎么实用的 5、面试总结(3,4) 工资福利加班问题公积金如何购买,买在哪里试用期时间以及工资请求贵公司主体业务是什么,如果有共鸣就可以简单说一下自己曾经做过类似的东西!贵公司所采用架构是什么,以主要采用什么技术完成开发。贵公司是前后端分离开发模式,还是针对接口文档开发,或者是后端开发人员需要编写js交互 ,开发技术有哪些,比如数据访问层,业务层,控制层开发工具是否有要求等等