当前位置: 首页 > news >正文

如何秒杀系统架构设计

原文路径:https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/%e5%a6%82%e4%bd%95%e8%ae%be%e8%ae%a1%e4%b8%80%e4%b8%aa%e7%a7%92%e6%9d%80%e7%b3%bb%e7%bb%9f/00%20%e5%bc%80%e7%af%87%e8%af%8d%20%e7%a7%92%e6%9d%80%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%a1%e9%83%bd%e6%9c%89%e5%93%aa%e4%ba%9b%e5%85%b3%e9%94%ae%e7%82%b9%ef%bc%9f.md

1、秒杀系统解决的问题:一个是并发读,一个是并发写,并发读的核心优化理念是尽量减少用户到服务端来“读”数据,或者让他们读更少的数据;并发写的处理原则也一样,它要求我们在数据库层面独立出来一个库,做特殊的处理。另外,我们还要针对秒杀系统做一些保护,针对意料之外的情况设计兜底方案,以防止最坏的情况发生。
而从一个架构师的角度来看,要想打造并维护一个超大流量并发读写、高性能、高可用的系统,在整个用户请求路径上从浏览器到服务端我们要遵循几个原则,就是要保证用户请求的数据尽量少、请求数尽量少、路径尽量短、依赖尽量少,并且不要有单点。这些关键点我会在后面的文章里重点讲解。
2、秒杀的整体架构可以概括为“稳、准、快”几个关键字。
高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。本专栏将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。
一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,我将用一篇文章来专门讲解如何设计秒杀减库存方案。
高可用。 虽然我介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,我们还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。专栏的最后,我将带你思考可以从哪些环节来设计兜底方案。

3、秒杀系统的架构原则
一、数据要尽量少和请求量尽量少
所谓“数据要尽量少”,首先是指用户请求的数据能少就少。请求的数据包括上传给系统的数据和系统返回给用户的数据(通常就是网页)。
为啥“数据要尽量少”呢?因为首先这些数据在网络上传输需要时间,其次不管是请求数据还是返回数据都需要服务器做处理,而服务器在写网络时通常都要做压缩和字符编码,这些都非常消耗CPU,所以减少传输的数据量可以显著减少CPU的使用。例如,我们可以简化秒杀页面的大小,去掉不必要的页面装修效果,等等。
其次,“数据要尽量少”还要求系统依赖的数据能少就少,包括系统完成某些业务逻辑需要读取和保存的数据,这些数据一般是和后台服务以及数据库打交道的。调用其他服务会涉及数据的序列化和反序列化,而这也是CPU的一大杀手,同样也会增加延时。而且,数据库本身也容易成为一个瓶颈,所以和数据库打交道越少越好,数据越简单、越小则越好。
二、路径要尽量短
所谓“路径”,就是用户发出请求到返回数据这个过程中,需求经过的中间的节点数。
通常,这些节点可以表示为一个系统或者一个新的Socket连接(比如代理服务器只是创建一个新的Socket连接来转发请求)。每经过一个节点,一般都会产生一个新的Socket连接。
然而,每增加一个连接都会增加新的不确定性。从概率统计上来说,假如一次请求经过5个节点,每个节点的可用性是99.9%的话,那么整个请求的可用性是:99.9%的5次方,约等于99.5%。
所以缩短请求路径不仅可以增加可用性,同样可以有效提升性能(减少中间节点可以减少数据的序列化与反序列化),并减少延时(可以减少网络传输耗时)。
要缩短访问路径有一种办法,就是多个相互强依赖的应用合并部署在一起,把远程过程调用(RPC)变成JVM内部之间的方法调用。在《大型网站技术架构演进与性能优化》一书中,我也有一章介绍了这种技术的详细实现。
三、依赖要尽量少
所谓依赖,指的是要完成一次用户请求必须依赖的系统或者服务,这里的依赖指的是强依赖。
举个例子,比如说你要展示秒杀页面,而这个页面必须强依赖商品信息、用户信息,还有其他如优惠券、成交列表等这些对秒杀不是非要不可的信息(弱依赖),这些弱依赖在紧急情况下就可以去掉。
要减少依赖,我们可以给系统进行分级,比如0级系统、1级系统、2级系统、3级系统,0级系统如果是最重要的系统,那么0级系统强依赖的系统也同样是最重要的系统,以此类推。
注意,0级系统要尽量减少对1级系统的强依赖,防止重要的系统被不重要的系统拖垮。例如支付系统是0级系统,而优惠券是1级系统的话,在极端情况下可以把优惠券给降级,防止支付系统被优惠券这个1级系统给拖垮。
四、不要有单点
系统中的单点可以说是系统架构上的一个大忌,因为单点意味着没有备份,风险不可控,我们设计分布式系统最重要的原则就是“消除单点”。
那如何避免单点呢?我认为关键点是避免将服务的状态和机器绑定,即把服务无状态化,这样服务就可以在机器中随意移动。
如何那把服务的状态和机器解耦呢?这里也有很多实现方式。例如把和机器相关的配置动态化,这些参数可以通过配置中心来动态推送,在服务启动时动态拉取下来,我们在这些配置中心设置一些规则来方便地改变这些映射关系。
应用无状态化是有效避免单点的一种方式,但是像存储服务本身很难无状态化,因为数据要存储在磁盘上,本身就要和机器绑定,那么这种场景一般要通过冗余多个备份的方式来解决单点问题。
4、秒杀系统实战可优化点
一、把秒杀系统独立出来单独打造一个系统,这样可以有针对性地做优化,例如这个独立出来的系统就减少了店铺装修的功能,减少了页面的复杂度;
二、在系统部署上也独立做一个机器集群,这样秒杀的大流量就不会影响到正常的商品购买集群的机器负载;
三、将热点数据(如库存数据)单独放到一个缓存系统中,以提高“读性能”;
四、增加秒杀答题,防止有秒杀器抢单。
五、对页面进行彻底的动静分离,使得用户秒杀时不需要刷新整个页面,而只需要点击抢宝按钮,借此把页面刷新的数据降到最少;
六、在服务端对秒杀商品进行本地缓存,不需要再调用依赖系统的后台服务获取数据,甚至不需要去公共的缓存集群中查询数据,这样不仅可以减少系统调用,而且能够避免压垮公共缓存集群。
七、增加系统限流保护,防止最坏情况发生。

5、如何做好页面动静分离
一、何为动静分离?
简单来说,“动态数据”和“静态数据”的主要区别就是看页面中输出的数据是否和URL、浏览者、时间、地域相关,以及是否含有Cookie等私密数据。比如说:
很多媒体类的网站,某一篇文章的内容不管是你访问还是我访问,它都是一样的。所以它就是一个典型的静态数据,但是它是个动态页面。
我们如果现在访问淘宝的首页,每个人看到的页面可能都是不一样的,淘宝首页中包含了很多根据访问者特征推荐的信息,而这些个性化的数据就可以理解为动态数据了。
二、CDN是啥?
CDN,即内容分发网络(Content Delivery Network),是一种通过地理上分散的服务器网络来高效地传递内容的系统。CDN的主要目的是提高互联网应用的响应速度和稳定性,降低网络延迟,提升用户体验。
三、怎样对静态数据做缓存呢?
在这里插入图片描述
四、CDN缓存静态数据问题
在这里插入图片描述
五、静态和动态数据分离注意点
你可能会问,存储在浏览器或CDN上,有多大区别?我的回答是:区别很大!因为在CDN上,我们可以做主动失效,而在用户的浏览器里就更不可控,如果用户不主动刷新的话,你很难主动地把消息推送给用户的浏览器。
另外,在什么地方把静态数据和动态数据合并并渲染出一个完整的页面也很关键,假如在用户的浏览器里合并,那么服务端可以减少渲染整个页面的CPU消耗。如果在服务端合并的话,就要考虑缓存的数据是否进行Gzip压缩了:如果缓存Gzip压缩后的静态数据可以减少缓存的数据量,但是进行页面合并渲染时就要先解压,然后再压缩完整的页面数据输出给用户;如果缓存未压缩的静态数据,这样不用解压静态数据,但是会增加缓存容量。虽然这些都是细节问题,但你在设计架构方案时都需要考虑清楚。

4、二八原则:有针对性地处理好系统的“热点数据”
一、什么是热点?
热点分为热点操作和热点数据。所谓“热点操作”,例如大量的刷新页面、大量的添加购物车、双十一零点大量的下单等都属于此类操作。对系统来说,这些操作可以抽象为“读请求”和“写请求”,这两种热点请求的处理方式大相径庭,读请求的优化空间要大一些,而写请求的瓶颈一般都在存储层,优化的思路就是根据CAP理论做平衡,这个内容我在“减库存”一文再详细介绍。
而“热点数据”比较好理解,那就是用户的热点请求对应的数据。而热点数据又分为“静态热点数据”和“动态热点数据”。
所谓“静态热点数据”,就是能够提前预测的热点数据。例如,我们可以通过卖家报名的方式提前筛选出来,通过报名系统对这些热点商品进行打标。另外,我们还可以通过大数据分析来提前发现热点商品,比如我们分析历史成交记录、用户的购物车记录,来发现哪些商品可能更热门、更好卖,这些都是可以提前分析出来的热点。
所谓“动态热点数据”,就是不能被提前预测到的,系统在运行过程中临时产生的热点。例如,卖家在抖音上做了广告,然后商品一下就火了,导致它在短时间内被大量购买。
由于热点操作是用户的行为,我们不好改变,但能做一些限制和保护,所以本文我主要针对热点数据来介绍如何进行优化。
二、如何发现热点数据?
在这里插入图片描述
三、发现热点数据注意点
1、这个热点服务后台抓取热点数据日志最好采用异步方式,因为“异步”一方面便于保证通用性,另一方面又不影响业务系统和中间件产品的主流程。
2、热点服务发现和中间件自身的热点保护模块并存,每个中间件和应用还需要保护自己。热点服务台提供热点数据的收集和订阅服务,便于把各个系统的热点数据透明出来。
3、热点发现要做到接近实时(3s内完成热点数据的发现),因为只有做到接近实时,动态发现才有意义,才能实时地对下游系统提供保护。
在这里插入图片描述
5、流量削峰这事应该怎么做?
一、为什么要削峰?
我们知道服务器的处理资源是恒定的,你用或者不用它的处理能力都是一样的,所以出现峰值的话,很容易导致忙到处理不过来,闲的时候却又没有什么要处理。但是由于要保证服务质量,我们的很多处理资源只能按照忙的时候来预估,而这会导致资源的一个浪费。
这就好比因为存在早高峰和晚高峰的问题,所以有了错峰限行的解决方案。削峰的存在,一是可以让服务端处理变得更加平稳,二是可以节省服务器的资源成本。针对秒杀这一场景,削峰从本质上来说就是更多地延缓用户请求的发出,以便减少和过滤掉一些无效请求,它遵从“请求数要尽量少”的原则。
今天,我就来介绍一下流量削峰的一些操作思路:排队、答题、分层过滤。这几种方式都是无损(即不会损失用户的发出请求)的实现方案,当然还有些有损的实现方案,包括我们后面要介绍的关于稳定性的一些办法,比如限流和机器负载保护等一些强制措施也能达到削峰保护的目的,当然这都是不得已的一些措施,因此就不归类到这里了。
二、方式一、排队
在这里插入图片描述
三、方式二:答题
答题的目的?
1、第一个目的是防止部分买家使用秒杀器在参加秒杀时作弊。2011年秒杀非常火的时候,秒杀器也比较猖獗,因而没有达到全民参与和营销的目的,所以系统增加了答题来限制秒杀器。增加答题后,下单的时间基本控制在2s后,秒杀器的下单比例也大大下降。
2、第二个目的其实就是延缓请求,起到对请求流量进行削峰的作用,从而让系统能够更好地支持瞬时的流量高峰。这个重要的功能就是把峰值的下单请求拉长,从以前的1s之内延长到2s~10s。这样一来,请求峰值基于时间分片了。这个时间的分片对服务端处理并发非常重要,会大大减轻压力。而且,由于请求具有先后顺序,靠后的请求到来时自然也就没有库存了,因此根本到不了最后的下单步骤,所以真正的并发写就非常有限了。

三、分层过滤
在这里插入图片描述
四、削峰总结
主要介绍了削峰的3种处理方式:一个是通过队列来缓冲请求,即控制请求的发出;一个是通过答题来延长请求发出的时间,在请求发出后承接请求时进行控制,最后再对不符合条件的请求进行过滤;最后一种是对请求进行分层过滤。
其中,队列缓冲方式更加通用,它适用于内部上下游系统之间调用请求不平缓的场景,由于内部系统的服务质量要求不能随意丢弃请求,所以使用消息队列能起到很好的削峰和缓冲作用。
而答题更适用于秒杀或者营销活动等应用场景,在请求发起端就控制发起请求的速度,因为越到后面无效请求也会越多,所以配合后面介绍的分层拦截的方式,可以更进一步减少无效请求对系统资源的消耗。
分层过滤非常适合交易性的写请求,比如减库存或者拼车这种场景,在读的时候需要知道还有没有库存或者是否还有剩余空座位。但是由于库存和座位又是不停变化的,所以读的数据是否一定要非常准确呢?其实不一定,你可以放一些请求过去,然后在真正减的时候再做强一致性保证,这样既过滤一些请求又解决了强一致性读的瓶颈。
6、影响性能因素有哪些?
一、线程数量计算推荐公式:
线程数 = [(线程等待时间 + 线程CPU时间) / 线程CPU时间] × CPU数量
二、如何优化系统?
在这里插入图片描述
在这里插入图片描述
7、秒杀系统“减库存”设计的核心逻辑
一、减库存有哪几种方式?
下单减库存,即当买家下单后,在商品的总库存中减去买家购买数量。下单减库存是最简单的减库存方式,也是控制最精确的一种,下单时直接通过数据库的事务机制控制商品库存,这样一定不会出现超卖的情况。但是你要知道,有些人下完单可能并不会付款。
付款减库存,即买家下单后,并不立即减库存,而是等到有用户付款后才真正减库存,否则库存一直保留给其他买家。但因为付款时才减库存,如果并发比较高,有可能出现买家下单后付不了款的情况,因为可能商品已经被其他人买走了。
预扣库存,这种方式相对复杂一些,买家下单后,库存为其保留一定的时间(如10分钟),超过这个时间,库存将会自动释放,释放后其他买家就可以继续购买。在买家付款前,系统会校验该订单的库存是否还有保留:如果没有保留,则再次尝试预扣;如果库存不足(也就是预扣失败)则不允许继续付款;如果预扣成功,则完成付款并实际地减去库存。
二、减库存可能存在的问题?
在这里插入图片描述
三、大型秒杀中如何减库存?
目前来看,业务系统中最常见的就是预扣库存方案,像你在买机票、买电影票时,下单后一般都有个“有效付款时间”,超过这个时间订单自动释放,这都是典型的预扣库存方案。而具体到秒杀这个场景,应该采用哪种方案比较好呢?
由于参加秒杀的商品,一般都是“抢到就是赚到”,所以成功下单后却不付款的情况比较少,再加上卖家对秒杀商品的库存有严格限制,所以秒杀商品采用“下单减库存”更加合理。另外,理论上由于“下单减库存”比“预扣库存”以及涉及第三方支付的“付款减库存”在逻辑上更为简单,所以性能上更占优势。
“下单减库存”在数据一致性上,主要就是保证大并发请求时库存数据不能为负数,也就是要保证数据库中的库存字段值不能为负数,一般我们有多种解决方案:一种是在应用程序中通过事务来判断,即保证减后库存不能为负数,否则就回滚;另一种办法是直接设置数据库的字段数据为无符号整数,这样减后库存字段值小于零时会直接执行SQL语句来报错;再有一种就是使用CASE WHEN判断语句,例如这样的SQL语句:
UPDATE item SET inventory = CASE WHEN inventory >= xxx THEN inventory-xxx ELSE inventory END
四、
在这里插入图片描述
在这里插入图片描述
8、如何设计兜底方案?
一、高可用建设应该从哪里着手?
在这里插入图片描述
二、服务降级
在这里插入图片描述
三、限流
在这里插入图片描述
四、拒绝服务
在这里插入图片描述
9、缓存失效策略
一、很多用户比较关注应用层排队的问题,大家主要的疑问就是应用层用队列接受请求,然后结果怎么返回的问题。
在这里插入图片描述
至于大家在纠结异步请求如何返回结果的问题,其实有多种方案。
一是页面中采用轮询的方式定时主动去服务端查询结果,例如每秒请求一次服务端看看有没有处理结果(现在很多支付页面都采用了这种策略),这种方式的缺点是服务端的请求数会增加不少。
二是采用主动push的方式,这种就要求服务端和客户端保持连接了,服务端处理完请求主动push给客户端,这种方式的缺点是服务端的连接数会比较多。
还有一个问题,就是如果异步的请求失败了,怎么办?对秒杀来说,我觉得如果失败了直接丢弃就好了,最坏的结果就是这个人没有抢到而已。但是你非要纠结的话,就要做异步消息的持久化以及重试机制了,要保证异步请求的最终正确处理一般都要借助消息系统,即消息的最终可达,例如阿里的消息中间件是能承诺只要客户端消息发送成功,那么消息系统一定会保证消息最终被送到目的地,即消息不会丢。因为客户端只要成功发送一条消息,下游消费方就一定会消费这条消息,所以也就不存在消息发送失败的问题了。

二、静态化的方案中关于Hash分组的问题
可能通常理解Hash分组,像Cache这种可能一个key对应的数据只存在于一个实例中,这样做其实是为了保证缓存命中率,因为所有请求都被路由到一个缓存实例中,除了第一次没有命中外,后面的都会命中。
但是这样也存在一个问题,就是如果热点商品过于集中,Cache就会成为瓶颈,这时单个实例也支撑不了。像秒杀这个场景中,单个商品对Cache的访问会超过20w次,一般单Cache实例都扛不住这么大的请求量。所以需要采用一个分组中有多个实例缓存相同的数据(冗余)的办法来支撑更大的访问量。
你可能会问:一个商品数据存储在多个Cache实例中,如何保证数据一致性呢?(关于失效问题大家问得也比较多,后面再回答。)这个专栏中提的Hash分组都是基于Nginx+Varnish实现的,Nginx把请求的URL中的商品ID进行Hash并路由到一个upstream中,这个upstream挂载一个Varnish分组(如下图所示)。这样,一个相同的商品就可以随机访问一个分组的任意一台Varnish机器了。
在这里插入图片描述
另外一个问题,关于Hash分组大家关注比较多的是命中率的问题,就是Cache机器越多命中率会越低。
这个其实很好理解,Cache实例越多,那么这些Cache缓存数据需要访问的次数也就越多。例如我有3个Redis实例,需要3个Redis实例都缓存商品A,那么至少需要访问3次才行,而且是这3次访问刚好落到不同的Redis实例中。那么从第4次访问开始才会被命中,如果仅仅是一个Redis实例,那么第二次访问时其实就能命中了。所以理论上Cache实例多会影响命中率。
你可能还会问,如果访问量足够大,那么只是影响前几次命中率而已,是的,如果Cache一直不失效的话是这样的,但是在实际的生产环境中Cache失效是很频繁发生的事情。很多情况下,还没等到所有Cache实例填满,该商品就已经失效了。所以,我们要根据商品的重复访问量来合理地设置Cache分组。

三、静态数据Cache失效的问题?
在这里插入图片描述
在这里插入图片描述

相关文章:

如何秒杀系统架构设计

原文路径:https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/%e5%a6%82%e4%bd%95%e8%ae%be%e8%ae%a1%e4%b8%80%e4%b8%aa%e7%a7%92%e6%9d%80%e7%b3%bb%e7%bb%9f/00%20%e5%bc%80%e7%af%87%e8%af%8d%20%e7%a7%92%e6%9d%80%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%…...

深度神经网络——什么是降维?

引言 什么是降维? 降维是用于降低数据集维度的过程,采用许多特征并将它们表示为更少的特征。 例如,降维可用于将二十个特征的数据集减少到仅有几个特征。 降维通常用于无监督学习任务 降维是一个用于降低数据集维度的过程,采用许…...

SpringMVC—RequestMapping注解

一、RequestMapping注解 RequestMapping注解:是Spring MVC框架中的一个控制器映射注解,用于将请求映射到相应的处理方法上,具体来说,他可以将指定URL的请求绑定到一个特定的方法或类上,从而实现对请求的处理和响应。 …...

Java线程池基本概念

全局和局部线程池 全局线程池 在Spring框架中,全局线程池如ThreadPoolTaskExecutor通常是作为Spring Bean存在的,它们的生命周期由Spring容器管理。当Spring容器关闭时,这些线程池也会被适当地清理和关闭。因此,开发者通常不需要手…...

智能车联网安全发展形势、挑战

一、技术演进加速车联网安全环境复杂变化 当前,5G、大数据、大算力、大模型等技术正加速在车联网领域实现融合应用。车联网的网络通信能力、感知计算水平以及创新业务应用都在快速发展,与此同时,车联网的网络安全环境也在随之演进变化&#…...

AWS概述

AWS概述EMR Serverless Aamzon Web Services提供了一系列全球范围的云产品,包括计算、存储、数据库、分析、网络、移动、开发工具、管理工具、IoT、安全和企业应用:按需交付、及时可用、采用随用随付的定价模式。你可以畅享200多种服务,从数据…...

MySQL常见面试题自测

文章目录 MySQL基础架构一、说说 MySQL 的架构?二、一条 SQL语句在MySQL中的执行过程 MySQL存储引擎一、MySQL 提供了哪些存储引擎?二、MySQL 存储引擎架构了解吗?三、MyISAM 和 InnoDB 的区别? MySQL 事务一、何谓事务&#xff1…...

c语言回顾-函数递归

1.递归的介绍 1.1什么是递归 递归是指在一个函数的定义中调用自身的过程。简单来说,递归是一种通过重复调用自身来解决问题的方法。 递归包括两个关键要素:基本情况和递归情况。基本情况是指当问题达到某个特定条件时,不再需要递归调用&am…...

消息队列-RabbitMQ-延时队列实现

死信队列 DLX,全称为Dead-Letter-Exchange,死信交换机,死信邮箱。当消息在一个队列中变成死信之后,它能重新发送到另外一个交换器中,这个交换器就是DLX,绑定DLX的队列就称为死信队列。 导致死信的几种原因: ● 消息…...

【热门开源项目推荐】满足不同程序员的需求与关注点

目录 前言一、热门开源项目介绍二、使用开源热门项目的优势(一)经济方面(二)技术方面(三)社区支持及协作方面 三、程序员选择项目模型建议(一)关键步骤(二)示…...

一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析)

一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析) rotatelogs rotatelogs 是一个用于管理日志文件的 Go 语言库,它提供了自动轮换、压缩和删除旧日志文件的功能。这个库可以帮助你更好地管理和维护你的应用程序日志。要使…...

【Go语言精进之路】构建高效Go程序:了解string实现原理并高效使用

🔥 个人主页:空白诗 🔥 热门专栏:【Go语言精进之路】 文章目录 引言一、Go语言的字符串类型1.1 字符串的定义1.2 字符串的零值可用1.3 字符串的不可变性1.4 字符串的拼接1.5 字符串的常用方法1.6 实际使用示例 二、字符串的内部表…...

HDFS 常见命令

在HDFS创建文件夹:hdfs dfs -mkdir /test 复制本地文件到HDFS中某个目录下:hdfs dfs -put /本地路径 /hdfs 路径 查看文件内容:hdfs dfs -cat /test.txt 查看当前文件夹目录:hdfs dfs -ls / 查看文件夹中的文件数:…...

示例:WPF中应用Grid的SharedSizeGroup设置整齐的布局

一、目的&#xff1a;应用Grid的SharedSizeGroup设置整齐的布局 二、实现 <ItemsControl ItemsSource"{local:GetStudents Count5}"><ItemsControl.ItemTemplate><DataTemplate><Grid ShowGridLines"True"><Grid.ColumnDefinit…...

React的form表单自定义校验规则

使用antd开发的过程中&#xff0c;必定会遇到需要对form表单进行必填校验的处理&#xff0c;正常情况下&#xff0c;我们都会一个空的必填校验&#xff0c;如下&#xff1a;一般我们只需要简单配置rules即可 <FormItem label"管理员姓名" {...itemLayout.wholeLi…...

一种新的一维时间序列信号盲解卷积算法(以旋转机械故障诊断为例,MATLAB环境)

一种新的一维时间序列信号盲解卷积算法&#xff08;以旋转机械故障诊断为例&#xff0c;MATLAB环境&#xff09;&#xff0c;可作为深度学习信号前处理过程&#xff0c;水个SCI不是问题。 机械设备的状态信号中往往蕴含着大量的设备异常信息。如何从繁多的机械状态信号中提取足…...

618电商是社区网站入局的好时机吗?

近日&#xff0c;随着618大促的临近&#xff0c;许多内容平台像B站、小红书等纷纷被电商活动所充斥&#xff0c;让用户感觉仿佛被电商绑架一般。这种用户体验的极度不佳让人开始思考&#xff0c;难道这就是互联网社区的未来发展方向吗&#xff1f; 在所有平台性质的社区中&…...

不知道密码,一样能卸载瑞星esm防病毒终端安全防护系统

离开单位后试图卸载瑞星的时候却发现还需要密码&#xff0c;真是烦死了。研究了几分钟后找到了完美卸载方法。 首先&#xff0c;让我们请出老流氓360安全卫士&#xff0c;下载好它&#xff0c;让右键菜单出现使用 360强力删除这一选项。 之后&#xff0c;进入安全模式&#x…...

Chromium 开发指南2024 Mac篇-安装和配置depot_tools工具(三)

1.引言 在前两篇指南中&#xff0c;我们详细介绍了在 macOS 环境下编译 Chromium 所需的硬件要求和系统依赖&#xff0c;并具体讲解了如何正确安装和配置 Xcode。通过这些步骤&#xff0c;您已经为编译 Chromium 打下了坚实的基础。然而&#xff0c;编译 Chromium 还需要配置一…...

微信小程序-路由和页面跳转API

一.wx.navigateTo wx.navigateTo是通过编程实现页面跳转&#xff0c;和navigator组件组件中&#xff0c;open-type"navigate"属性类似&#xff0c;是保留当前页面跳转新的页面&#xff0c;不适用tabbar页面。 //保留当前页面&#xff0c;跳转到非tabbar页面wx.navig…...

PWR电源控制

一、PWR简介 1、PWR&#xff08;Power Control&#xff09;电源控制 &#xff08;1&#xff09;PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能 &#xff08;2&#xff09;可编程电压监测器&#xff08;PVD&#xff09;可以监控…...

【记录46】【案例】echarts 柱状图

echarts环境4.1.0 <template><div id"threefour"></div> </template> <script> import * as echarts from "echarts" export default {name:"",components:{},data(){return {}},methods:{getdata(){var myChart…...

Github2024-06-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4JavaScript项目2Lua项目1PHP项目1Blade项目1非开发语言项目1TypeScript项目1Shell项目1从零开始构建你喜爱的技术 创建周期:2156 天…...

茶艺师服务师傅小程序APP源码(APP+小程序+公众号+H5)

&#x1f375;茶艺师服务小程序&#xff1a;品味生活的茶艺新体验&#x1f331; &#x1f33f;一、引言&#xff1a;茶艺师服务小程序&#xff0c;让生活更有味 在繁忙的生活中&#xff0c;品一杯香茗&#xff0c;感受茶文化的韵味&#xff0c;是许多人向往的休闲方式。然而&…...

【正则表达式】入门

参考视频&#xff1a;10分钟快速掌握正则表达式_哔哩哔哩_bilibili 这个网站用来测试写的正则表达式效果&#xff1a;regex101: build, test, and debug regex 示例&#xff1a; 限定符 ? 表示前一个字符可有可无 比如这里输入&#xff1a;de? 匹配结果可以得到d和de * 前…...

制造业为什么需要ERP企业管理软件?

如今&#xff0c;传统的制造业管理方式逐渐变得力不从心~库存积压、生产效率低下、供应链混乱…想象一下&#xff0c;如果你的企业仍然依赖于手工记录订单、库存和财务数据&#xff0c;那么每当市场发生变动时&#xff0c;你就需要花费大量的时间和精力去重新调整生产计划、更新…...

JavaScript Prototype

JavaScript Prototype JavaScript 是一种高级的、解释执行的编程语言&#xff0c;广泛应用于网页和服务器端开发。JavaScript 的核心特性之一是其原型继承机制&#xff0c;这是理解 JavaScript 对象模型的关键。 什么是 Prototype&#xff1f; 在 JavaScript 中&#xff0c;…...

Web Works API 和 Promise 的对比和区别

Web Workers 和 Promise 都是强大的工具&#xff0c;用于不同的异步处理场景。Web Workers 适用于需要并行处理的复杂任务&#xff0c;通过后台线程避免阻塞主线程。而 Promise 则简化了单线程中的异步操作管理&#xff0c;使代码更加清晰和结构化。根据具体需求选择合适的技术…...

jeecg快速启动(附带本地运行可用版本下载)

版本整理&#xff08;windows x64位&#xff09;&#xff1a; redis&#xff1a;3.0.504 MYSQL&#xff1a;5.7 Maven&#xff1a;3.9.4(setting文件可下载) Nodejs&#xff1a;v16.20.2&#xff08;建议不要安装默认路径下&#xff0c;如已安装在c盘&#xff0c;运行yarn报…...

【PPT教程】一键重置幻灯片背景的方法,新建幻灯片带默认背景

目的是替换18届的研电赛ppt背景为19届 这里写目录标题 1.设计->设置背景格式2.图片或纹理填充->插入3.选择需要替换为背景的照片4.点击下方的应用到全部 1.设计->设置背景格式 2.图片或纹理填充->插入 3.选择需要替换为背景的照片 4.点击下方的应用到全部 此时全部…...

云课堂哪个网站做的好/免费的舆情网站app

这次又给大家带来了 RxJS 的相关文章&#xff0c;本文将结合实际项目需求和示例来给大家讲解 RxJS 的优缺点和最佳实践。本文作者&#xff1a;阳羡⚠️注意啦&#xff1a;字节跳动春招开始了&#xff0c;大家ready了吗&#xff1f;欢迎大家找我内推&#xff0c;最快方式进入到部…...

asp做的手机网站/优化关键词软件

class Ticket implements Runnable {//1.描述票的数量private int tickets 100;//2.售票的动作,这个动作需要被多线程执行,那就是线程任务代码,需要定义run方法中//线程任务中通常都有循环结构public void run() {while (true) {if (tickets > 0) {System.out.println(Thre…...

wordpress typecho 大数据库/外包网站

Solr实现全文搜索SolrApache Solr特点搜索引擎搜索引擎组件搜索引擎工作流程分词技术中文分词算法基于字符串匹配基于统计及机器学习的分词方式IKAnalyzer部署Solr并安装IKAnalyzerSolr分析功能修改managed-schema配置业务系统字段复制配置到容器重启容器SpringBoot整合Solr创建…...

杭州网站设计的公司/百度推广最简单方法

背景 通过添加下列类&#xff0c;可以快捷的变换背景颜色&#xff0c;如果是链接的话&#xff0c;鼠标移动上去会变暗 bg-primary 被修饰元素将会应到primary类&#xff0c;显示吃淡蓝色&#xff0c;文本颜色会变成白色。bg-success 被修饰元素表示成功的信息&#xff0c;背景变…...

政府电子商务网站有哪些/seo知识点

此文中所提到的面试题是园子中Tony Qu兄弟翻译过来的&#xff0c;特此感谢NET牛人应该知道些什么&#xff1f; &#xff08;本答复不是标准答案&#xff0c;敬请兄弟们补充更正&#xff0c;不胜感激&#xff09; 任何一个使用.NET的人 1) 描述线程与进程的区别&#xff1f; 线程…...

wordpress文字幻灯片/成都高薪seo

Typescript 1.Typescript介绍 TypeScript 是由微软开发的一款开源的编程语言。 2、TypeScript 是Javascript 的超集&#xff0c;遵循最新的ES6、Es5 规范。TypeScript 扩展了JavaScript 的语法。 3、TypeScript 更像后端java、C#这样的面向对象语言&#xff0c;可以让js开发大…...