U盘PE| w764位旗舰版下载 | U盘装win7系统 | U盘启动 |win7pe | win10下载 |加入收藏土豆PE官网U盘PE,U盘装win7系统,win7pe,U盘启动,U盘装系统,w764位旗舰版下载站!
当前位置:主页 > 帮助中心 > 常见问题解答 >

秒杀项目的总结及面试常见问题

来源:http://www.tudoupe.com时间:2022-07-30

项目简介

第二种杀手系统是,首先是登录系统,用户手机号码作为用户名,在登录前确定手机号码是否存在之前,然后判断密码是否正确。当进行密码判断时,为了确保用户密码的安全,我在这里用md5进行两个加密操作,首先,通过盐值对输入密码进行初始加密 md5加密,防止在网络传输中截获密码。然后在到达服务结束后,进行第二个md5加密,以防止在用户信息检索时泄露数据库信息,然后将客户端输入密码与数据库中的密码进行比较。如果密码正确,然后将随机生成一个标记,标记用户,然后把这个记号写到饼干上,该符号的地图和在雷迪斯存储的用户信息,当用户再次登录时,从饼干中提取的符号,进入 redis 并提取与此符号相符的用户信息。

产品列表使用页面缓冲技术来提高性能和减轻MySQL上的压力。

其次是第二种杀伤,核心功能,首先,确定用户是否空,然后判断库存是否足够,为了解决过卖的问题,首先,将超过0的股票添加到SQL文中,它还设置了一个单个索引以防止用户在每秒中被杀死,并把预备品存放在储存箱里,当第二个杀人请求到达确定预备物资是否足够时,同时确定用户是否有第二次杀手命令。为了优化用户体验,它还使用rabbitmq消息队列,首先将第二个杀人请求插入消息队列中,通过逐步执行此操作,用户不需要在这里等待,然后接收器从消息队列中取出消息并处理它,这实际上是去数据库确定库存是否足够,再来判断用户是否已经被杀了秒钟,然后是真正的库存减少,下订单,生成订单的操作,在处理消费者消息的过程中,客户会自动查询确定被删除的秒数。与此同时,考虑到如果Redis的访问中存在太多无效访问,资源开支也更大,为了解决这个问题,我使用记忆标签来减少对雷迪斯的访问,即设置一个map,key是商品,在启动系统时设置错误值,当预备库存不足时设置为真。当第二个杀人请求到达时,它首先决定商品的价值是否正确,然后决定预备库存,如果真, 直接返回第二个杀伤失败.

因为HTML源是透明的,为了保护秒杀接口,避免通过HTML源查看秒地址,超过可以被秒化的秒数,从而实现第二杀外第二杀时间周期,我也做了第二次杀人,以隐藏接口地址。每次执行一个真正的第二击中都会生成一个随机值,然后再将它放回罗迪斯,与url匹配,第二次杀人时确认地址是否合法,然后你到了真正的第二页杀人,同时我添加了用户验证代码,也就是说,只有在得到第二个杀人地址时,才能通过验证代码来获取它。最后, 防止刷刷, 操作限流,存储在Redis的用户访问数目,每次参观人数减少1,我在这里设置了五秒钟的点击限度。

整体的流程

1.进入产品列表页
2.点击产品详情页,静态资源缓存,Ajax获取验证代码等动态信息
3.按秒击杀按钮,将验证代码结果和产品ID传递到后端,如果结果正确。动态生成随机字符串UUID,将用户ID和产品ID(url)结合起来,输入 redis,沿着这条路往前边走。在前端到达路径后,根据路径地址调用第二次杀服务
4.服务端获取请求的路径参数,以检查缓存是否存在。
5.如果它存在并且雷迪斯有库存,减少雷迪斯库存以查看订单是否已经生成,或在消息队列中请求它
6.从消息队列的接收者获取消息:包括产品ID和用户ID,判断数据库库存和是否重复第二次击杀,然后订购。 订购过程是:减少库存,订购,生成订单。
8.生成订单成功或者失败后,都将秒杀结果放到redis中;前端采用ajax轮询方式查询redis获取最终秒杀结果,返回给用户提示。

项目亮点:

1.解决分布式会议问题。当服务器级别被扩展时,多个服务器可以响应。

解决方案:分布式会议问题,由于水平扩展,每个Tomcat容器存储在不同的服务器上,如果 ngnix访问服务器前端请求,发送到服务器B,那么你就不会找到相应的会议,失去会议信息,让用户跳回登录界面。集中存储在Redis服务器上,已建立的会议信息可以从缓存中获取。

如果未提出分发会议,因为服务部署在不同的服务器上,会议存储在本地Tomcat服务器上,因此,回到逆转的Nngnix传输中,不一定是传给有seesion的那台服务器,从而导致登录失败。

解决方案:
分布式session实现,是将session集中存储在redis中,验证直接从redis中取。

基于トークン实现的分布式会议生成一个唯一的uid作为密钥(**com.imooc.Miaosha.util.UUIDUtil

),在Redis存储的用户信息对象的序列。

2、多级缓存提高页面访问速度和并发量,减少数据库压力。利用内存标记减少redis的访问。

解决方式:本项目大量的利用了缓存技术,包括用户信息缓存(分布式session),商品信息的缓存,商品库存缓存,订单的缓存,页面缓存。访问速度:内存>redis>数据库sql。

3、秒杀令牌对下单接口解耦,并限制令牌个数(创建秒杀大闸),一定程度缓解下单接口访问压力。

解决方法:使用秒杀牌符号,许多验证信息被从底部的单个接口中分离出来,每个狙击手需要创建一个特定的狙击手许可证PromoId_itemId_userId和10分钟的寿命限制,在某种程度上防止过敏剂的产生,导致内存占满。限制许可证的数量也可以防止恶意访问接口。

制造库存的记忆标记,降低雷迪斯压力。只在雷迪斯更新库存,是以乐观锁方式。使用RabbitMq消息队列异步数据库,达到一种柔性事务,减少数据库访问压力。并防止消息发送失败导致数据不一致,使用交易消息包创建订单操作,确保创建订单(1, 库存订单; 2, 收据减少库存; 3, 更新贸易日志.)为原子性操作,它还确保消息被成功发布,即使发送失败,也会退回。

解决方案: 1)股票已经卖完了,你不再需要去雷迪斯,直接股票的记忆标记。哈shmap或 guava。(二)库存的扣减是第一项扣减,没有足够的乐观的锁定方法来补充。数据库sql采用where stock>0方式加上行锁。同时发生的事件导致QPS非常低,性能大幅降低。所以使用消息队列以不同步更新,降低数据库压力。(使用CAP理论,BASE理论,考虑 到 供应 和 分配 情况,在分布式系统中,首先扣除的红利导致不一致,但是能达到最终一致性的一种柔性事务。(三)消息发送失败可能导致数据不一致(重新更新,数据库未能成功更新),需要使用交易消息包创建订单操作,确保创建订单(1, 库存订单; 2, 收据减少库存; 3, 更新贸易日志.)为原子性操作,它还确保消息被成功发布,即使发送失败,也会退回。但是,生成的事务号码应该设置为Promotion。 REQUIRES_NEW防止重复使用订单号码。也就是处于大事务中只要完成了就会更新数据。

5.这个大型交易和初始化订单的流向打开交易类型消息,使用异步化操作,它使用排队泄漏。创建线程池,使用阻塞队列存储任务,如果要完成所有任务,可以设置饱和策略如下: Caller-Runs允许主线程帮助执行任务。使用未来对象异步接收执行结果。

6,md5密码检查,数秒消灭接口地址隐藏,接口限制流量防止刷刷,降低验证代码手动延迟请求。

前端和后端被分开,客户使用トークン来做其他业务请求,减少服务端的压力来测试用户。

什么是Token?

Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。

托克的定义:托克是一个由服务端生成的字符串,一张卡片,作为客户的要求,当第一次登录后,服务器生成一个トークン,并将这个トークン返回到客户端,之后,客户只能带这个トークン来请求数据,你不需要再带你的用户名和密码。

使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位

登录功能的实现

一、数据库设计:不做注册,直接登录,在MySQL中直接创建表;用户表包括id、nickname、password、salt、头像、注册时间、上次登录时间、登录次数等字段

二、明文密码两次MD5处理:加密的目的:第一次是因为http是明文传输的,第二次为了防止数据库被盗

JSR303参数校正 + 全球异常处理: 将注释添加到输入参数 LoginVo @validated,然后在传入的参数mobile和password上加上注解判断,如果@NotNull决定它是空的,也可以处理自定义的本地异常

第四次分发会议:

分布式会议(登录信息缓存)

分布式session的原理:把一个token映射成一个用户,在这一过程中,分配的会话的会话不会存储在容器中,相反,他们把它存储在单独的缓存中,单独的管理会议,有 redis,这是所谓的分发会议

核心:在第三方缓存中存储信息

分发会议的实施:成功登陆后,为用户生成一个标记以识别用户,然后写在饼干里,传递给客户端,然后,客户端在随后的访问期间将トークン上传到一个cookie中。服务完毕后,会收到这张徽章,使用トークン检索用户特定សម័យ信息

分发会议问题,由于水平扩展,每个Tomcat容器存储在不同的服务器上,如果 ngnix访问服务器前端请求,发送到服务器B,那么你就不会找到相应的会议,失去会议信息,让用户跳回登录界面。集中存储在Redis服务器上,已建立的会议信息可以在缓存中获取。

实现秒杀功能

一、数据库设计:包括商品表(goods)、商品表订单表(order_goods)、秒杀商品表(miaosha_goods)、秒杀商品订单表(miaosha_order)

商品列表页:为显示第二批杀品的详细资料,需要商品和miaosha_goods的资料,所以附上货物表,包括价格、库存、第二批杀品启动时间

三、商品详情页(goods_detail.html)

命令细节 page.html:这是第二个杀手函数的实现;首先判断库存在控制级别,然后确定是否存在订单,然后如果没有订单,则命令命令,以便减少库存,下订单,写下第二个杀手命令

缓存优化技术

页面缓冲步骤(这里指产品列表页):

  • 来自RedisService的缓存
  • 如果缓存中没有手动渲染,则使用薄膜模板
  • 然后将页面添加到缓存中,返回渲染页面
  • 不太久,定在60年代

URL缓存步骤(称为产品详细页):

  • 这基本上与页缓冲步骤相同,但当你想拿缓冲器并添加缓冲器时,你需要添加参数
  • URL缓存和页面缓存之间的区别在于不同的页面有不同的细节,而URL缓存使用不同的参数来区分

对象缓存(称为用户对象)

  • 前页缓存和URL缓存适用于小更改和较短的缓存时间
  • 对象缓冲器是长期缓冲器,所以需要有一个更新步骤
  • 第一步是取缓存
  • 如果没有缓存,就进入数据库并添加缓存;如果没有缓存,就报告错误
  • 更新用户的密码

四、注意点

  • 需要先更新数据库,然后删除缓存;序列不能逆转导致数据不一致:如果1线程首先删除缓存,那么2线程读取操作,发现它不在缓存,将数据库中的旧数据添加到缓存,那么1线程更新数据库,那么缓存将导致数据与数据库不一致

页面静态化(前端和后端分离)

特点: 将页面缓存到浏览器(放弃使用Thimeleaf,通过CSS写纯HTML前端代码),前端分离减少服务器压力。

  • 页面静态化是简单地使用纯HTML页面 + Ajax请求json数据来填补页面
  • 如果某页在跳到B页之前需要条件判断,它可以在使用A页的ajax请求判断之后再跳到B页
  • 如果不需要条件判断,直接跳到B的静态页面,让B使用ajax请求数据
  • 页面静态化: 直接缓存页面到浏览器.优点:当用户访问网页时,不需要与服务端进行交互,从本地缓存中直接获取页面,大大节省网络流量;页面存储在html中,通过接口从客户端获取动态数据,因此服务端只需要写接口;使用页面静态化技术是:html+ajax

超卖问题

  • 发生在减库存的时候

解决方案:1.将单个索引添加到数据库,以防止用户重复购买

2.SQL添加库存量判断:防止库存负值

CDN优化

CDN是一个内容分配网络,相当于一个缓存,仅部署在全国各地。当用户提出请求时,它寻求最新的CDN来获取资源
**总结:**并发大的瓶颈在于数据库,所以解决办法是添加不同的缓存:从浏览器,做页面的静态化,在浏览器中暂停静态页面;某些CDN可以在请求到达网站之前部署,让请求首先访问CDN; 然后页缓存, URL缓存, 对象缓存;
缓存的缺点:数据可能不匹配,只能平衡

秒杀接口优化

建议: 减少数据库访问, 使用消息队列完成异步提交, 提高用户体验, 减少峰值和下降流量

1.启动系统以装载货物的库存量到磁盘上

2.收到请求,雷迪斯减少库存,库存不足,直接退货,或输入3

3.请求进入队列并立即返回队列(同步子菜单)

4.部署、生成订单、减少库存的请求

5.客户查询,数秒是否成功

提示:4.同时完成两步

具体优化方式

以前没有预热库存的步骤是: 检查库存 - 检查订单 - 修改库存 - 生成订单

2.系统初始化时把库存加载到数据库:MiaoshaController 继承InitializingBean实现afterPropertiesSet方法即可
3.在前一步预热库存后,执行下列步骤: 检查雷迪斯库存 - 确定是否有订单 - 进入队列 - 只在排队时运行数据库

4.这一步还可以有一个优化,就是内存标记,使用一个Map,将商品ID设置为false,当买空时,设为true;然后每次不是直接访问Redis进行库存查询,而是对商品ID进行条件判断

5.记忆标签的优点是它减少了对雷迪斯的访问(当产品销售完毕时)

SpringBoot集成兔MQ

1.添加依赖性;2.创建消息接收者; 3.创建消息发送者

四种兔MQ开关

直流交换器:
根据消息的路由键routingkey,将消息以完全匹配的方式路由到指定的队列中。
这里匹配是指消息本身所携带的路径键和 queue 被绑定到交换机的绑定键,这些键只有完全一致时才能匹配。
当队列和交换机绑定时, 可以设置多个绑定键.
消息可以被发送到多个队列,当多个队列设置相同的绑定键时发生这种情况。比如,在A队列、B队列和交换机之间绑定时,所有设置名为"binding_key_com"的绑定键,一个消息进入交换机,发送消息的路径是binding_key_com。因此消息将被发送到A队列,也会被路由到队列B

主题交换器:
和direct交换机非常类似,根据消息的路由键routingkey,将消息以模糊匹配的方式路由到指定的队列中。

3.风扇式开关:
不管消息路由键是什么,它将直接发送消息到交换机,所有被绑定到它的队列。

头顶交换器:不常使用

RabbitMQ工作模式

1、简单模式:

一个生产者(sender),一个队列(queue),一个消费者(receiver)。

2、work queue(工作队列):

一个生产者,一个队列,同一队列的讯息被多个消费者同时消费,每个消费只被消费一次。

3、订阅模式:

生产者生产消息,消息经过扇形交换机或直连交换机发送到多个不同的队列,注意,这里多个队列接收的消息个数是一致的。每条消息都会被消费多次。
适用的场景:每件由制造商制作的信息,不同的系统需要处理不同的信息,
例如,一个订单是在购物中心生成,业务系统需要处理订单,而记录系统需要记录订单记录。

4、路由模式:
改善上面的场景。比如,商场里有一个订单,有的订单是未付款,有些订单已经付了,我的业务系统只处理已付的订单,但记录系统,不论是未支付的还是已经支付的,都需要记录日志。所以我们需要将消息发送到不同的队列,这取决于订单类型。
这里所需要的交换机是直接连接交换机,并且要求每条消息必须携带路由键routingkey,例如,“没有支付”或“支付出去”。其中,我的日志队列和开关必须有多个绑定,它也想绑定“不付钱”的。还绑定“支付”业务队列和交换机只需要被绑定到“付款”。这样的话,“支付”消息不仅将被发送到日志排列中,将被调往业务队列,未支付的邮件只能被发送到日志队列.

5、通配符模式:
是上面路由模式的改进型,允许消息的路由键包含通配符,由主题交换机进行与绑定键进行模糊匹配,将消息路由到所有符合要求的队列中。

安全优化

MD5密码检查一次或两次

1.用户端:PASS = MD5(明文+固定Salt)功能:防止用户明文密码在网络上传输

第一步:明文密码–>form密码

private static final String salt = “1a2b3c4d”;

//首先你需要给一个特定的盐,因为服务器不知道具体的盐

2.服务结束:PASS=MD5(用户输入+随机销售)功能:防止数据库被盗,反查表获取密码

第二步:form密码–>数据库密码

步骤3:在两个转换后传递密码

第二次杀死接口地址隐藏

思考:在第二个杀手开始之前,请请求接口获取第二个杀手地址

1. PathVasriable参数的界面修改

2.添加生成地址接口

3.第二击取接收请求,先验证路径变量

注意事项:

1.虽然前端页面在秒杀未开始时秒杀按钮设置为不可用,但是有可能用户通过前端js代码找到秒杀地址在秒杀未开始时直接访问,秒杀接口的目的在于隐藏用户通过js获取的秒杀地址,而不允许它完成秒杀函数

2.在秒杀之前要先通过Controller中的/path路径下的类随机生成一个path,然后和用户ID一起存入Redis,在执行秒杀的时候再从Redis中取Path进行验证,然后进行秒杀

第三,数学公式验证代码(检索动态信息,例如通过ajax验证代码)

思路:点击秒杀之前,先输入验证码,分散用户的请求,在获取Path时进行验证

1.添加一个接口生成验证代码

2.在获取秒杀路时验证验证代码

3.ScriptEngine使用

四、接口限流防刷

思路:对接口做限流

1.拦截器可用于减少业务入侵(定义拦截器后,对业务逻辑代码进行评论)

具体步骤:

  • 当用户访问接口时,写入缓存的访问数,并设置有效性
  • 如果用户在一分钟内访问,缓存中的访问数将增加,如果超过,流量操作将被限制
  • 如果在一分钟内没有限制,缓存中的数据就会消失,并在下次访问时重新写入缓存中

操作:使用通用拦截器

  • 首先对AccessLimit发表评论
  • 每次课后,您只需要添加一个注释来设置刷数
  • 定义拦截器:继承HandlerInterceptorAdapter类

JSR303参数校正

  • 通过对输入参数 LoginVo @validated 添加注释,然后在传入的参数mobile和password上加上注解判断,如果@NotNull决定它是空的,它也可以自定义(com.imooc.Miaosha.Vo.(LoginVo)
  • 全球异常处理(com.imooc.Miaosha.util.WebConfig)

一些错误的解决

优化复数中的键名。

方案:通用缓存key封装大量的缓存引用也出现了一个问题,如何识别不同模块中的缓存(key值重复,如何辨别是不同模块的key)
解决:使用抽象类,定义基键(前缀),在里面定义缓存key的前缀以及缓存的过期时间从而实现将缓存的key进行封装。让不同模块继承它,因此,每次一个模块被缓存,添加此缓存特定前缀,而不同的过渡时期可以以统一的方式制定。

登陆连接到Mybatis数据库之后,显示的Mysql中miaosha表的nickname为null,其原因为:WebConfig类上没有@configuration注释。

@ Configuration 为定义配置类,可替代的xml配置文件,注释类包含一个或多个方法被 @Bean注释,这些方法将由 AnnotationConfigApplicationContext或 AnnotationConfigWebApplicationContext类扫描,并建立豆类定义,开始生产春式容器。

@Configuration标注在类上,相当于把该类作为spring的 xml 配置文件中的,作用为:配置spring容器(应用上下文)

@Configuation等价于

面试问题总结

画一下项目的架构图

项目简介

第二种杀手系统是,首先是登录系统,用户手机号码作为用户名,在登录前确定手机号码是否存在之前,然后判断密码是否正确。当进行密码判断时,为了确保用户密码的安全,我在这里用md5进行两个加密操作,首先,通过盐值对输入密码进行初始加密 md5加密,防止在网络传输中截获密码。然后在到达服务结束后,进行第二个md5加密,以防止在用户信息检索时泄露数据库信息,然后将客户端输入密码与数据库中的密码进行比较。如果密码正确,然后将随机生成一个标记,标记用户,然后把这个记号写到饼干上,该符号的地图和在雷迪斯存储的用户信息,当用户再次登录时,从饼干中提取的符号,进入 redis 并提取与此符号相符的用户信息。

产品列表使用页面缓冲技术来提高性能和减轻MySQL上的压力。

其次是第二种杀伤,核心功能,首先,确定用户是否空,然后判断库存是否足够,为了解决过卖的问题,首先,将超过0的股票添加到SQL文中,它还设置了一个单个索引以防止用户在每秒中被杀死,并把预备品存放在储存箱里,当第二个杀人请求到达确定预备物资是否足够时,同时确定用户是否有第二次杀手命令。为了优化用户体验,它还使用rabbitmq消息队列,首先将第二个杀人请求插入消息队列中,通过逐步执行此操作,用户不需要在这里等待,然后接收器从消息队列中取出消息并处理它,这实际上是去数据库确定库存是否足够,再来判断用户是否已经被杀了秒钟,然后是真正的库存减少,下订单,生成订单的操作,在处理消费者消息的过程中,客户会自动查询确定被删除的秒数。与此同时,考虑到如果Redis的访问中存在太多无效访问,资源开支也更大,为了解决这个问题,我使用记忆标签来减少对雷迪斯的访问,即设置一个map,key是商品,在启动系统时设置错误值,当预备库存不足时设置为真。当第二个杀人请求到达时,它首先决定商品的价值是否正确,然后决定预备库存,如果真, 直接返回第二个杀伤失败.

因为HTML源是透明的,为了保护秒杀接口,避免通过HTML源查看秒地址,超过可以被秒化的秒数,从而实现第二杀外第二杀时间周期,我也做了第二次杀人,以隐藏接口地址。每次执行一个真正的第二击中都会生成一个随机值,然后再将它放回罗迪斯,与url匹配,第二次杀人时确认地址是否合法,然后你到了真正的第二页杀人,同时我添加了用户验证代码,也就是说,只有在得到第二个杀人地址时,才能通过验证代码来获取它。最后, 防止刷刷, 操作限流,存储在Redis的用户访问数目,每次参观人数减少1,我在这里设置了五秒钟的点击限度。

整体的流程

1.进入产品列表页
2.点击产品详情页,静态资源缓存,Ajax获取验证代码等动态信息
3.按秒击杀按钮,将验证代码结果和产品ID传递到后端,如果结果正确。动态生成随机字符串UUID作为随机路径,将用户ID和产品ID(url)结合起来,输入 redis,沿着这条路往前边走。在前端到达路径后,根据路径地址调用第二次杀服务
4.服务端获取请求的路径参数,以检查缓存是否存在。
5.如果它存在并且雷迪斯有库存,减少雷迪斯库存以查看订单是否已经生成,或在消息队列中请求它
6.从消息队列的接收者获取消息:包括产品ID和用户ID,判断数据库库存和是否重复第二次击杀,然后订购。 订购过程是:减少库存,订购,生成订单。
8.生成订单成功或者失败后,都将秒杀结果放到redis中;前端采用ajax轮询方式查询redis获取最终秒杀结果,返回给用户提示。

项目可改进的地方

1.数据动态分离并不十分彻底,只使用浏览器缓存(客户端查询和返回200),没有CDN技术
2.没有降级方案:您可以开发一个备份服务,如果服务器真的崩溃,可以直接向用户提供友好的提示,而不是像卡死亡,服务器错误这样的硬反馈。
3.限流做的不够完善,目前只对用户对于某个商品的访问做了限流,没有对整体的流量做限流,比如不法分子有非常多的账号,同时对一个商品发起请求可能造成我们的服务不可用。
4.没有考虑红斑侵入治疗方案
5.本项目预热库存和静态数据,但在现实中,一种商品可能同时迅速爆炸,如果这些数据没有预热, 服务可能会延迟.需要迅速检测和隔离热点数据,例如,一个明星的粉丝在某个时候同意购买粉丝的发言人的产品,虽然该产品没有参与第二杀,但那一刻比一秒更美好
(英译汉)对于尚未进行实践或实际研究的部署,Nngnix可以作为负荷平衡工具

秒杀部分的流程

1.用户在第二杀产品详细页面上点击第二杀按钮
2.客户端向服务器请求第二个杀伤路径,主逻辑是生成一个随机路径值,并与用户ID一起存储在 redis中,并相应地组装第二个杀伤路径。
3.访问紧凑杀伤路径,以验证该路径中的路径是否存在于 redis,如果没有直接返回错误。
4. Redis缓存减少库存到子滤波请求

为什么Md5密码需要两次加密

1.客户端->服务端:pass = 明文pass + 固定salt;

2.服务端->数据库:pass= 用户输入 + 随机salt

如果用户登录时没有进行任何处理,则密码是明文的,然后密码将通过网络传输,如果有人被拦截,你会得到用户密码,所以客户端需要使用一个md5加密,然后将加密密码发送到服务器上,服务端接收用户经过md5加密后所传递的密码,然后执行另一个md5加密密码。是用随机盐拼写第一个md5之后的密码,然后在 md5 之后,将密码和盐写入数据库中两次。第一个md5加密是为了防止用户密码在网络传输中被截获。第二个md5加密是防止数据从数据库泄漏,通过逆调试获取用户密码.

如何实现分布式会议

  • 用户登录后,一个随机的stringtoken被生成并写入 cookie。
  • 映射记录符号和在雷迪斯的用户信息
  • 当用户再次浏览网页时, cookie中的相应符号被提取,并从Redis访问的符号中获取用户的相关信息

如何进行页面优化?

概要:直接将页面缓存到浏览器(取消采用纯HTML前端代码实现的泰米莱夫的使用),前端分离减少服务器压力。

  • 页面静态化是简单地使用纯HTML页面 + Ajax请求json数据来填补页面;
  • 如果某页在跳到B页之前需要条件判断,它可以在使用A页的ajax请求判断之后再跳到B页;
  • 如果不需要条件判断,直接跳到B的静态页面,让B使用ajax请求数据;
  • 优点:当用户访问网页时,不需要与服务端进行交互,从本地缓存中直接获取页面,大大节省网络流量;页面存储在html中,通过接口从客户端获取动态数据,因此服务端只需要写接口即可 ;

如何进行接口优化?

  • 解决超卖问题:在sql语句中设置stock_count>0语句,保证商品不变成负数;
  • 避免重复以下:将单个索引添加到数据库中;
  • 秒杀优化:
    • 当第二个杀手系统启动时,将库存预缓冲器存储在 redis中,然后,当第二个杀人请求到达时,库存现在减少了,消息 queuerabbitmq用于逐步实现操作,当用户请求在消息队列中到达时,它会在几秒内返回。这样,可以实现异步操作,它还减少了访问MySQL数据库,防止大量请求同时进入数据库,使数据库难以承受。在等待过程中,消费者将决定他们是否已经卖完了.如果上述两个条件直接返回第二个杀伤失败,这里有三个州代码,-1表示第二次击杀失败,0是杀死秒(即客户正在查询),1就是秒杀成功。查询客户时,实际上为它生成订单,然后订单支付以后,mqsql库存减少了1.在 redis 减少库存之前,也可以使用Hashmap来设置一个记忆标记,关键是商品ID,值是bool型,并以假为初始化,当买空时,设为true,每次你没有直接访问雷迪斯来查询库存,相反,对商品身分证作出条件判断,这可以减少对雷迪斯的访问,节约了时间和消耗。

如何确定货物是否出售?

  • redis中的库存是否>0

如何确定用户是否重复第二次杀人?

  • 判断redis中的key是否存在,用户秒杀后会在redis中设置一个展位的key来标志用户已经秒杀过

如何解决过卖(mysql锁)

  • 过卖的问题主要是在MySQL中实现它的锁定
  • 在减库存时设置sql语句where stock_count > 0,代码在com.imooc.miaosha.dao.GoodsDao中

如何解决重复提交(只有mysql索引)

  • 在执行清单减少下订单逻辑之前,确定订单表是否包含该产品的用户追踪记录
  • 使用唯一的索引,创建一个由用户ID和货物ID组成的唯一索引(u_uid_gid)在订单表(miaosha_order)中,这样在重复插入数据时,它不会被插入,并且以前减少的库存操作也会在事务中回滚。

第二杀人接口地址隐藏问题

  • 为什么隐藏秒杀接口的地址?尽管在没有启动前端页面时,“秒杀”按钮被禁用,但当杀手未启动时,用户可能直接通过前端js代码(html)找到杀手地址,秒杀接口的目的在于隐藏用户通过js获取的秒杀地址,而不允许它完成秒杀函数

  • **如何做的?:**在秒杀之前先通过uuid随机生成一个额外的path与url拼接生成秒杀路径,然后将路径和用户ID插入到 redis中,所以当用户访问时,它不会直接暴露原始地址,相反,在url之后添加地址,实现隐藏秒杀接口地址.在执行秒杀的时候,如果你想访问秒杀接口,然后先从罗迪斯走去核查,确定路径是否存在,如果它存在,那么下一个杀人活动就可以进行。

如何限制流动以防止刷刷(验证代码+通用拦截器限制流动)

  • 想法:1.限制接口的流量;2.延迟用户在 redis 中访问接口的数量;3.通过拦截器
  • 具体步骤:
    • 定义一个 AccessLimit注释,其参数包括时间、最大访问数和是否登录;
    • 定义一个拦截器继承HandlerInterceptorAdapter类并重写其预处理方法;
    • @AccessLimit(秒=5, maxCount=5, needLogin=true)用于指定每单位时间的最大访问数。

数学公式验证代码

  • 思路:点击秒杀按钮之前,先输入验证码,分散用户的请求。1.添加一个接口生成验证代码;2.在获取秒杀路时验证验证代码;
  • 前端的操作:首先将验证码都给隐藏起来,假如是在秒杀进行中,那么验证码就都给显示出来,加入秒杀结束了,那么又隐藏起来;
  • 后端操作:通过ajax获取动态信息,如验证代码:1.首先定义一个操作数的字符集,包括+、-、*等运算符;2.定义生成验证码的本质:数学公式(我设置了三个数值num,两次计算ops);3.验证验证码是否回答正确,若输入正确,把它从雷迪斯中删除。

消息队列的作用(同步峰值切削)

  • 切断峰值并同时减少同时的排放
  • 通过在进入队列后直接返回用户队列消息来改善用户体验

为了减少库存,使用哪种调度方法?

  • 使用绝地包装方法减少库存使用 Decr方法

如何确保缓存和数据库数据之间的一致性

  • 对库存数据没有保证,缓存中的库存仅用于筛选请求,即使一些请求被插入更多,我们可以保证数据库级别不会过卖。
  • 商品信息的静态数据不需要保证数据的一致性,因为它不会改变

如果项目中的 redis 服务被暂停,如何减轻数据库上的压力

  • 使用多个 redis, redis群
  1. 来自反振器的奴隶

    当主拷贝配置时,设置继电器重发,继电器将从主继电器读取主继电器的操作日志,从而实现主继电器的复制。
    1)从Redis库重新启动后,它自动连接到主客户端架构,并自动完成同步数据;
    2)如果从数据库实现持久性,它可以直接连接到主机的顶部,只要实现增量备份(重新连接过程的延迟,主机的数据库执行数据操作,从数据库中复制),再连接到主机的架构将实现增量同步。

  2. Master 宕机
    如果主机没有维护数据,请不要在此点重新启动服务,否则您可能会丢失数据。正确的操作如下:
    在奴隶数据上运行 SLAVEOF ON ONE 来切断从关系中的主机,并让奴隶升级主库
    在这一点上,重新启动主数据库,执行SLAVEOF,将它设置到一个存储器,连接到主编码器,复制主编码器,并自动备份数据。
    上述过程很容易配置错误,并可以通过Redis提供的 sentinel机制来简化。 简单方法:Redis sentinel函数。

如果库存减少,但用户没有支付,如何恢复库存,抢劫继续

  • 如果订单没有及时付款,删除订单,增加库存量,恢复雷迪斯缓存和本地缓存的数量
  • 但这并不是因为是次购,也不是因为是付款,也不是因为是次购,也不是因为是利润,也不是因为是付款。 即使你没有付款,它也不会交货,也不会少卖,也不会过卖,也不会给交易员带来任何损失。

系统瓶颈在哪?

  • 数据库
  • 硬件资源如服务端网络、CPU和内存
  • 对于服务侧的网络带宽可以从 isp购买,服务器侧的硬件资源可以尽量增加
  • 此外,它可以降低CPU和内存操作的成本,如编码操作、序列操作、频繁创建大型对象等,并防止内存泄漏

为什么使用雷迪斯?

  • 快速、基于内存的操作,类似于地图、搜索和操作时间复杂性O(1)
  • 数据结构简单,数据结构特别设计
  • 使用单个线程以避免在线程之间交换和消耗CPU,而不考虑所有问题,没有锁定和解锁操作,也没有等待僵局的情况。
  • 多路径可重用I/O,非阻塞I/O
  • Redis有自己的VM机制, 一般来说, 系统调用需要时间.

雷迪斯在哪里?

  • 记录用户登录状态;记录热点数据;预减少库存;储存已售标记;

雷迪斯的数据结构是什么?

  • string hash set list zset

为什么不用多线程?

  • 不涉及锁和加锁
  • 不需要在线程间交换CPU消耗

单线程的缺点?

  • 耗时命令的并发降低
  • 无法执行多核CPU性能,但可以通过多个磁盘解决。

那么雷迪斯没有线程安全问题吗?

  • 多重的红外复合操作仍需要锁定,并且可以分配锁定。

除了你项目里面的优化,你还有什么优化策略吗?(同上一个问题)

许多缓冲器被使用,所以有缓冲器撞击和缓冲器雪崩和缓冲器一致性问题

先自我介绍一下,他高中毕业了13年,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。了解大多数年轻的Java工程师,想要升技能,经常需要找到自己的成长或向班上汇报。但对于培训机构来说,学费大约是人民币,着实压力不小。当你不在系统时,自我学习的效率很低,而且很持久。也很容易停止天花板技术。所以我为你收集了一个"java开发工具"初衷也很简单,这是一个想帮助自己学习的朋友,却不知道该从哪里学习。同时减少每个人的负担.添加下方名片,你可以得到完整的学习信息

Copyright © 2012-2014 Www.tudoupe.Com. 土豆启动 版权所有 意见建议:tdsky@tudoupe.com

土豆系统,土豆PE,win7系统下载,win7 64位旗舰版下载,u盘启动,u盘装系统,win10下载,win10正式版下载,win10 RTM正式版下载,win8下载,电脑蓝屏,IE11修复,网络受限,4K对齐,双系统,隐藏分区,系统安装不了,U盘装系统,笔记本装系统,台式机装系统,diskgenius运用,GHSOT装系统,U盘修复,U盘技巧,U盘速度,U盘不能格式化,U盘复制发生错误,U盘加密,U盘选购,开机黑屏,蓝屏,进不了系统,上不了网,打不开程序,点击无反应,系统设置,PE个性化,PE添加网络,PE维护系统

点击这里给我发消息