tag 标签: 高性能

相关博文
  • 2023-1-5 09:26
    0 个评论
    Redis企业云如何通过缓存轻松扩展到亿级请求?
    你是否在春运抢票过程中遇到12306 APP瘫痪? 你是否在双十一抢好物的时候显示系统繁忙? 你是否在微博刷某个爆了的娱乐新闻时显示页面走丢了? 前几天热搜上好像又说小红书又崩溃了? 当用户请求量过高,数据库无法支撑时,应用程序或软件就会从客户的界面“出逃”。出逃的结果是:用户丢失,对产品的技术能力产生不信任感。 如何扩展请求扼杀应用程序或软件界面的“出逃计划”?最好的方法是缓存! 印度科技公司Freshworks的数据库负载问题 对于任何一家企业而言,优质的服务才是客户成功的业务关键。 作为一家超过100亿美元估值的印度科技公司,Freshworks让“客户成功”变得简单! 自2010年成立以来,Freshworks已成为客户服务平台的领导者,其基于云的商业软件套件被全球超过150000家组织使用,包括松下、惠普、纽约大学和美国运通等。 在过去的10多年时间里,Freshworks的年增长率超过了50%,年度总收入早已超过了1亿美元。随着七款新产品的上市,这种非同凡响的增长速度正在使Freshwork的应用程序架构和开发运营能力变得紧张起来! 随着公司数据库负载的增长,其在性能扩展方面遇到了麻烦:Freshworks需要减轻其主数据库MySQL的负担,但当前的缓存解决方案(由Amazon ElastiCache提供的开源Redis)却产生了很多问题。 Freshworks的工程师Abhishek Dhulipudi表示:ElastiCach不支持实时迁移,如果我们想将数据从一个实例迁移到另一个实例,则需要数周的人工操作以避免停机,这种限制会减慢我们的产品开发生命周期。 Freshworks选择Redis企业云缓存解决方案 在评估了Aerospike和Hazelcast等多个NoSQL内存数据库后,Freshworks决定继续使用具有极高性能和灵活性的Redis。最终,该公司选择了Redis企业云( Redis Enterprise Cloud )来替换性能不佳的Amazon ElastiCache缓存解决方案。 Redis企业云(Redis Enterprise Cloud):唯一的实时多云数据层,完全托管的无服务器云数据库服务 【功能】 将Redis用作一体化数据库和缓存数据库 存储和搜索具有复杂关系的JSON文档 启用实时分析、流式传输和微服务将 获得即时故障转移和备份恢复 同时写入多个地理位置分布式主数据库 安全且经济高效地存储TB级数据 【优势】 灵活部署:部署在任何云、混合或多云架构上 内置耐用性:主分片和副本分片上多个持久性选项 大规模性能:小于1ms的数据库响应时间,每秒支持数百万次操作 低延迟:基于CRDT的 Active-Active 部署维护亚毫秒级数据 成本效益:使用Redis on Flash节省高达 70% 的基础架构成本 Freshworks的工程总监 Naren Janakiraman 说:Redis企业云提供了非常好的服务,我们可以使用市场上最高的内存性能和灵活的数据结构以在各种用例中实现极高的效率,这种完全托管的操作还可以加快应用程序交付。 除了使用 Redis企业版数据库(Redis Enterprise)作为其MySQL数据库的前端缓存之外,Freshworks还将Redis Enterprise用于如下几个方面: - 计量 :出于限速目的,Freshworks 使用 Redis Enterprise Cloud 高度优化的Hash、List和 Sorted Sets 数据结构和内置命令来计量进入Freshdesk的API请求。 - 数据持久存储 :Freshworks使用Redis Enterprise Cloud作为后台作业的持久存储,存储在磁盘中。 - 身份验证微服务-会话存储 :随着Freshworks过渡到微服务,它开始将关键工作负载从其单一的Ruby on Rails Web应用程序框架中分离出来,身份验证则是首批微服务之一。身份验证微服务可以使用Redis Enterprise Cloud作为会话存储。 - 实时分析 :Freshworks利用Redis Enterprise Cloud的强大数据结构(包括HyperLogLog、位图和集合)作为用户分析的前端数据库。 Freshworks的工程师 Dhulipudi表示:进入Freshdesk的每个请求都会以某种方式触及Redis Enterprise Cloud,通过将几个关键数据库功能卸载到Redis Enterprise Cloud,我们能够减少 MySQL数据库实例的数量,同时显著提高应用程序响应时间和扩展能力。 Redis Enterprise帮助Freshworks的业务软件保持高水平性能 作为一个完全托管的数据库即服务产品,Redis企业云的操作非常简单,其自动扩展、故障转移、集群创建、持久性和高可用性是也成为了Freshworks软件产品的巨大卖点。 Janakiraman说: Freshworks有67项服务都在使用 Redis Enterprise Cloud 。如果没有它的无缝功能和自动化功能,我们将会在基础设施和运营管理上投入非常多的资金。Redis Enterprise Cloud的Redis on flash技术将常用的数据放到内存,不常用的数据放到SSD(固态硬盘),这样既可以提高处理速度,又可以节约成本,不仅帮助我们的团队专注于创新和业务增长,还扩展了我们的产品组合并将业务服务发展到新的地区。 Freshworks非常看好Redis Enterprise的技术能力,它认为 Redis Enterprise Cloud的作用正在扩大,在未来能够承担更大的工作负载。Dhulipudi说:借助Redis企业云,我们将实施更多创造性的缓存、持久数据存储、微服务和用户分析用例,使我们的业务软件在行业内保持最高水平的性能。 想要了解更多Redis企业版数据库缓存解决方案,欢迎评论交流!
  • 热度 47
    2015-2-5 19:55
    6205 次阅读|
    20 个评论
        在生活中,我们常常需要用到移动电源,但是不幸的是,市场上大多数移动电源质量较差,虚标严重,有的还存在安全隐患,因此,自己制作一个高品质、高效率、不虚标而又安全的移动电源成为当务之急。     目前淘宝等网站上有大量移动电源的DIY套件,通过这些套件,我们可以很方便的制作一个移动电源,但是,这些移动电源的套件同样质量低劣,电池虚标,没有什么实质性的改善,要真正得到一个优质的移动电源,我们需要从头开始设计,自己制板、焊接、安装。当然,如果你嫌麻烦的话,那么我还是建议你去买淘宝的套件,不用再继续看本文了。     言归正传,要从最基本的步骤开始,我们就必须知道移动电源的基本原理。最简单的移动电源只有3个部分:充电、保护、输出。充电部分负责将充电器的电压转换成电池可以接受的电压;保护部分用于防止电池的过充、过放、过流及短路等;输出部分负责将电池的电压转换成受电设备(主要是手机、平板等)可以接受的电压。     在开始设计之前,我们要大致进行一个规划:我们需要一个多大容量的移动电源,这么大容量的移动电源有多重,还有需要多少个输出,每个输出最大需要多少电流等等。首先,我们要选择电池。常见的可充电电池有镍氢、镍镉、铅酸、锂离子、聚合物锂电池等,目前,镍氢和镍镉已基本淘汰,铅酸电池电压太高且重,不适合移动电源,锂离子和聚合物锂电池是常见的选择。目前,我们买到的商品移动电源一般使用的是锂离子电池,也就是我们常说的18650电池。这种电池非常便宜,而且方便量产,但是其质量和寿命较差。我们的目的是要一个高品质的移动电源,所以当然不能用这种电池,那么就只剩下一种了:聚合物锂电池。这种电池也是我们手机中常常使用的电池,相比于锂离子电池,它的容量、寿命、输出功率和安全性都较高,我们在选择电池的时候一定要选择这种电池。目前,聚合物电池的正极材料有很多种,其中比较好的一种是叫锂镍钴锰(又叫三元)的材料,容量可以根据自己的需要选择。在选择电池的时候,我们还要注意一点,就是电池的最大持续放电电流,一般用C来做单位,对于一个1000mAH的电池来说,1C就表示这个电池的最大放电电流是1000mA。我们要确保所选的电池的最大持续放电电流大于我们需要的输出电流的2倍(要有一定裕度),建议选择动力电池(就是电动车、汽车上面用的那种),不但输出电流大,而且内阻小,效率更高。     选择了电池之后,我们就需要设计保护电路了。一般的移动电源都有不止一块电池,这些电池一般都是并联的,容量和最大输出电流等于所有电池之和,电压不变。当然,串联也是可以的,但是要用不同的方案。本文下面所说的都是电池并联的方案。对于并联的电池,本质上和单节电池没有差别,无非是容量和输出电流大了一些,所以我们仍然是使用单节电池的方案。保护电路,必须要使用成熟的方案,推荐使用DW01+FS8205A的方案,其电路图如下:     图中的BAT和BAT-分别接电池的正极和负极,GND是电路的地。当短路等情况发生时,DW01会关闭MOS管,将电池负极和地断开。注意,正常情况下,图中的R5应该接在CS脚和地之间,这里考虑到输出电流较大,可能触发过流保护,所以接在了D12上,这个引脚是2个MOS管之间,所以保护电流增加了一倍。     设计完保护电路,就该设计充电电路了。由于充电时并不需要特别在意电路的转换效率,所以我们可以使用一些低成本、高可靠性的方案,如TP4056。电路图如下:     充电器的5V电压经过一个SS34肖特基二极管再输入到芯片的电源引脚,这样可以分担一部分芯片的热量,变相加快充电速度。通过更改电阻R1的大小可以更改充电速度,具体请查看芯片手册,这里的电阻对应的充电电流是1A。红灯D2和绿灯D3分别用于指示正在充电和充电完成。BAT直接连接到电池正极。该芯片是线性充电芯片,其原理是将多余的电能转换为热能耗散掉,所以充电过程中会产生大量的热量,建议安装的时候加装一个散热片,防止因过热保护而降低充电速度。     最后就是核心部分:输出电路。它是一个BOOST结构的DC-DC升压电路,该电路的方案很多,作为一个移动电源,最主要考虑的因素是效率,因此最好采用同步升压芯片(同步升压资料较多,请自行百度,本文不做介绍)。这里推荐使用TI的TPS61032,集成了MOS管和反馈,电路简单可靠,可以达到最大3A的输出,且1A负载时效率可达92%(一般我们买到的移动电源效率在80%左右)。详细电路如下图所示:     电路的左半边是升压部分,其中,R40和D20构成负载指示电路(负载越大,灯越亮),R9和R10用于设定低压警告门限,这里是3V(LBI引脚电压为0.5V时对应的电池电压),当电池电压低于该值时,LBO引脚接地,点亮D9。电路的右半边是识别电阻,如果要为苹果设备充电,则R16和R17一般不接任何器件,成开路,R12-R15按图中标示的电阻连接,那么苹果设备将把该输出口当成ipad充电器的输出口;如果要给其他手机充电,可以按对应的识别电阻电路进行修改(具体手机的识别电阻请百度,已知三星部分机型和苹果的识别电阻不兼容)。经实测,ipad的识别电阻可以用于绝大多数的手机和平板。     电路设计完了,接下来就是画PCB板和焊接了。这两步推荐有相关知识的人做,因为电路板的设计和焊接需要一定的经验和技术,本文就不过多介绍了。非相关专业人士可以淘宝购买上述三个模块(输出部分一定要加上“TPS61032”才能确保是该芯片)和电池,进行简单的焊接和安装,就可以完成一个移动电源了。       下面说下人们对移动电源的几个误区,如果你打算制作或购买移动电源,请务必注意: 1、18650电池使用最多,所以这种电池寿命长、质量好。前面已经说过,18650是锂离子电池,主要是用于手电筒等产品上的,他的使用寿命(以完全充放电次数计)不如聚合物锂电池,性能也是比不上锂电池的,之所以使用得多是因为它便宜。 2、我们经常在某宝上看到什么什么20000毫安时移动电源仅69或仅89等信息,其实都是扯淡的。一般移动电源都是使用的18650电池,该电池长65毫米,直径18毫米,其标称容量一般来说国产的2000毫安时,进口的最大不超过3000毫安时,价格上国产的15一节,大家可以直接根据移动电源的大小估算一下用了几块电池,容量和价格是多少。我拆过很多标称20000毫安时的移动电源,里面就是6节18650电池,算上国产电池本身的虚标,实际容量也就12000毫安时左右,成本光电池就要90,加上电路和其他成本也快100了,就算量产成本低,考虑到商家一般有50%左右的利润,价格也不会低到69、89。那么卖这么低的价格就只有一种可能:用的旧电池或很差的电池……我见过标称20000毫安时的移动电源用1A的充电器从没电开始充,6小时就充满了…… 3、1A的手机要用1A的充电口充电,否则会充爆。这是我见过的最搞笑的结论了,不知道是哪位大神得出的。无论我们用什么给手机充电,手机在本质上就相当于一个电阻,或者是一个可变电阻,只要你的电压是一定的,电流就是一定的。比如你的手机配的充电器是5V1A的,那么你的手机在充电的时候就相当于一个5欧的电阻,只要充电电压是5V,充电电流就是1A,跟输出电路的额定电流没有任何关系,这个额定电流只是这个输出电路的最大输出电流!也就是说,我们可以用输出电流为2A的充电器给1A的手机充电,这个时候,实际的电流只有1A;我们也可以用1A的充电器给2A的手机充电,这个时候,虽然手机相当于一个2.5欧的电阻,但是由于输出电路的最大电流只有1A,所以电路中的实际电流仍然为1A,注意,这种情况下的输出电压会小于5V。现在市场上很多移动电源都做了2个口,一个1A,一个2.1A,其实都是欺骗消费者的,我拆过很多这种移动电源,里面的电路完全一样,没有任何差别。还有一些移动电源说什么自适应(更有甚者说什么智能识别)输出,都是扯淡的,跟一般电路没有差别,普通的输出本来就具有这种“自适应”的特点。 4、智能检测、智能运算什么的……这些都是欺骗消费者的。一个移动电源需要4核芯片么?数显的那种一个几毛钱的单片机就搞定了。自动匹配充电电流?搞笑吧,充电电流本来就是自适应的。智能识别充电设备?要通过USB识别充电设备要加USB芯片的,那可不便宜,也没有必要,你觉得有那个厂家会加这个芯片吗?自动学习电量电流检测?不就是2个AD吗,而且10位的AD足够,一般几毛钱的单片机都会集成这玩意,加个屏幕就是所谓的“智能数显”了。 5、快速充电技术。这个也比较扯,要想充1分钟用10分钟,那你充电的速度必须是用电速度的10倍,假如用电设备是1A的,那么充电电流就要是10A,现在手机平板的充电器撑死也不会超过3A,快速充电一说从何而来? 6、智能锁电技术。这个技术就是你不用的时候就进入休眠模式,实际上没什么用。普通的移动电源,充电芯片在没有输入的时候就是休眠模式,输出芯片在空载的时候功耗也是很小的,根本不需要再加个单片机控制。很多说什么智能技术的,实际上里面什么都没有。 7、移动电源边充边用会损坏电池。根本没这回事。通过前面的介绍大家应该知道,在充电的时候,充电电路将输入的能量存入电池中;输出的时候,输出电路将电池中的能量传输给用电器。如果边充边用,当充电速度大于用电速度时,,多余的电能就储存在电池中,当充电速度小于用电速度时,不够的电就从电池里面取。打个比方,一个水池,有一个注水口和一个放水口,注水口就相当于充电电路,放水口就相当于输出电路,水池里面的水就相当于电池中储存的电量,你说能不能同时注水和放水呢? 8、软件控制比硬件控制好。不知道什么时候开始,某宝上有卖软件实现的移动电源,其实说白了就是把原来DC-DC的反馈和PWM波调制的部分用单片机的软件来实现了,这样可以同时做数显等“高端”功能,为了宣传,商家就说软件控制比硬件好。稍微有点电脑常识的人都知道视频的软件解码速度是远远比不上硬件解码速度的,硬件电路里面可能一个周期就调控好的东西,软件要几个甚至几十个周期才能调整,因此,软件的性能和稳定性都是不如硬件的,千万不要被JS给忽悠了。     …………移动电源的误区还有很多,篇幅所限,就不一一叙述了,总之一点,不要被JS的花言巧语所忽悠,自己分析一下某个功能有没有必要,实现起来成本多少,往往就能得出结论。     由于本人水平有限,本文难免有疏漏之处,望高手批评指正,如果对移动电源的制作方法或相关内容有疑问或更好的方案,请加本人QQ:409337874,注明:移动电源。欢迎各位与我一起讨论移动电源相关内容。
  • 热度 28
    2013-7-8 13:44
    2206 次阅读|
    0 个评论
    虽然模拟与混合信号器件在本质上与数字器件有着很大的不同,但两者的趋势是一致的,都在向更高的速度和性能方向发展。其主要推动力是人们对更高的精度、线性度以及更小失真度的追求。同时,市场也在寻求功耗更低且封装更小的产品。相较于分立器件,集成器件在尺寸、功耗、性能和设计便利性、可靠性、安全性以及成本方面都有优势,这类器件在工业、无线通信、消费电子、医疗、能源、金融、汽车和通信基础架构等市场中的应用越来越广泛。 ADI 高度集成的数字 X 射线模拟前端 (AFE)ADAS1256 ,在多种功耗模式选项下都具有极佳的噪声性能以及极高的图像质量。这款 256 通道的 ADAS1256 数字 X 射线 AFE 是业界首款单芯片解决方案,通过集成低噪声可编程电荷放大器、相关双采样电路和 16 位模数转换器 (ADC) ,可提供完整的电荷至数字转换信号链。在 2 微微库仑满量程时, 560 个电子的等效电荷具有低噪声系数,因此 ADAS1256 可提供高分辨率的数字 X 射线图像,同时降低病患所受 X 射线的照射量。 ADAS1256 具有每通道 1 mW~3 mW 的多功能功耗模式,允许制造商使用多种数字 X 射线成像手段,包括便携式放射和乳房 X 线照相术以及高速透视和心脏成像。 Maxim Integrated 的业内首款完全集成的 RTD 数字转换器,单芯片可替代多个分立元件,将系统成本降低 50% 。 MAX31865 能够简便、准确地测量温度 —— 这一工业领域最常见的物理量,是测量和过程控制的理想选择。 MAX31865 能够简单轻松地处理工业设计中常见的铂 RTD ( 如 Pt100 或 Pt1000) 电阻数字转换问题,提供 ±50V 输入过压保护,检测传感器和电缆故障。此外,器件无需传统设计中 3 线传感器连接所需的精密匹配电流源,大大简化了电阻测量。内置过压保护 (OVP) 省去了外部保护电路,从而有效降低成本、减小电路板空间、延长设备正常运行时间。 Freescale 的 MC33813 是一个单缸摩托车和其他小型发动机控制应用的引擎控制模拟芯片。它包括五个集成的低侧驱动器,两个预驱动器,可变磁阻传感器( VRS )输入电路,电压预稳压器(可以使用外部晶体管),两个 5.0 伏的内部稳压器(一个用于给微控制器单元供电( VCC 电源), 另一个用作受保护的传感器电源)。还包括 MCU 复位控制电路,看门狗, ISO 9141 K 线诊断通信接口和串行外设接口( SPI )。其中五个底边驱动用来驱动一个喷油嘴,一个指示灯,两个继电器或其他负载,还有一个转速计。预驱动器用于驱动 IGBT 或 MOSFET ,晶体管来控制点火线圈 /HEGO 加热器。该器件采用 48 引脚裸露焊盘 LQFP-EP 。应用范围包括:割草机、小摩托车、吹雪机,以及各种发电机等。 Lantiq VDSL 芯片组系列 XWAY VRX300 具有高集成度和高性能。基于该全新芯片组设计的网关能达到 200 Mbits (采用两对双绞线绑定技术)和高达 150 Mbits (采用系统级串扰消除的 vectoring 技术)的数据传输速率,并同时支持一系列家庭联网功能,包括内置的 WLAN ( Wi-Fi )、千兆以太网口和 VoIP 等。新的 VDSL 芯片组为宽带设备供应商生产路由器和网关提供了灵活性,它们以比其他可用芯片组更少的元器件来支持先进的运营商服务。同一款用户端设备( CPE )的硬件设计可支持所有 ITU-T 标准的频段规划(包括 8 、 12 、 17 和 30MHz 配置文件),系统也可以针对尽可能广泛的用户端网络功能进行设计。
  • 热度 18
    2011-6-15 10:25
    1484 次阅读|
    0 个评论
    日前吉时利仪器公司宣布,推出名为《低成本、高性能源测试解决方案》在线指南,通过访问吉时利网站http://www.keithley.com/pr/090可进行免费下载。                                              图片: http://www.ggcomm.com/KEI/eguides/SMU_eguide.jpg   吉时利《低成本、高性能源测试解决方案》在线指南为大家提供使用源测试单元(SMU)过程中的多种应用笔记、教程信息,如高功率高亮度LED测试、太阳能电池特性、高电阻测定。源测试单元(SMU)兼具多种仪器的性能,包括直流电压、电流源及数字万用表(DMM),其他型号则具有脉冲发生器及测试测量性能。便利的选择器指南可帮助用户选取最适合的源测试单元(SMU)以满足他们的应用需求。同时,在线指南对吉时利源测试单元(SMU)系列产品的性能、优势进行了详尽阐释,形式包括数据手册、应用笔记、应用摘要及在线展示: 2651A型高功率系统源表 ® 仪器 2600A系列系统源表仪器 2400系列源表仪器 6430型Sub-Femtoamp远程源表仪器 237型高电压源测试单元 详情请见: 访问http://www.keithley.com/pr/090免费下载《低成本、高性能源测试解决方案》,更多详情请访问 吉时利网站www.keithley.com                                                     Keithley Publishes E-Guide About High Performance Source-Measure Solutions CLEVELAND, Ohio – June 8, 2011 – Keithley Instruments, Inc., a world leader in advanced electrical test instruments and systems, has published an informative e-guide titled “Cost-effective, high performance sourcing and measurement solutions.” A free copy is downloadable upon request from Keithley at: http://www.keithley.com/pr/090. The e-guide offers a wide variety of application notes and tutorial information on using Source-Measure Units (SMU) in applications such as high power, high brightness LED test, solar cell characterization, and high resistance measurements. SMUs combine the capabilities of a number of instruments, including DC voltage and current sources and a digital multimeter (DMM). Other models add pulse generator and measurement capabilities. A convenient selector guide helps readers identify the most appropriate SMUs for their applications. The e-guide also provides a detailed overview of the features and advantages of each of Keithley’s Source-Measure Unit (SMU) families, including links to data sheets, application notes, application briefs, and online demos: Model 2651A High Power System SourceMeter ® instrument Series 2600A System SourceMeter instruments Series 2400 SourceMeter instruments Model 6430 Sub-Femtoamp Remote SourceMeter instrument Model 237 High Voltage Source-Measure Unit   For More Information To download a free copy of “Cost-effective, high performance sourcing and measurement solutions from Keithley,” visit: http://www.keithley.com/pr/090. To learn more about Keithley, contact the company at: www.keithley.com
  • 热度 20
    2011-6-15 10:21
    1293 次阅读|
    0 个评论
    日前吉时利仪器公司宣布,推出名为《低成本、高性能源测试解决方案》在线指南,通过访问吉时利网站http://www.keithley.com/pr/090可进行免费下载。 图片下载: http://www.ggcomm.com/KEI/eguides/SMU_eguide.jpg 吉时利《低成本、高性能源测试解决方案》在线指南为大家提供使用源测试单元(SMU)过程中的多种应用笔记、教程信息,如高功率高亮度LED测试、太阳能电池特性、高电阻测定。源测试单元(SMU)兼具多种仪器的性能,包括直流电压、电流源及数字万用表(DMM),其他型号则具有脉冲发生器及测试测量性能。便利的选择器指南可帮助用户选取最适合的源测试单元(SMU)以满足他们的应用需求。同时,在线指南对吉时利源测试单元(SMU)系列产品的性能、优势进行了详尽阐释,形式包括数据手册、应用笔记、应用摘要及在线展示: 2651A型高功率系统源表 ® 仪器 2600A系列系统源表仪器 2400系列源表仪器 6430型Sub-Femtoamp远程源表仪器 237型高电压源测试单元 详情请见: 访问http://www.keithley.com/pr/090免费下载《低成本、高性能源测试解决方案》,更多详情请访问 吉时利网站www.keithley.com   Keithley Publishes E-Guide About High Performance Source-Measure Solutions CLEVELAND, Ohio – June 8, 2011 – Keithley Instruments, Inc., a world leader in advanced electrical test instruments and systems, has published an informative e-guide titled “Cost-effective, high performance sourcing and measurement solutions.” A free copy is downloadable upon request from Keithley at: http://www.keithley.com/pr/090. The e-guide offers a wide variety of application notes and tutorial information on using Source-Measure Units (SMU) in applications such as high power, high brightness LED test, solar cell characterization, and high resistance measurements. SMUs combine the capabilities of a number of instruments, including DC voltage and current sources and a digital multimeter (DMM). Other models add pulse generator and measurement capabilities. A convenient selector guide helps readers identify the most appropriate SMUs for their applications. The e-guide also provides a detailed overview of the features and advantages of each of Keithley’s Source-Measure Unit (SMU) families, including links to data sheets, application notes, application briefs, and online demos: Model 2651A High Power System SourceMeter ® instrument Series 2600A System SourceMeter instruments Series 2400 SourceMeter instruments Model 6430 Sub-Femtoamp Remote SourceMeter instrument Model 237 High Voltage Source-Measure Unit   For More Information To download a free copy of “Cost-effective, high performance sourcing and measurement solutions from Keithley,” visit: http://www.keithley.com/pr/090. To learn more about Keithley, contact the company at: www.keithley.com
相关资源
  • 所需E币: 0
    时间: 2024-4-8 15:32
    大小: 2.64KB
    一、什么是WebRTCWebRTC(WebReal-TimeCommunications)是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC包含的这些标准使用户在无需安装任何插件或者第三方的软件的情况下,创建点对点(Peer-to-Peer)的数据分享和电话会议成为可能。WebRTC只是一个媒体引擎,上面有一个JavaScriptAPI,所以每个人都知道如何使用它(尽管浏览器实现仍然各不相同),本文对WebRTC(网页实时通信)的相关内容进行简要介绍。二、WebRTC简介WebRTC,名称源自网页实时通信(WebReal-TimeCommunication)的缩写,是一个支持网页浏览器进行实时语音通话或视频聊天的技术,是谷歌2010年以6820万美元收购GlobalIPSolutions公司而获得的一项技术。WebRTC提供了实时音视频的核心技术,包括音视频的采集、编解码、网络传输、显示等功能,并且还支持跨平台:windows,linux,mac,android。虽然WebRTC的目标是实现跨平台的Web端实时音视频通讯,但因为核心层代码的Native、高品质和内聚性,开发者很容易进行除Web平台外的移殖和应用。很长一段时间内WebRTC是业界能免费得到的唯一高品质实时音视频通讯技术。1、webrtc是什么浏览器为音视频获取传输提供的接口2、webrtc可以做什么浏览器端到端的进行音视频聊天、直播、内容传输3、数据传输需要些什么IP、端口、协议客户端、服务端三、如何使用WebRTCWebRTC易于使用,只需极少步骤便可建立媒体会话。有些消息在浏览器和服务器之间流动,有些则直接在两个浏览器(成为对等端)之间流动。建立WebRTC会话建立WebRTC连接需要如下几个步骤:获取本地媒体(getUserMedia(),MediaStreamAPI)在浏览器和对等端(其它浏览器或终端)之间建立对等连接(RTCPeerConnectionAPI)将媒体和数据通道关联至该连接交换会话描述(RTCSessionDescription)四、面向网络的实时通信借助WebRTC,您可以为应用添加基于开放标准运行的实时通信功能。它支持在对等设备之间发送视频、语音和通用数据,使开发者能够构建强大的语音和视频通信解决方案。这项技术适用于所有现代浏览器以及所有主要平台的原生客户端。WebRTC采用的技术是开放网络标准,以常规JavaScriptAPI的形式在所有主流浏览器中提供。对于原生客户端(例如Android和iOS应用),可以使用具备相同功能的库。WebRTC项目属于开源项目,受Apple、Google、Microsoft和Mozilla等公司支持。五、WebRTC使用入门WebRTC标准概括介绍了两种不同的技术:媒体捕获设备和点对点连接。媒体捕获设备包括摄像机和麦克风,还包括屏幕捕获设备。对于摄像头和麦克风,我们使用navigator.mediaDevices.getUserMedia()来捕获MediaStreams。对于屏幕录制,我们改为使用navigator.mediaDevices.getDisplayMedia()。点对点连接由RTCPeerConnection接口处理。这是在WebRTC中两个对等方之间建立和控制连接的中心点。六、使用WebRTC协议进行音视频通信的步骤如下:1、获取本地媒体流:使用navigator.mediaDevices.getUserMedia方法获取本地摄像头或麦克风的媒体流。2、创建PeerConnection:使用newRTCPeerConnection(configuration)方法创建一个PeerConnection实例,其中configuration是PeerConnection的配置参数,例如STUN/TURN服务器地址等。3、添加ICECandidate:通过监听icecandidate事件获取到本地的ICECandidate,然后使用addIceCandidate方法将其添加到PeerConnection中。4、发送SDP:通过createOffer或者createAnswer方法生成本地的SDP(SessionDescriptionProtocol),并使用setLocalDescription方法设置到PeerConnection中5、接收SDP:通过信令服务器将远端的SDP发送给本地,然后使用setRemoteDescription方法设置到PeerConnection中。6、媒体流交换:当PeerConnection连接成功后,可以通过addTrack或者addStream方法将本地的媒体流添加到PeerConnection中,并且通过监听ontrack事件获取到远端的媒体流。7、关闭连接:使用close方法关闭PeerConnection。这些步骤可以使用WebRTC库来简化实现。在实际应用中,还需要考虑网络环境、协议版本兼容性、安全问题等因素。
  • 所需E币: 0
    时间: 2024-3-22 11:17
    大小: 2.63KB
    上传者: 开心就很好了
    SpringBoot一直是开发者比较青睐的一款轻量级框架,他不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。现在很多Java系的软件开发都是基于SpringBoot的,这就要求开发人员都要掌握基于SpringBoot的开发。由于SpringBoot体系非常庞大,导致很多人并不能完全掌握如何使用,尤其是涉及分布式相关的开发时,如何和其他框架整合更是让很多程序员无从下手。在此,我给大家整理了几个优质SpringBoot开源项目给大家参考,希望能够帮助到正在学习SpringBoot的小伙伴!小伙伴简历中不知道写什么项目的或者项目没有亮点的,我只能帮你们到这了!随着技术框架的不断更新,一些公司摒弃了原先的技术框架模式。而springboot慢慢取代了原有的ssm框架开发。为什么选择springboot呢?配置简单不需要编写太多的xml;基于spring构建,容易上手;独立运行不依赖于容器;内置服务器tomcat不需要打war包;提供maven极简配置;对于各种框架有很好的集成;为SpringCloud微服务奠定基础,使微服务构建变得简单;下面让我们使用idea一起搭建完整版的SpringBoot项目:首先,确定项目结构现在后端开发都是基于springboot的web项目,web项目一般都是使用MVC的模式,所以这里也采用类似的模式。在项目maven结构组成上,采用父子项目,也就是一个主项目下有多个子module,分为下面几个,p-admin   p-web--》负责项目启动   p-facade --》控制层,写controller   p-service--》服务层,具体的业务处理   p-dao--》持久化层,负责和数据库打交道   p-common--》公共层,util类\入参、出参等   p-api--》提供给第三方的接口大体的项目结构给出来了,下面看子项目间的依赖关系哈,  p-web依赖于p-service、p-common  p-service依赖于p-dao、p-common  p-api依赖于p-common其他的依赖第三方的库暂时不看,下面再说。接下来就可以进行实际操作创建项目了。接着,创建项目创建父项目(p-admin)这里使用maven的父子项目结构,父项目是这样创建的,在idea中file-->new-->project出现下面的界面,直接next就好一、mallmall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。二、Cloud-Platform(微服务的)Cloud-Platform是国内首个基于SpringCloud微服务化开发平台,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API管理等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,适合学习和直接项目中使用。核心技术采用SpringBoot2.1.2以及SpringCloud(Greenwich.RELEASE)相关核心组件,采用Nacos注册和配置中心,集成流量卫兵Sentinel,前端采用vue-element-admin组件。三、微人事微人事是一个前后端分离的人力资源管理系统,项目采用SpringBoot+Vue开发,项目加入常见的企业级应用所涉及到的技术点,例如Redis、RabbitMQ等。后端技术栈:SpringBoot、SpringSecurity、MyBatis、MySQL、Redis、RabbitMQ、SpringCache、WebSocket前端技术栈Vue、ElementUI、axios、vue-router、Vuex、WebSocket、vue-cli4四、web-flashweb-flash是一个基于SpringBoot和Vue.js的web系统,包含了基于element搭建的后台管理系统和基于vux搭建的手机端h5站点web-flash具备后台管理类系统的通用的基础功能,而且提供了基于ideaintellij的的代码生成插件,可以一键生成前后端页面。核心框架:SpringBoot数据库层:Springdatajpa数据库连接池:Druid缓存:Ehcache前端:基于Vue.js的Element(后端)和vux(手机端)工作流:activiti
  • 所需E币: 0
    时间: 2024-3-22 14:24
    大小: 1.99KB
    Spring能做什么Spring具有哪些能力呢?这点在Spring的官网上有比较详情的描述,我们可以在Spring的项目里看到Spring的生态涵盖了web开发、数据访问、安全控制、分布式、消息服务、移动开发、批处理等等SpringBoot优点SpringBoot的优点我可以在https://spring.io/projects/spring-boot这里看到,下面我把优点复制过来了如下:●Createstand-aloneSpringapplications○创建独立Spring应用●EmbedTomcat,JettyorUndertowdirectly(noneedtodeployWARfiles)○内嵌web服务器●Provideopinionated‘starter’dependenciestosimplifyyourbuildconfiguration○自动starter依赖,简化构建配置●AutomaticallyconfigureSpringand3rdpartylibrarieswheneverpossible○自动配置Spring以及第三方功能●Provideproduction-readyfeaturessuchasmetrics,healthchecks,andexternalizedconfiguration○提供生产级别的监控、健康检查及外部化配置●AbsolutelynocodegenerationandnorequirementforXMLconfiguration○无代码生成、无需编写XMLSpringBoot是整合Spring技术栈的一站式框架SpringBoot是简化Spring技术栈的快速开发脚手架在SpringBoot项目中,正常来说是不存在XML配置,这是因为SpringBoot不推荐使用XML,注意,排不支持,SpringBoot推荐开发者使用Java配置来搭建框架,SpringBoot中,大量的自动化配置都是通过Java配置来实现的,这一套实现方案,我们也可以自己做,即自己也可以使用纯Java来搭建一个SSM环境,即在项目中,不存在任何XML配置,包括web.xml。下面我们开始代码实战:创建maven工程引入依赖<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>2.3.4.RELEASE</version>  </parent>  <dependencies>    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-web</artifactId>    </dependency>  </dependencies>创建主程序/** *主程序类 *@SpringBootApplication:这是一个SpringBoot应用 */@SpringBootApplicationpublicclassMainApplication{  publicstaticvoidmain(String[]args){    SpringApplication.run(MainApplication.class,args);  }}启动类,启动就可以了packagecom.urthink.upfs.springbootdemo; importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplicationpublicclassSpringBootDemoApplication{   publicstaticvoidmain(String[]args){    SpringApplication.run(SpringBootDemoApplication.class,args);  } }我们将这个依赖拷贝到我们自己的项目pom文件里,粘贴后的pom文件如下<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.atguigu</groupId>  <artifactId>boot-01-helloworld</artifactId>  <version>1.0-SNAPSHOT</version>  <parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>2.3.4.RELEASE</version>  </parent><dependencies>    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-web</artifactId>    </dependency>  </dependencies></project>
  • 所需E币: 5
    时间: 2024-2-7 13:19
    大小: 3.18MB
    上传者: 丙丁先生
    HPMicro高性能MCUHPMSDK使用指南_V1_0.pdf
  • 所需E币: 0
    时间: 2024-1-2 13:49
    大小: 2.95KB
    上传者: 开心就很好了
    今天给大家讲讲关于OpenGL的知识,以及结合OpenGL自主高性能三维GIS平台架构与实现的全流程。我将从2D->2.5D->3D立体球,全程零代码到完全实现,带着大家一步步学习。首先,我们先来看看什么是OpenGL?OpenGL(英语:OpenGraphicsLibrary,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。OpenGLES(OpenGLforEmbeddedSystems)是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口。如果用一句话来描述OpenGL的话,我想应该是基于C/S结构设计的模板模式(设计模式里的那个);在图形渲染管线这节,主要介绍的是其模板设计,在OpenGL里我们称之为PipeLine;在C/S结构这节,则介绍OpenGLC/S结构给OpenGL带来的一些对于初学者看起来可能觉得奇奇怪怪的东西。我们知道,automapper的映射是基于语法糖和语法约定的,他会自动映射两个对象中名字相同的字断,而默认情况下,找不到匹配的字断将会被忽略,使用null,使用空来代替。除了使用automapper的自动映射,我们也可以手动添加映射关系。比如,dto中的价格,相当于模型中原价乘以折扣,我们可以把这个计算过程放在automapper中进行,对这样的映射过程有一个专有名词,叫做投影,projection。投影是个数学概念,所谓投影,就是把资源对象中的某一个或几个数据,进过一定的变化和计算,然后传递给目标对象。在autompeer中,我们可以使用ForMember函数做字断的投影。publicTouristRouteProfile(){CreateMap<TouristRoute,TouristRouteDto>().ForMember(dest=>dest.Price,opt=>opt.MapFrom(src=>src.OriginalPrice*(decimal)(src.DiscountPresent??1))).ForMember(dest=>dest.TravelDays,opt=>opt.MapFrom(src=>src.TravelDays.ToString())).ForMember(dest=>dest.TripType,opt=>opt.MapFrom(src=>src.TripType.ToString())).ForMember(dest=>dest.DepartureCity,opt=>opt.MapFrom(src=>src.DepartureCity.ToString()));}这次ValidationContext所访问的不再是属性级别的数据,而是class类级别的数据,然后再通过class来访问属性。所以如果我们想访问TouristRouteForCreationDto的话,代码可以这么写,本地变量vartouristRoute等于validationContext点ObjectInstance,因为这个时候获取的数据类型是普通的对象,所以我们还需要进行类型转换,(),把它转化为“(TouristRouteForCreationDto)”,当然,我们还需要引入dto的命名空间。publicclassTouristRouteTitleMustBeDifferentFromDescriptionAttribute:ValidationAttribute{  protectedoverrideValidationResultIsValid(    objectvalue,     ValidationContextvalidationContext  )  {    vartouristRouteDto=(TouristRouteForCreationDto)validationContext.ObjectInstance;    if(touristRouteDto.Title==touristRouteDto.Description)    {      returnnewValidationResult(        "路线名称必须与路线描述不同",        new[]{"TouristRouteForCreationDto"}      );    }    returnValidationResult.Success;  }}拿到用户数据,我们就可以开始配置jwt数据了,首先,在claims数组中,把假数据替换为真数据。接着,继续使用userManager来获得用户的角色的字符串。//3.添加用户varadminUserId="90184155-dee0-40c9-bb1e-b5ed07afc04e";ApplicationUseradminUser=newApplicationUser{  Id=adminUserId,  UserName="admin@fakexiecheng.com",  NormalizedUserName="admin@fakexiecheng.com".ToUpper(),  Email="admin@fakexiecheng.com",  NormalizedEmail="admin@fakexiecheng.com".ToUpper(),  TwoFactorEnabled=false,  EmailConfirmed=true,  PhoneNumber="123456789",  PhoneNumberConfirmed=false};那这种C/S结构对于我们使用OpenGL有什么影响呢?最大的影响就是在于我们只能在OpenGLcontext所在的线程调用OpenGL的接口,详细阅读EGL标准你会知道所有OpenGL接口都存在一个阴式的入参,就是OpenGLContextpublicstaticasyncTask<PaginationList<T>>CreateAsync(  intcurrentPage,intpageSize,IQueryable<T>result){  //pagination  //skip  varskip=(currentPage-1)*pageSize;  result=result.Skip(skip);  //以pagesize为标准显示一定量的数据  result=result.Take(pageSize);  //includevsjoin  varitems=awaitresult.ToListAsync();  returnnewPaginationList<T>(currentPage,pageSize,items);}最后,在返回数据的时候,删掉分页处理的部分,返回类型使用PaginationList的实例创建工厂。privatereadonlyAppDbContext_context;privatereadonlyIPropertyMappingService_propertyMappingService;publicTouristRouteRepository(  AppDbContextappDbContext,  IPropertyMappingServicepropertyMappingService){  _context=appDbContext;  _propertyMappingService=propertyMappingService;}本文到此结束,感谢大家的观看!!
  • 所需E币: 0
    时间: 2023-12-25 10:31
    大小: 2.57KB
    上传者: 开心就很好了
    今天我将给大家讲解基于C++的Linux高性能事件驱动网络编程框架的设计方法及技巧,我在文中采取渐进迭代的方式,配合C++11新特性的使用,以及网络编程理论的深度讲解,并手把手带着大家落地实现,助力在网络编程领域有更大的技术提升!Linux系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如在Linux上搭建了一个web服务,经常出现网页无法打开、打开速度慢等现象,而遇到这些问题,就有人会抱怨Linux系统不好,其实这些都是表面现象。Linux提供三个「点分十进制字符串表示的IPv4地址和用网络字节序整数表示的IPv4地址之间转换」的接口 publicGraceJSONResultdoLogin(HttpServletRequestrequest,                  HttpServletResponseresponse,                  RegisterLoginBOregisterLoginBO,                  BindingResultresult){  //判断BindingResult是否保存错误的验证信息,如果有,则直接return  if(result.hasErrors()){    Map<String,String>errorMap=getErrors(result);    returnGraceJSONResult.errorMap(errorMap);  }  //获得前端传来的基本信息  StringsmsCode=registerLoginBO.getSmsCode();  Stringmobile=registerLoginBO.getMobile();  //0.校验验证码是否匹配  StringredisSMSCode=redis.get(MOBILE_SMSCODE+mobile);  if(StringUtils.isBlank(redisSMSCode)||!redisSMSCode.equalsIgnoreCase(smsCode)){    returnGraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);  }  returnGraceJSONResult.ok();}用户信息其实并不会经常发生变动,所以这块内容完全可以放入缓存,这么一来可以大大减少对数据库的压力。privateAppUsergetUser(StringuserId){  //1.查询redis中是否包含用户信息,如果包含则查询redis返回,如果不包含则查询数据库  StringuserJson=redis.get(REDIS_USER_INFO+":"+userId);  AppUseruser=null;  if(StringUtils.isNotBlank(userJson)){    user=JsonUtils.jsonToPojo(userJson,AppUser.class);  }else{    user=userService.getUser(userId);    //2.由于用户信息不怎么会变动,对于千万级别的网站,这类信息数据不会去查询数据库,完全可以把用户信息存入redis    //哪怕修改信息,也不会立马体现,这也是弱一致性,在这里有过期时间,比如1天以后,用户信息会更新到页面显示,或者缩短到1小时,都可以    //基本信息在新闻媒体类网站是属于数据一致性优先级比较低的,用户眼里看的主要以文章为主,至于文章是谁发的,一般来说不会过多关注    redis.set(REDIS_USER_INFO+":"+userId,JsonUtils.objectToJson(user),1);  }  returnuser;}虽然在表设计的时候把文章阅读数字段进行了设计,但是在大数据量下,文章阅读的累计并发是很高的,在这里我们也是采用redis的计数功能来进行实现。@OverridepublicGraceJSONResultlist(StringarticleId,Integerpage,IntegerpageSize){  if(page==null){    page=COMMON_START_PAGE;  }  if(pageSize==null){    pageSize=COMMON_PAGE_SIZE;  }  PagedGridResultgridResult=         commentPortalService.queryArticleComments(articleId,                           page,                           pageSize);  returnGraceJSONResult.ok(gridResult);}生成html的步骤分为以下几步:定义freemarker生成的html位置配置freemarker基本环境获得ftl模板获得动态数据融合ftl和动态数据,并输出到html@Value("${freemarker.html.target}")privateStringhtmlTarget;@GetMapping("/createHTML")@ResponseBodypublicStringcreateHTML(Modelmodel)throwsException{  //0.配置freemarker基本环境  Configurationcfg=newConfiguration(Configuration.getVersion());  //声明freemarker模板所需要加载的目录的位置  Stringclasspath=this.getClass().getResource("/").getPath();  cfg.setDirectoryForTemplateLoading(newFile(classpath+"templates"));//    System.out.println(htmlTarget);//    System.out.println(classpath+"templates");  //1.获得现有的模板ftl文件  Templatetemplate=cfg.getTemplate("stu.ftl","utf-8");  //2.获得动态数据  Stringstranger=;  model.addAttribute("there",stranger);  model=makeModel(model);  //3.融合动态数据和ftl,生成html  FiletempDic=newFile(htmlTarget);  if(!tempDic.exists()){    tempDic.mkdirs();  }  Writerout=newFileWriter(htmlTarget+File.separator+"10010"+".html");  template.process(model,out);  out.close();  return"ok";}
  • 所需E币: 0
    时间: 2023-12-25 11:06
    大小: 3.48KB
    LinuxSocket网络编程框架主要由3大模块组成:BSDSocketAPIsSocketAbstractionLayerVFSLayerTCP/IP协议在设计和实现上并没有客户端和服务器的概念,在通信过程中所有机器都是对等的。但由于资源(视频、新闻、软件等)都被数据提供者所垄断,所以几乎所有的网络应用程序都很自然地用了客户端/服务器模型,即所有客户端都通过访问服务器来获取所需的资源。BS和CS服务器架构(1)CS架构介绍(clientserver,客户端服务器架构)(2)BS架构介绍(broswerserver,浏览器服务器架构)TCP协议(1)建立连接需要三次握手(2)建立连接的条件:服务器listen时客户端主动发起connect(3)关闭连接需要四次握手(4)服务器或者客户端都可以主动发起关闭packagecom.example.emos.wx.controller.form;importio.swagger.annotations.ApiModel;importlombok.Data;importjavax.validation.constraints.NotBlank;importjavax.validation.constraints.Pattern;@Data@ApiModelpublicclassRegisterForm{  @NotBlank(message="注册码不能为空")  @Pattern(regexp="^[0-9]{6}$",message="注册码必须是6位数字")  privateStringregisterCode;  @NotBlank(message="微信临时授权不能为空")  privateStringcode;  @NotBlank(message="昵称不能为空")  privateStringnickname;  @NotBlank(message="头像不能为空")  privateStringphoto;}在UserController.java中创建login()方法。@PostMapping("/login")@ApiOperation("登陆系统")publicRlogin(@Valid@RequestBodyLoginFormform){intid=userService.login(form.getCode());  Stringtoken=jwtUtil.createToken(id);  Set<String>permsSet=userService.searchUserPermissions(id);  saveCacheToken(token,id);  returnR.ok("登陆成功").put("token",token).put("permission",permsSet);}在CheckinServiceImpl类中,实现抽象方法……publicclassCheckinServiceImplimplementsCheckinService{……publicvoidcreateFaceModel(intuserId,Stringpath){    HttpRequestrequest=HttpUtil.createPost(createFaceModelUrl);    request.form("photo",FileUtil.file(path));    HttpResponseresponse=request.execute();    Stringbody=response.body();    if("无法识别出人脸".equals(body)||"照片中存在多张人脸".equals(body)){      thrownewEmosException(body);    }else{      TbFaceModelentity=newTbFaceModel();      entity.setUserId(userId);      entity.setFaceModel(body);      faceModelDao.insert(entity);    }  }}在CheckinServiceImpl.java类中,实现三个抽象方法。publicclassCheckinServiceImplimplementsCheckinService{……@Override  publicHashMapsearchTodayCheckin(intuserId){    HashMapmap=checkinDao.searchTodayCheckin(userId);    returnmap;  }  @Override  publiclongsearchCheckinDays(intuserId){    longdays=checkinDao.searchCheckinDays(userId);    returndays;  }  @Override  publicArrayList<HashMap>searchWeekCheckin(HashMapparam){    ArrayList<HashMap>checkinList=checkinDao.searchWeekCheckin(param);    ArrayList<String>holidaysList=holidaysDao.searchHolidaysInRange(param);    ArrayList<String>workdayList=workdayDao.searchWorkdayInRange(param);    DateTimestartDate=DateUtil.parseDate(param.get("startDate").toString());    DateTimeendDate=DateUtil.parseDate(param.get("endDate").toString());    DateRangerange=DateUtil.range(startDate,endDate,DateField.DAY_OF_MONTH);    ArrayListlist=newArrayList();    range.forEach(one->{      Stringdate=one.toString("yyyy-MM-dd");      //查看今天是不是假期或者工作日      Stringtype="工作日";      if(one.isWeekend()){        type="节假日";      }      if(holidaysList!=null&&holidaysList.contains(date)){        type="节假日";      }elseif(workdayList!=null&&workdayList.contains(date)){        type="工作日";      }      Stringstatus="";      if(type.equals("工作日")&&DateUtil.compare(one,DateUtil.date())<=0){        status="缺勤";booleanflag=false;        for(HashMap<String,String>map:checkinList){          if(map.containsValue(date)){            status=map.get("status");flag=true;            break;          }        }DateTimeendTime=DateUtil.parse(DateUtil.today()+""+constants.attendanceEndTime);Stringtoday=DateUtil.today();if(date.equals(today)&&DateUtil.date().isBefore(endTime)&&flag==false){          status="";        }      }      HashMapmap=newHashMap();      map.put("date",date);      map.put("status",status);      map.put("type",type);      map.put("day",one.dayOfWeekEnum().toChinese("周"));      list.add(map);    });    returnlist;  }}在EmosWxApiApplicationTests.java类中提供了contextLoads()测试用例方法,我们把生成大量系统消息记录的代码写在其中,程序运行的时候这些消息记录就会写入到MongoDB里面。@SpringBootTestclassEmosWxApiApplicationTests{  @Autowired  privateMessageServicemessageService;  @Test  voidcontextLoads(){    for(inti=1;i<=100;i++){      MessageEntitymessage=newMessageEntity();      message.setUuid(IdUtil.simpleUUID());      message.setSenderId(0);      message.setSenderName("系统消息");      message.setMsg("这是第"+i+"条测试消息");      message.setSendTime(newDate());      Stringid=messageService.insertMessage(message);      MessageRefEntityref=newMessageRefEntity();      ref.setMessageId(id);      ref.setReceiverId(11);//注意:这是接收人ID      ref.setLastFlag(true);      ref.setReadFlag(false);      messageService.insertRef(ref);    }  }}在该页面的模型层里面声明静态数据。list数组保存的是后端Java返回的成员数据,内容上按照部门进行分组。members数组保存的是页面上选择的成员id。#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include<stdlib.h>#include<arpa/inet.h>#include<unistd.h>#include<string.h> #defineBACKLOG5 intmain(intargc,char*argv[]){  intfd;  structsockaddr_inaddr;  charbuf[BUFSIZ]={};   if(argc<3){    fprintf(stderr,"%s<addr><port>\n",argv[0]);    exit(0);  }   /*创建套接字*/  fd=socket(AF_INET,SOCK_STREAM,0);  if(fd<0){    perror("socket");    exit(0);  }   addr.sin_family=AF_INET;  addr.sin_port=htons(atoi(argv[2]));  if(inet_aton(argv[1],&addr.sin_addr)==0){    fprintf(stderr,"Invalidaddress\n");    exit(EXIT_FAILURE);  }   /*向服务端发起连接请求*/  if(connect(fd,(structsockaddr*)&addr,sizeof(addr))==-1){    perror("connect");    exit(0);  }  while(1){    printf("Input->");    fgets(buf,BUFSIZ,stdin);    write(fd,buf,strlen(buf));  }  close(fd);  return0;}
  • 所需E币: 0
    时间: 2023-12-18 10:38
    大小: 3.46KB
    上传者: 开心就很好了
    今天给大家讲讲关于SpringBoot2仿B站的一个项目,大家都知道,如今短视频成为了风口中的风口,但市场上极度缺乏视频业务开发的相关技术人才。本文将结合SpringCloud微服务架构+Springboot+JDK+Maven+VUE等技术,实现B站核心功能(视频流、弹幕流)+百万量级的高性能优化,从而帮助大家提升前端加后端技术水平,掌握架构设计思维及丰富解决方案。实现步骤使用Vue3提供的Provide/Inject组合,通过provide在App.vue中提供当前语言环境localeLanguage,代码片段如下所示://App.vue  <scriptsetuplang="ts">  importzhCnfrom'element-plus/lib/locale/lang/zh-cn'  importenfrom'element-plus/lib/locale/lang/en'  import{ref,provide}from'vue'  //显示引入provide    constlocale=ref(zhCn)  constlocaleLanguage=ref('')  functionchangeLang(language:any){   locale.value=language   localeLanguage.value=language.name  }    //提供当前语言环境localeLanguage  provide('localeLanguage',localeLanguage)    </script>然后再通过inject将其注入到home页面,将获取到的localeLanguage传入自定义的t函数中,代码片段如下所示://home/index.vue  <scriptsetuplang="ts">  import{useRoute}from'vue-router'  import{inject}from'vue' //显示引入inject  import{t}from'../../utils/internationalization'    //通过inject将localeLanguage注入,作为t函数的参数  constlocaleLanguage:string=inject('localeLanguage')||''  constroute=useRoute()  console.log(route.params)  constvalue1=''  </script>    <template>   <div>{{t(localeLanguage).home}}---{{t(localeLanguage).mine}}</div>   <el-date-pickerv-model="value1"type="date"placeholder="Pickaday"></el-date-picker>  </template>封装一个openStore(),使用indexedDB.open()方法返回一个IDBRequest对象,接着将这个对象上的三个事件分别放置进入:onsuccess、onerror、onupgradeneeded。onsuccess表示打开数据库成功的事件。onerror表示打开数据库失败的事件。onupgradeneeded是数据库升级事件,如果版本号更新,并且大于之前的版本号则进行数据库升级,该事件回调里面,会创建我们所需要的对象仓库,类似于关系型数据库中的表的概念。exportdefaultclassDB{ privatedbName:string//数据库名称 constructor(dbName:string){  this.dbName=dbName } //打开数据库 publicopenStore(storeName:string,keyPath:string,indexs?:Array<string>){  constrequest=window.indexedDB.open(this.dbName,2)  request.onsuccess=(event)=>{   console.log('数据库打开成功')   console.log(event)  }  request.onerror=(event)=>{   console.log('数据库打开失败')   console.log(event)  }  request.onupgradeneeded=(event)=>{   console.log('数据库升级成功')   const{result}:any=event.target   conststore=result.createObjectStore(storeName,{autoIncrement:true,keyPath})   if(indexs&&indexs.length>0){    indexs.map((v:string)=>{     store.createIndex(v,v,{unique:true})    })   }   store.transaction.oncomplete=(event:any)=>{    console.log('创建对象仓库成功')   }   console.log(event)  } }}Promise包装异步事务为了更好的获取indexedD事务中的返回结果,我们使用promise来包装一下上一小节indexedDB.ts中定义的几个方法:openStore、updateItem、deleteItem、getList、getItem。下面代码片段为getList() //查询所有数据 getList(storeName:string){  conststore=this.db.transaction(storeName).objectStore(storeName)  constrequest=store.getAll()  returnnewPromise((resolve,reject)=>{   request.onsuccess=(event:any)=>{    console.log('查询所有数据成功')    console.log(event.target.result)    resolve(event.target.result)   }   request.onerror=(event:any)=>{    console.log('查询所有数据失败')    console.log(event)    reject(event)   }  }) }使用@include指令来引入定义好的样式函数,该函数的三个参数可以根据传入的值来对flex布局进行自定义,默认值为:column、center、right,在footerCommon.scss中我们重新自定义了该样式函数,分别传入row、space-between、flex-start,代码片段如下://footerCommon.scss.common-footer{  border-top:1pxsolidrgb(235,235,235); .footer{  @includemain-wrapper;  @includelayout(row,space-between,flex-start);  padding:20px0;  li{   @includelayout;   h4{    font-weight:bold;   }   a{    margin-bottom:10px;    color:rgb(72,72,72);    text-decoration:none;    &:hover{     text-decoration:underline;    }   }  } }}getter类似与Vue中的computed计算属性,它的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算getters里可以处理一些array、object的查询、过滤、遍历、重构或者做一些字符拼接的操作,方便直接生成一些可以直接使用的数据。如下代码片段展示了如何在getter中进行过滤查询:exportconststore=createStore({   state:{   todos:[  //定义一个对象数组   {   id:1,   done:true   },   {   id:2,   done:false   }   ]   }   getters:{   doneTodosCount(){ //查询已完成的个数   returnstore.state.todos.filter(todo=>todo.done).length //返回值:1   }   }  })通过环境变量区分server.js中的一些代码片段,因为有些代码需要运行在开发环境,而有些代码需要运行在生产环境。本小节在server.js中一共对3个地方进行了环境区分,代码片段如下//server.jsif(!isProd){ //1.读取index.html template=fs.readFileSync(  path.resolve(__dirname,'index.html'),  'utf-8' ) //2.应用ViteHTML转换。这将会注入ViteHMR客户端, //  同时也会从Vite插件应用HTML转换。 //  例如:@vitejs/plugin-react-refresh中的globalpreambles template=awaitvite.transformIndexHtml(url,template) //3.加载服务器入口。vite.ssrLoadModule将自动转换 //  你的ESM源码使之可以在Node.js中运行!无需打包 //  并提供类似HMR的根据情况随时失效。 render=(awaitvite.ssrLoadModule('/src/entry-server.ts')).render}else{ //1.读取index.html template=fs.readFileSync(  path.resolve(__dirname,'dist/client/index.html'),  'utf-8' ) //3.加载服务器入口 render=require('./dist/server/entry-server.ts').render}
  • 所需E币: 0
    时间: 2023-12-14 10:32
    大小: 2.41KB
    上传者: 开心就很好了
    今天给大家讲讲关于多级网关与多级缓存架构的相关知识,在文章里面,我将从0到1带着大家构建基础服务接口,通过层层递进优化服务,使得服务具备多级缓存的特性,并融合OpenResty拓展一个强大的多级网关+多级缓存的技术架构。以下就是代码实战展示:引入springboot3的maven依赖,本质上作为pom引入,直接管理他的版本号,后续用到啥组件直接拿来即用:<dependencies>  <!--引入SpringBoot依赖-->  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-configuration-processor</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-aop</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-jdbc</artifactId>  </dependency></dependencies>dependencyManagement依赖管理全代码依赖配置如下:<!--  使用dependencyManagement的目的是为了保证当前父工程的干净,  也就是说父工程他只负责对依赖(坐标)的管理,以及依赖的版本管理,而不会去引入额外的jar依赖  如此一来,父工程的职责就相当的单一了,而且也符合面向对象的理念,是一种父子一来继承的关系  依赖的导入只有在各自的子工程中才会导入。--><dependencyManagement>  <dependencies>    <!--mysql驱动-->    <dependency>      <groupId>mysql</groupId>      <artifactId>mysql-connector-java</artifactId>      <version>8.0.33</version>    </dependency>    <!--持久层mybatis-->    <dependency>      <groupId>com.baomidou</groupId>      <artifactId>mybatis-plus-boot-starter</artifactId>      <version>3.5.0</version>    </dependency>    <dependency>      <groupId>com.github.pagehelper</groupId>      <artifactId>pagehelper-spring-boot-starter</artifactId>      <version>1.4.1</version>    </dependency>    <!--jackson-->    <dependency>      <groupId>com.fasterxml.jackson.core</groupId>      <artifactId>jackson-core</artifactId>      <version>2.14.2</version>    </dependency>    <dependency>      <groupId>com.fasterxml.jackson.core</groupId>      <artifactId>jackson-annotations</artifactId>      <version>2.14.2</version>    </dependency>    <dependency>      <groupId>com.fasterxml.jackson.core</groupId>      <artifactId>jackson-databind</artifactId>      <version>2.14.2</version>    </dependency>    <!--apache工具类-->    <dependency>      <groupId>commons-codec</groupId>      <artifactId>commons-codec</artifactId>      <version>1.15</version>    </dependency>    <dependency>      <groupId>org.apache.commons</groupId>      <artifactId>commons-lang3</artifactId>      <version>3.12.0</version>    </dependency>    <dependency>      <groupId>commons-fileupload</groupId>      <artifactId>commons-fileupload</artifactId>      <version>1.4</version>    </dependency>    <dependency>      <groupId>commons-io</groupId>      <artifactId>commons-io</artifactId>      <version>2.11.0</version>    </dependency>    <dependency>      <groupId>org.apache.httpcomponents</groupId>      <artifactId>httpclient</artifactId>      <version>4.5.13</version>    </dependency>    <!--google工具类-->    <dependency>      <groupId>com.google.guava</groupId>      <artifactId>guava</artifactId>      <version>28.2-jre</version>    </dependency>  </dependencies></dependencyManagement>使用zaddzset10value120value230value3:设置member和对应的分数zrangezset0-1:查看所有zset中的内容zrangezset0-1withscores:带有分数zrankzsetvalue:获得对应的下标zscorezsetvalue:获得对应的分数zcardzset:统计个数zcountzset分数1分数2:统计个数zrangebyscorezset分数1分数2:查询分数之间的member(包含分数1分数2)zrangebyscorezset(分数1(分数2:查询分数之间的member(不包含分数1和分数2)zrangebyscorezset分数1分数2limitstartend:查询分数之间的member(包含分数1分数2),获得的结果集再次根据下标区间做查询zremzsetvalue:删除member在common中引入的坐标依赖<dependency>  <groupId>org.apache.commons</groupId>  <artifactId>commons-lang3</artifactId></dependency><dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-core</artifactId></dependency><dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-annotations</artifactId></dependency><dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-databind</artifactId></dependency><dependency>  <groupId>com.fasterxml.jackson.datatype</groupId>  <artifactId>jackson-datatype-jsr310</artifactId></dependency>迭代查询代码,一级缓存与二级缓存结合:@GetMapping("query")publicObjectquery(Stringid){  StringarticleKey="article:"+id;  StringarticleKeyRedis="REDIS_ARTICLE:"+id;  Articlearticle=cache.get(articleKey,s->{    System.out.println("文章id为"+id+"的没有查询到,则从Redis中查询后返回...");    ArticlearticleReal=null;    StringarticleJsonStr=redis.get(articleKeyRedis);    //判断从redis中查询到的文章数据是否为空    if(StringUtils.isBlank(articleJsonStr)){      System.out.println("Redis中不存在该文章,将从数据库中查询...");      //如果为空,则进入本条件,则从数据库中查询数据      articleReal=articleService.queryArticleDetail(id);      //手动把文章数据设置到redis中,后续再次查询则有值      StringarticleJson=JsonUtils.objectToJson(articleReal);      redis.set(articleKeyRedis,articleJson);    }else{      System.out.println("Redis中存在该文章,将直接返回...");      //如果不为空,则直接转换json类型article再返回即可      articleReal=JsonUtils.jsonToPojo(articleJsonStr,Article.class);    }    returnarticleReal;  });  returnarticle;}本文到此结束,感谢大家的阅读!
  • 所需E币: 0
    时间: 2023-12-6 15:17
    大小: 3.8KB
    网络编程概述管道(父子进程)、消息队列(内核经营消息队列)、共享内存(创建一个空间)、信号(通过pid号通信)、信号量(对临界资源,共享内存做P、V控制)。特点:依赖于Linux内核AB两个通信基于内核。缺陷:无法多机通信(不适用与两台不同的电脑)TCP和UDP对比:TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信TCP首部开销20字节;UDP的首部开销小,只有8个字节TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道传统的进程间通信借助内核提供的IPC机制进行,但是只能限于本机通信。若要跨机通信,就必须使用网络通信,这就需要用到内核提供给用户的socketAPI函数库。2.1网络字节序大端字节序:也叫高端字节序(网络字节序),是高端地址存放低位数据,低端地址存放高位数据小端字节序:也叫低端字节序,是低地址存放低位数据,高地址存放高位数据。在application.yml文件中,填入SaToken的配置信息,如下:sa-token: #HTTP请求头中哪个属性用来上传令牌 token-name:token #过期时间(秒),设置为30天 timeout:2592000 #临时有效期,设置为3天 activity-timeout:259200 #不允许相同账号同时在线,新登陆的账号会挤掉原来登陆的账号 allow-concurrent-login:false #在多人登陆相同账号的时候,是否使用相同的Token is-share:false token-style:uuid #是否读取Cookie中的令牌 isReadCookie:false #同端互斥 isConcurrent:false #SaToken缓存令牌用其他的逻辑库,避免业务数据和令牌数据共用相同的Redis逻辑库 alone-redis:  database:1  host:localhost  port:6379  password:abc123456  timeout:10s  lettuce:   pool:    #连接池最大连接数    max-active:200    #连接池最大阻塞等待时间(使用负值表示没有限制)    max-wait:10s    #连接池中的最大空闲连接    max-idle:16    #连接池中的最小空闲连接    min-idle:8Java语言允许我们自己封装异常类,我们可以自定义各种异常类,比如每种业务一个异常类,或者每个模块一个异常类。我这里不想做的那么复杂,不如我们创建一个通用的异常类,用来封装与业务有关的异常信息。在com.example.his.api.exception包中,创建HisException.java类。packagecom.example.his.api.exception;importlombok.Data;@DatapublicclassHisExceptionextendsRuntimeException{  privateStringmsg;  privateintcode=500;  publicHisException(Exceptione){    super(e);    this.msg="执行异常";  }  publicHisException(Stringmsg){    super(msg);    this.msg=msg;  }  publicHisException(Stringmsg,Throwablee){    super(msg,e);    this.msg=msg;  }  publicHisException(Stringmsg,intcode){    super(msg);    this.msg=msg;    this.code=code;  }  publicHisException(Stringmsg,intcode,Throwablee){    super(msg,e);    this.msg=msg;    this.code=code;  }}SpringBoot提供了全局处理异常的技术,只要我们给某个Java类用上@RestControllerAdvice注解,这个类就能捕获SpringBoot项目中所有的异常,然后统一处理(精简异常信息)再返回给前端项目。在com.example.his.api.config包中,创建ExceptionAdvice.java类。packagecom.example.his.api.config;importcn.dev33.satoken.exception.NotLoginException;importcn.felord.payment.PayException;importcn.hutool.json.JSONObject;importcom.example.his.api.exception.HisException;importlombok.extern.slf4j.Slf4j;importorg.springframework.validation.BindException;importorg.springframework.http.HttpStatus;importorg.springframework.http.converter.HttpMessageNotReadableException;importorg.springframework.web.HttpRequestMethodNotSupportedException;importorg.springframework.web.bind.MethodArgumentNotValidException;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.ResponseStatus;importorg.springframework.web.bind.annotation.RestControllerAdvice;importorg.springframework.web.multipart.support.MissingServletRequestPartException;@Slf4j@RestControllerAdvicepublicclassExceptionAdvice{  /*   *捕获异常,并且返回500状态码   */  @ResponseBody  @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  @ExceptionHandler(Exception.class)  publicStringexceptionHandler(Exceptione){    JSONObjectjson=newJSONObject();    if(einstanceofHttpMessageNotReadableException){      HttpMessageNotReadableExceptionexception=(HttpMessageNotReadableException)e;      log.error("error",exception);      json.set("error","请求未提交数据或者数据有误");    }     elseif(einstanceofMissingServletRequestPartException){      MissingServletRequestPartExceptionexception=(MissingServletRequestPartException)e;      log.error("error",exception);      json.set("error","请求提交数据错误");    }     elseif(einstanceofHttpRequestMethodNotSupportedException){      HttpRequestMethodNotSupportedExceptionexception=(HttpRequestMethodNotSupportedException)e;      log.error("error",exception);      json.set("error","HTTP请求方法类型错误");    }     //Web方法参数数据类型转换异常,比如String[]数组类型的参数,你上传的数据却是String类型    elseif(einstanceofBindException){      BindExceptionexception=(BindException)e;      StringdefaultMessage=exception.getFieldError().getDefaultMessage();      log.error(defaultMessage,exception);      json.set("error",defaultMessage);    }    //没有通过后端验证产生的异常    elseif(einstanceofMethodArgumentNotValidException){      MethodArgumentNotValidExceptionexception=(MethodArgumentNotValidException)e;      json.set("error",exception.getBindingResult().getFieldError().getDefaultMessage());    }    //处理业务异常    elseif(einstanceofHisException){      log.error("执行异常",e);      HisExceptionexception=(HisException)e;      json.set("error",exception.getMsg());    }     //微信支付异常    elseif(einstanceofPayException){      PayExceptionexception=(PayException)e;      log.error("微信支付异常",exception);      json.set("error","微信支付异常");    }    //处理其余的异常    else{      log.error("执行异常",e);      json.set("error","执行异常");    }    returnjson.toString();  }  /*   *捕获异常,并且返回401状态码   */  @ResponseBody  @ResponseStatus(HttpStatus.UNAUTHORIZED)  @ExceptionHandler(NotLoginException.class)  publicStringunLoginHandler(Exceptione){    JSONObjectjson=newJSONObject();    json.set("error",e.getMessage());    returnjson.toString();  }}因为Controller类用上@RestController注解之后,Web方法返回的对象会被自动转换成JSON对象,所以我们只需要声明一个封装类,让所有Web方法返回这个封装类的对象即可。除了公共属性之外,不同的Web方法要返回的业务数据也不尽相同,所以选择动态的结构才是最佳的方案,恰好HashMap允许我们随便添加数据,那就选择HashMap作为父类吧。在com.example.his.api.common包中,创建R.java类。packagecom.example.his.api.common;importorg.apache.http.HttpStatus;importjava.util.HashMap;importjava.util.Map;publicclassRextendsHashMap<String,Object>{  publicR(){    //默认创建的R对象中包含了公共的属性    put("code",HttpStatus.SC_OK);    put("msg","success");  }  /*   *覆盖继承的put函数,添加Key-Value数据   */  publicRput(Stringkey,Objectvalue){    super.put(key,value);    //把自己返回,用于链式调用    returnthis;  }  publicstaticRok(){    returnnewR();  }  publicstaticRok(Stringmsg){    Rr=newR();    r.put("msg",msg);    returnr;  }  publicstaticRok(Map<String,Object>map){    Rr=newR();    r.putAll(map);    returnr;  }  publicstaticRerror(intcode,Stringmsg){    Rr=newR();    r.put("code",code);    r.put("msg",msg);    returnr;  }  publicstaticRerror(Stringmsg){    returnerror(HttpStatus.SC_INTERNAL_SERVER_ERROR,msg);  }  publicstaticRerror(){    returnerror(HttpStatus.SC_INTERNAL_SERVER_ERROR,"未知异常,请联系管理员");  }}
  • 所需E币: 5
    时间: 2023-11-11 10:00
    大小: 643.5KB
    FM3793A是一款应用于离线反激式转换器中的高性能电流模式PWM控制器。在FM3793A中,PWM开关频率最大为65KHz。在轻载和空载条件下,该FM3793A启动间歇模式从而降低开关频率。FM3793A具有丰富的芯片异常状况保护功能,如欠压锁定(UVLO)、VDD过压保护功能(VDDOVP),逐周期过流保护(OCP),短路保护(SCP)、过温降功率(OTP)、VDD电压钳位等,强大的保护功能使电源系统更加安全,FM3793A内置800V高压开关管,从而可实现超低系统成本,在100V-265V的宽电压范围内可稳定输出18W的输出功率;FM3793A采用SOP8封装。
  • 所需E币: 1
    时间: 2023-7-29 15:29
    大小: 701.55KB
    上传者: Argent
    MPS高性能储能BMS解决方案
  • 所需E币: 0
    时间: 2023-6-15 14:22
    大小: 748.29KB
    上传者: 骊微电子科技
    RZC3606T3.2V~15V1A高性能次级同步整流芯片-RZC3606T芯片规格书
  • 所需E币: 1
    时间: 2023-6-15 14:02
    大小: 92KB
    上传者: 张红川
    设计高性能65W双路输出1_4砖型模块电源.doc
  • 所需E币: 2
    时间: 2023-4-18 11:37
    大小: 64.26MB
    高性能科学与工程计算-(计算机科学丛书)-[德]GeorgHager&GerhardWellein
  • 所需E币: 2
    时间: 2023-4-11 09:47
    大小: 72.98MB
    高性能MySQL(第3版)-[美]BaronSchwartz-PeterZaitsev-VadimTkachenko-电子工业出版社
  • 所需E币: 1
    时间: 2023-4-4 09:41
    大小: 105.2MB
    GPU精粹2-高性能图形芯片和通用计算编程技巧
  • 所需E币: 1
    时间: 2023-4-10 11:57
    大小: 78.66MB
    高性能JavaScript-[美]NicholasC.Zakas
  • 所需E币: 2
    时间: 2023-3-30 16:12
    大小: 7.07MB
    高性能交流传动系统-模型分析与控制
  • 所需E币: 0
    时间: 2023-3-30 16:54
    大小: 1.21MB
    PDF策略在变载荷高性能控制系统中的设计及仿真