十二、Redis——多级缓存

目录 1. 传统缓存策略 2. 多级缓存方案 3. JVM进程缓存 3.1 初识Caffeine 4. 实现进程缓存 4.1 安装OpenResty 4.2.Redis缓存预热 4.3.缓存同步 4.3.1 缓存数据同步策略 4.3.2 Canal介绍 4.3.3 监听Canal 总结: 1. 传统缓存策略 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时,会对数据库产生冲击 多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat压力,提升服务性能: 浏览器访问静态资源时,优先读取浏览器本地缓存访问非静态资源(ajax查询数据)时,访问服务端请求到达Nginx后,优先读取Nginx本地缓存如果Nginx本地缓存未命中,则去直接查询Redis(不经过Tomcat)如果Redis查询未命中,则查询Tomcat请求进入Tomcat后,优先查询JVM进程缓存如果JVM进程缓存未命中,则查询数据库 2. 多级缓存方案 在多级缓存架构中,Nginx内部需要编写本地缓存查询、Redis查询、Tomcat查询的业务逻辑,因此这样的nginx服务不再是一个反向代理服务器,而是一个编写业务的Web服务器了。 因此这样的业务Nginx服务也需要搭建集群来提高并发,再有专门的nginx服务来做反向代理,如图: 另外,我们的Tomcat服务将来也会部署为集群模式: 可见,多级缓存的关键有两个: 一个是在nginx中编写业务,实现nginx本地缓存、Redis、Tomcat的查询 另一个就是在Tomcat中实现JVM进程缓存 其中Nginx编程则会用到OpenResty框架结合Lua这样的语言。 3. JVM进程缓存 3.1 初识Caffeine 缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。我们把缓存分为两类: 分布式缓存,例如Redis: 优点:存储容量更大、可靠性更好、可以在集群间共享缺点:访问缓存有网络开销场景:缓存数据量较大、可靠性要求较高、需要在集群间共享进程本地缓存,例如HashMap、GuavaCache: 优点:读取本地内存,没有网络开销,速度更快缺点:存储容量有限、可靠性较低、无法共享场景:性能要求较高,缓存数据量较小 我们今天会利用Caffeine框架来实现JVM进程缓存。 Caffeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。GitHub地址:https://github.com/ben-manes/caffeine Caffeine的性能非常好,下图是官方给出的性能对比: 4. 实现进程缓存 多级缓存的实现离不开Nginx编程,而Nginx编程又离不开OpenResty。 4.1 安装OpenResty OpenResty® 是一个基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。具备下列特点: 具备Nginx的完整功能基于Lua语言进行扩展,集成了大量精良的 Lua 库、第三方模块允许使用Lua自定义业务逻辑、自定义库 官方网站: https://openresty.org/cn/ 4.2.Redis缓存预热 添加Redis缓存的需求 冷启动与缓存预热

十五、Redis——网络模型

目录 1.1 用户空间和内核态空间 1.2 网络模型-阻塞IO 1.3 网络模型-非阻塞IO 1.4 网络模型-IO多路复用 总结: ​编辑 1.5 网络模型-信号驱动IO 1.6 网络模型-异步IO 1.7 同步和异步划分 1.8 Redis网络模型 1.1 用户空间和内核态空间 1.2 网络模型-阻塞IO 在《UNIX网络编程》一书中,总结归纳了5种IO模型: 阻塞IO(Blocking IO)非阻塞IO(Nonblocking IO)IO多路复用(IO Multiplexing)信号驱动IO(Signal Driven IO)异步IO(Asynchronous IO) 用程序想要去读取数据,他是无法直接去读取磁盘数据的,他需要先到内核里边去等待内核操作硬件拿到数据,这个过程就是1,是需要等待的,等到内核从磁盘上把数据加载出来之后,再把这个数据写给用户的缓存区,这个过程是2,如果是阻塞IO,那么整个过程中,用户从发起读请求开始,一直到读取到数据,都是一个阻塞状态。 1.3 网络模型-非阻塞IO 1.4 网络模型-IO多路复用 总结: select模式存在的三个问题: l 能监听的 FD 最大不超过 1024 l 每次 select 都需要把所有要监听的 FD 都拷贝到内核空间 l 每次都要遍历所有 FD 来判断就绪状态 poll模式的问题: l poll 利用链表解决了 select 中监听 FD 上限的问题,但依然要遍历所有 FD ,如果监听较多,性能会下降 epoll模式中如何解决这些问题的? ü 基于 epoll 实例中的红黑树保存要监听的 FD ,理论上无上限,而且增删改查效率都非常高 ü 每个 FD 只需要执行一次 epoll_ctl 添加到红黑树,以后每次 epol_wait 无需传递任何参数,无需重复拷贝 FD 到内核空间 ü 利用 ep_poll_callback 机制来监听 FD 状态,无需遍历所有 FD ,因此性能不会随监听的 FD 数量增多而下降 1.

十五、Redis——内存策略

参考文献: 黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目_哔哩哔哩_bilibili

Java实现合并多个excel操作

涉及较多封装的工具类,所有依赖的工具类均提供代码,根据名称新建对应的类,在每个工具类中再引入相应的依赖即可 首先需要明确的是,需要合并的每个excel的表头名称必须是相同的, 针对表头,建立传输的dto: 其中@Excel为自定义注解,代码如下: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Excel { /** * 导出时在excel中排序 */ public int sort() default Integer.MAX_VALUE; /** * 导出到Excel中的名字. */ public String name() default ""; /** * 日期格式, 如: yyyy-MM-dd */ public String dateFormat() default ""; /** * 读取内容转表达式 (如: 0=男,1=女,2=未知) */ public String readConverterExp() default ""; /** * 分隔符,读取字符串组内容 */ public String separator() default ","; /** * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) */ public int scale() default -1; /** * BigDecimal 舍入规则 默认:BigDecimal.

DELPHI 中的Delay函数,利用GetTickCount和Application.ProcessMessages构建

delphi 开发中有些时候需要停留片刻,等待界面输入,或异步操作完成,如果使用sleep函数的话,整个程序都会停顿,界面还会出现冻结的情况。因此需要自行编写一个delay函数,以毫秒为单位控制等待时间。 函数功能:GetTickCount返回(retrieve)从操作系统启动到现在所经过(elapsed)的毫秒数,它的返回值是DWORD。 Application.ProcessMessages; 主要作用使程序在运行时能够响应外界事件。 利用以上两个函数,我们就可以编写出以毫秒为计数单位,好用的delay函数了。在指定时间内,等待异步事件的完成,如串口通信、网口通信、数据库查询返回等操作。 procedure Delay(msecs:integer); procedure TForm1.Delay(msecs:integer); var Tick: DWord; Event: THandle; begin Event := CreateEvent(nil, False, False, nil); try Tick := + DWord(msecs); while (msecs > 0) and (MsgWaitForMultipleObjects(1, Event, False, msecs, QS_ALLINPUT) <> WAIT_TIMEOUT) do begin Application.ProcessMessages; msecs := Tick - GetTickcount; end; finally CloseHandle(Event); end; end;

快速删除node_modules和.pnpm-store文件夹

直接在文件资源管理器里面删除node_modules和.pnpm-store文件夹很慢(因为小文件太多,删除不够并行),有几种方法快速删除。 node_modules 1. remove-node-modules npm install -g remove-node-modules remove-node-modules 2. rimraf npm install -g rimraf rimraf node_modules 3. CMD rd /s /q node_modules 4. Powershell rm -rf node_modules .pnpm-store 1 精简 pnpm store prune 2 定位 pnpm store path 删除 rm -rf .pnpm-store 参考 https://blog.csdn.net/lijingjingjing22/article/details/116118701 https://blog.csdn.net/RingoH/article/details/117957190 https://github.com/orgs/pnpm/discussions/4413

前端开发的未来趋势:探索新技术和发展方向

前端开发领域一直在不断演变和发展,随着技术的不断进步,前端开发者需要不断学习和适应新的趋势和工具。在本文中,我们将探讨前端开发的未来趋势,帮助您了解将来可能会成为关键的技术和发展方向。 1. WebAssembly WebAssembly(简称Wasm)是一种可移植、高性能的二进制格式,可在Web浏览器中运行。它可以让开发者使用C++、Rust等语言编写高性能的Web应用程序,开启了在Web上运行本地级别代码的可能性。WebAssembly有望在Web游戏、图形应用和大规模计算方面发挥重要作用。 2. PWA(渐进式Web应用) PWA是一种结合了Web和移动应用的概念,它可以提供快速的加载速度、离线访问、推送通知等功能。PWA的出现使得Web应用更接近原生应用的体验,逐渐成为了移动端开发的一种主流选择。 3. 静态网站生成器 静态网站生成器(Static Site Generator,SSG)可以帮助开发者构建快速、安全且易于维护的网站。它们使用模板和数据源生成静态HTML文件,不需要服务器端处理。SSG工具如Gatsby、Next.js和Hugo已经受到广泛关注,将来可能会成为构建Web应用的主要方式。 4. 人工智能和机器学习 人工智能(AI)和机器学习(ML)在前端开发中的应用逐渐增多。开发者可以使用AI来改进用户体验、自动化测试、数据分析等。例如,AI可以用于自动化生成图像、识别用户行为模式、改进搜索算法等方面。 5. Web3和区块链 Web3是一个分散的Web,建立在区块链技术之上。它试图解决当前Web的中心化和隐私问题。开发者正在研究如何将去中心化身份验证、智能合约和分布式应用程序集成到Web3中,可能会产生全新的Web开发机会。 6. WebVR和WebAR 虚拟现实(VR)和增强现实(AR)正在逐渐融入Web开发。WebVR和WebAR使开发者能够在浏览器中构建交互式虚拟和增强现实体验,将来可能会成为在线教育、游戏和虚拟商店的一部分。 前端开发领域的未来充满了挑战和机遇。掌握新的技术和趋势,不断学习和尝试新的工具和框架,将使您保持竞争力并为未来的前端开发工作做好准备。无论您是初学者还是有经验的开发者,持续的学习和研究都将是前进的关键。

可视化uniapp 2.0实现可视化微信小程序+可视化h5+可视化uniapp

体验地址:https://we7.diyhey.com/admin/login 设计你的界面,轻松实现可视化布局! 🎨 1. 可视化拖拽容器组件,包含基础组件和表单组件,自动生成布局,一键生成uniapp、h5和小程序代码,让开发更高效! 包括字体、背景、边框、内外边距圆角等,打造独一无二的界面。 💾 3. 保存你的设计模板,方便日后继续设计,再也不用从头开始! 🚀 4. 一键导出项目全部代码,支持在hbuilderX运行,也可以导出微信小程序代码,直接在微信开发者工具运行! 📚 5. 查看导出代码的历史记录,随时继续编辑,方便团队协作。 🔍 6. 点击查看源码,自动显示修改后的代码变化,同时查看h5、uniapp和微信小程序代码,全方位了解代码结构。 📁 7. 可视化创建vue文件,选择目录后即可创建文件,将代码保存在vue文件中,每个文件可作为一个设计页面。 📦 8. 创建多个vue页面,一键打包导出uniapp代码,解压压缩包即可运行,方便快捷! 🔗 9. 自动生成路由配置pages.json,实现vue页面间的跳转,微信小程序自动生成app.json,开发更便捷! 🔌 10. 点击绑定接口的数据,进入请求页面,输入请求url、方式和参数,运行接口数据并选择绑定返回参数,实时预览效果! 💪 11. 强大的flex布局功能,点击属性快速进行可视化布局,让界面布局更灵活! 🎨 12. 使用吸管工具快速给网页布局着色,支持快捷键,轻松设计布局! 🌈 13. 支持colorUI和uviewUI两种通用ui库,快速编写uniapp代码,让界面更美观!

数据结构之位图【原理与实现】

文章目录 前言一、位图bitap是什么?二、位图的引用场景1、查询统计、定位查询,排序,去重2、取两个集合的交集,并集等 三、位图C++实现 前言 bitmap意为位图,它的每一位用于存放状态,适用于大规模并且不重复的数据,判断某个数据是否存在于位图之中。bitmap在数据稠密的时候,非常节省空间,但是在数据稀疏的时候,会有极大的浪费 一、位图bitap是什么? 个int类型占4个字节,也就是32bit,我们用一个int数组来表示时 new int[32],总计占用内存大概32*32bit,如果说我们存放的海量数据,亿万级非常大,那么这些基本数据类型都不够用的,则可以用int字节码的每一位表示一个数字,比如int类型32位,可以存放0-31共32个数值,那么32个数字只需要一个int类型所占内存空间大小就够了,这样在大数据量的情况下会节省很多内存。 就是通过定义一个整形数值后,将原本只表示1个数值的情况下,扩大了可以存放几十个数及以上的结构,比如我们要存放0-63的数,共64个数,那么我们就定义一个long型变量,有8个字节,64位,二进制就是64位,那么每一位从左到右就可以表示0,1,2…,63,如果有数则可以赋值1 没有则表示0 比如保存1,那么就是第二位赋值1 ,以此类推 下面我们演示下,传递一个数值,保存到一个long[] arr数组中,简单了解下: arr[0]存放的值: 0 - 63 arr[1]存放的值: 64 - 127 arr[2]存放的值: 128 - 191 举例num =4 存放的位置就是 arr[0] 第一个元素 因为 num /64 = 0 ,元素二进制 00…10000 第五位赋值1 二、位图的引用场景 所以位图bitmap的作用是: 存放海量数据,节省存储空间有明显优势在这里插入代码片 1、查询统计、定位查询,排序,去重 **查询统计:**假设有一个包含1000万个整数的数据集,我们想要知道其中有多少个整数大于等于100。我们可以使用一个位图,位图的长度为100000000(即整数范围),每个位置代表一个整数,如果对应位置的位为1,则表示该整数存在;否则,表示不存在。对于大于等于100的整数,将对应的位置设置为1,其他位置默认为0。最后,通过统计位图中值为1的位的数量,就可以得到大于等于100的整数的数量。 **定位查询:**假设有一个存储用户标签信息的位图,其中每个位置代表一个标签,如果对应位置的位为1,则表示该用户拥有该标签;否则,表示不拥有。当需要查找拥有指定标签的用户时,只需要检查位图中对应位置的位是否为1即可快速定位到拥有该标签的用户。 **去重:**假设有一个包含大量重复元素的数据集,我们需要对这些元素进行去重操作。我们可以使用一个位图,将数据集中的每个元素映射到位图的对应位置,如果对应位置的位为0,则表示该元素不存在;否则,表示已经存在。当遍历数据集时,可以根据位图来判断某个元素是否已经存在,从而实现去重操作。 2、取两个集合的交集,并集等 取两个集合的交集: 对两个位图进行按位与运算,得到新的位图,其中被设置为1的位表示两个集合都包含的元素。 取两个集合的并集: 对两个位图进行按位或运算,得到新的位图,其中被设置为1的位表示两个集合中任意一个集合包含的元素。 三、位图C++实现 位图实现的包含以下功能: 构造函数:接受一个范围参数 range,创建一个大小适合存储范围内元素的位图。析构函数:释放位图占用的内存。初始化函数:将位图中的所有位都设置为0。增加函数:将给定的数字 num 添加到位图中。这里假设数字的范围在位图的有效范围内。删除函数:从位图中删除给定的数字 num。查找函数:在位图中查找给定的数字 num,如果存在则返回 true,否则返回 false。 注意事项: 位图使用一个 unsigned int 数组来存储位的信息,每个 unsigned int 可以存储 32 个位。位图的大小由范围参数 range 决定,使用 range / 32 + 1 计算出所需的 unsigned int 数组的大小。数字 num 在位图中的索引位置由 num / 32 计算得到,表示在哪个 unsigned int 数组上。数字 num 在位图中的具体位索引由 num % 32 计算得到,表示在该 unsigned int 上的哪个位上。 #pragma once #include <assert.

12个最受欢迎的3D打印机械臂【开源|DIY|套件】

推荐:用 NSDT编辑器 快速搭建可编程3D场景 机器人手臂的用途各不相同,但大多数都能够执行拾取和放置任务,而有些则配备用于 CNC 工作、激光雕刻,甚至 3D 打印。 机械臂具有广泛的应用和各个领域,从执行精密手术和进行工业操作,到用于学习和互动的有趣玩具。 拥有自己的机器人手臂有多种选择,你可以简单地购买一个,或者使用 3D 打印机,轻松地自己设计和建造一个。 这些 DIY 手臂可以定制和修改,同时具有成本效益。 由于在决定购买或打印合适的机器人手臂时,需要筛选数百种出色的设计和项目,因此我们将列表范围缩小到当今可用的最佳和最受欢迎的 12 种机器人手臂。 其中包括你可以DIY或购买的机械臂。 如果需要查看机械臂的STEP或STL图纸,可以使用NSDT 3DConvert这个在线3D格式转换工具,免去了本地安装软件的麻烦: 在开始讨论这些选项之前,让我们先看看一些有关机械臂的基本概念和重要术语。 1、机械臂的基本概念 机器人手臂有不同的样式,但大多数都遵循相同的一般运动原理。 与3D打印机等笛卡尔机器不同,机械臂利用极坐标系进行运动,并具有弧形工作区域。 机器人手臂的独特之处在于,与具有类似功能的其他机器相比,它们的占地面积不会限制它们,并且占用的空间非常小。 我们可以在上图中看到机器人手臂的各种封套。 机器人的最大包络线是它可以穿越的区域。 受限包络线表示机器人可以工作的区域,它受到关节数量、范围和类型(线性或角度)的限制。 最后,操作范围是机器人将操作的区域,并且可以通过例如限位开关来限制。 除了笛卡尔机器人手臂之外,还有其他几种机器人手臂配置,例如圆柱形、球形、选择性柔顺关节机器人手臂 (SCARA) 和 Delta(或平行)机器人。 机器人手臂通常用其自由度 (DOF) 来表示。 该术语表示特定手臂上旋转关节或轴的数量; 例如,四自由度手臂可以在四个独立的关节处旋转。 自由度越多,可能的运动范围就越大。 接下来的这些项目完全是 开源并且可以DIY 的,并且所有项目都需要使用 3D 打印机来打印某些组件。 1、Eezybotarm Mk2 原始 Eezybotarm 的更大更强的迭代 Eezybotarm Mk2 是 4 自由度手臂的典范,完全采用 3D 打印而成,并具有出色的组装说明。 该机器人手臂赢得了多项比赛,可能是最简单的手臂设计之一。 还有一个 Mk3 正在开发中。 该项目旨在让用户尝试不同的控制方法。 你可以使用计算机控制该机械臂执行各种动作,并且可以存储伺服位置序列以供以后播放,一次或循环播放。 你甚至不需要计算机即可完成此操作; 可以对其进行编程,使其在按下按钮时播放。 该项目旨在具有教育意义,并且在 Thingiverse 上有超过 120 个制作和 43 个remixes,这表明它是可复制和可定制的。 这是一个将机器人技术与 3D 打印相结合的伟大项目。

在react的antd@5中form里面的Switch 为什么在 Form.Item 下不能绑定数据?

在react的antd@5中form里面的Switch 为什么在 Form.Item 下不能绑定数据? Form.Item 默认绑定值属性到 value 上, 而 Switch 的值属性为 checked。 你可以通过 valuePropName 来修改绑定的值属性。 // valuePropName="checked"修改form.item的value从新绑定到checked上面 <Form.Item name="fieldA" valuePropName="checked"> <Switch /> </Form.Item>

干货 | 常见的API接口漏洞总结

👉 这是一个或许对你有用的社群 🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 《项目实战(视频)》:从书中学,往事上“练” 《互联网高频面试题》:面朝简历学习,春暖花开 《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题 《精进 Java 学习指南》:系统学习,互联网主流技术栈 《必读 Java 源码专栏》:知其然,知其所以然 👉这是一个或许对你有用的开源项目 国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。 功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能: Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud 视频教程:https://doc.iocoder.cn 来源:HACK学习呀 sl4x0.github.io/api-notes/ common-api-vulnerablities/ 常见API接口漏洞 信息披露 断开的对象级别授权 用户身份验证中断 过度的数据泄露 缺乏资源和速率限制 中断的功能级别授权 质量分配 安全配置错误 注入 资产管理不当 业务逻辑漏洞 总结 常见API接口漏洞 了解接口常见漏洞,将帮助你在测试接口获取更多的思路。 图片 基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能 项目地址:https://github.com/YunaiV/ruoyi-vue-pro 视频教程:https://doc.iocoder.cn/video/ 信息披露 信息可能会在 API 响应或公共来源(如代码存储库、搜索结果、新闻、社交媒体、目标网站和公共 API 目录)中披露。

Android窗口层级(Window Type)分析

前言 Android的窗口Window分为三种类型: 应用Window,比如Activity、Dialog;子Window,比如PopupWindow;系统Window,比如Toast、系统状态栏、导航栏等等。 应用Window的Z-Ordered最低,就是在系统中的显示层级最低,然后到子Window,层级最高的是系统Window。层级高的Window会覆盖层级低的Window。 要让窗口覆盖显示,只需要使它的层级比上个窗口高。 三种窗口对应不同的WindowToken,每个应用组件(应用组件可以是Activity、InputMethod、Wallpaper等,每个组件对应一个WindowToken)都需要通过WindowToken向WMS申请添加窗口,WMS(WindowManagerSerivce)通过根据窗口的WindowToken进行分类组织,相同WindowToken的窗口紧密联系。应用组件在新建窗口时必须提供WindowToken表面窗口身份类型。系统窗口会隐式申明WindowToken,同时WMS会在addWindow()时进行鉴权。 应用窗口层级 Activity的显示 先从Activity的setContentView()的源码入手: 在AppCompatDelegateImpl源码中 mSubDecor并非Window中的DecorView,在创建DecorView之后创建的一个子DecorView,包括是否是包含ActionBar、FloatingActionButton等,相当于旧版本的DecorView中TitleBar。 getWindow()是返回返回Activity的mWindow变量,指向一个Window的对象,Window是一个抽象类,这里返回的是PhoneWindow对象(PhoneWindow是Window的子类),PhoneWindow中有一个DecorView对象,DecorView实际上就是个FrameLayout,setContentView()的子布局最终会添加到DecorView中,DecorView为当前窗口的根视图。 这个根视图是如何最终被绘制出来的? Window表示一个抽象窗口的概念,是View的直接管理者,对应一个View,Window和View之间由ViewRootImpl联系。 Activity的View层级就是如下: 应用窗口层级类型 WMS在进行应用窗口叠加时,会动态改变应用窗口的层值,但层值不会大于99。 public static final int FIRST_APPLICATION_WINDOW = 1; public static final int TYPE_BASE_APPLICATION = 1; public static final int TYPE_APPLICATION = 2; public static final int TYPE_APPLICATION_STARTING = 3; public static final int TYPE_DRAWN_APPLICATION = 4; public static final int LAST_APPLICATION_WINDOW = 99; 1.Activity的默认窗口层级为TYPE_BASE_APPLICATION。通过WindowManager.addView()将DecorView添加到窗口中。在ActivityThread中有这样一段代码: 2.Dialog默认的层级为TYPE_APPLICATION Dialog的创建: 1.创建Window(方法同Activity创建); 2.初始化DecorView,并将Dialog的视图添加进DecorView; 3.将DecorView添加到Window中显示。 同为TYPE_APPLICATION层级的也有ActionMode Windowmanager的LayoutParams构造方法如果不指定windowtype默认为TYPE_APPLICATION,所以Dialog在Activity中创建时不指定窗口层级默认为TYPE_APPLICATION。 在Service中创建Dialog并弹出时,跟Activity同样代码会报错。需要设置为WindowManager.LayoutParams.TYPE_SYSTEM_ALERT的系统窗口层级以上才可以正常显示。 3.TYPE_APPLICATION_STARTING 启动窗口,Z-Ordered应高于应用程序中的所有其他窗口。为Android12特有的启动画面StartingWindow 即包含SplashScreen。这里还涉及到SystemUI的WMShell组件,其中SplitScreen分屏模式、OneHanded单手模式、Freeform自由窗口模式、Bubble气泡通知窗口(Android Q)、PIP画中画模式等等系统模式窗口为WMShell处理的一部分。

mysql数据库封装

一、 //完成数据库的封装 const mysql= require('mysql') function db(sql) { return new Promise((resolve, reject) => { //1.配置连接 const conn = mysql.createConnection({ host: "127.0.0.1",//主机名 user: "root",//数据账号 password: "root",//数据库密码 database: "students",//要连接的数据库 charset: "utf8",//编码格式 }) //2.建立连接 conn.connect(err => { if (!err) { console.log('链接成功。。。。。'); } }) //3.执行操作 conn.query(sql, (err, data) => { if (err) { console.log('数据库操作失败:', err); // reject(err) resolve([err,null]) return } resolve([null,data]) }) //4.关闭连接 conn.end(); }); } module.exports=db; 二、 //完成数据库的封装 const mysql = require('mysql') //1.

启动并验证hive

如何启动hive 验证并启动mysql启动并验证hadoop连接hiveserver2手动启动:写脚本启动: 启动hive 验证并启动mysql mysql -uroot -p123456 启动并验证hadoop start-all.sh jps 连接hiveserver2 手动启动: /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore & /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 & 写脚本启动: 进入环境变量目录: cd /bin新建脚本文件: vim hiveserver echo =========== metastore ============ nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore & yes | command echo =========== hiveserver2 ========== nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 & yes | command yes | command yes | command n=1 until lsof -i:10000 do echo "监听连接中-----$n s"; n=$((n+1)); sleep 1; done echo '启动成功' 激活脚本

深度翻页导出导致慢SQL,mysqlCPU飙升优化方案

慢SQL原因分析: 1.深度翻页 2.多表JOIN 3. 大IN 4. id倒排序 本文针对深度翻页的优化进行探讨 方案1: 将limit offset, pageSize的方式改成 id > xx limit pageSize. 这样能走Id索引,提高速度。 缺点:不能使用多线程,入参ID从上页结果。 方案2: 基于 方案1再优化, 将limit offset, pageSize 的方式改成 id > startId and id< endId . 一次性查出符合条件的ID范围,然后切分ID范围进行查询。(可分实际ID划分,或逻辑范围划分) 优点: 能用多线程并发查询。 缺点:逻辑范围划分有的id范围可能无数据,进行无效查询。 方案3: 终极方案:设置fetchSize,思想是 一次查询在Mysql侧缓冲全量数据,程序侧通过游标cursor批量读取数据,通过回调函数resulthandler处理数据。 优点: 不用多次和Mysql查询,一次查询多次读取数据。回调里可以使用多线程操作数据。 缺点: Mysql要缓冲全量数据,内存飙升 方案二步骤: (1) 查询 对应表的ID范围,COUNT条数 (2) 根据count条数,和每页数量,计算页数,根据页数 和 ID范围进行ID范围切分。 (3)根据ID范围,发起多线程并发查询。 其中具体核心逻辑代码: ID范围查询 <!-- 统计分页查询总条数 --> <select id="findIdRange" resultType="com.xyy.ms.export.core.erpreport.dto.ExportIdRangeDTO"> select min(b.id) as minId, max(b.id) as maxId, count(1) as count from storage_batchnum b <include refid="

Rokid Jungle--Station pro

介绍和功能开发 YodaOS-Master操作系统:以交换计算为核心,实现单目SLAM空间交互,具有高精度、实时性和稳定性。发布UXR2.0SDK,为构建空间内容提供丰富的开发套件 多模态交互 算法原子化 多种开发工具协同 多生态支持 骁龙XR2+Gen1:4800W后置摄像头,支持NFC UXR 2.0 SDK:UXR2.0 SDK 是Rokid为Unity开发者提供的AR开发工具包,提供空间定位跟踪与手势交互等能力;UXR2.0 SDK 的运行平台为Rokid AR Studio。该SDK支持Unity2020.3及Unity2021.3的LTS版本。(注:获取SDK请阅读文档)更新时间:2023-08-26 MRTK接口 Rokid AR空间套件----Rokid AR Studio 功能开发 1空间构建--RKCameraRig 组件 搜索All,0DOF、3DOF、6DOF 2多模态交互--[RKInput]组件 在使用多模态交互[RKInput]组件之前,确保场景中已经加入RKCameraRig 组件 手势交互、phone3Dof射线交互、mouse交互 UI交互和物体交互 UI交互 UXR2.0 SDK 为开发者封装了PointableUI(PointableUI详解)预制体来进行UI 交互。 将该脚本绑定到Image 上 using UnityEngine.UI; public class UITest : MonoBehaviour, IPointerDownHandler, IPointerUpHandler { public void OnPointerDown(PointerEventData eventData) { GetComponent<Image>().color = Color.red;//按下 } public void OnPointerUp(PointerEventData eventData) { GetComponent<Image>().color = Color.white;//抬起 } } 与物体交互 手动挂载交互组件和碰撞Surface(要使物体可以相应射线交互,需要添加RayInteractable 脚本;为物体添加ColliderSurface,并将该Surface 赋值给RayInteractable 的Surface 属性;再为物体添加一个InteractableUnityEventWrapper,并将InteractableUnityEventWrapper 的InteractableView 属性配置为当前物体,就可以进行事件处理了。)

论文于祥读及复现——《VDO-SLAM: A Visual Dynamic Object-aware SLAM System》

论文详读之------《一个视觉动态对象感知SLAM系统》 0. 出发点(暨摘要)1.引言2. 相关工作2.1 探索针对动态环境的健壮SLAM2.2 分别执行SLAM和运动对象跟踪(MOT),作为传统SLAM的扩展,用于动态场景理解。2.3 对象SLAM(通常包括静态和动态对象)2.4 最近工作 3. 主要内容概括3.1 预处理3.1.1 对象实例分割3.1.2 光流估计 3.2 追踪3.2.1 模块一3.2.2 模块二 3.3 建图3.3.1 局部批量处理3.3.2 全局批量处理3.3.3 从建图到跟踪 4. 实验4.1 深度模型设置4.2 Oxford Multimotion数据集实验1.3.png 4.3 KITTI数据集实验4.3.1 相机位姿和物体运动4.3.2对象跟踪和速度4.3.3定性结果4.3.4讨论 5. 本文总结6. 个人读后感 论文网址:https://arxiv.org/pdf/2005.11052.pdf 源码网址:https://github.com/halajun/vdo_slam 0. 出发点(暨摘要) 将实时定位和建图(SLAM)估计与动态场景建模相结合,可以极大地促进机器人在动态环境中的自主性。机器人的路径规划和避障任务依赖于对场景中动态物体运动的准确估计。本文介绍了VDO-SLAM,这是一个健壮的视觉动态对象感知SLAM系统,它利用语义信息来实现对场景中动态刚性对象的精确运动估计和跟踪,而无需事先了解对象的形状或几何模型。该方法识别和跟踪环境中的动态对象和静态结构,并将这些信息集成到一个统一的SLAM框架中。最终获得高度精确的估计机器人的轨迹和物体的完整SE(3)运动,以及环境的时空地图。该系统能够从物体的SE(3)运动中提取线速度估计,为复杂动态环境中的导航提供了重要功能。我们在许多真实的室内和室外数据集上展示了所提出的系统的性能,结果显示出与最先进的算法相比,一致性和实质性的改进。源代码的开放源代码版本是可用的。 1.引言 下图1为视觉动态对象感知SLAM系统的框架。 Input为输入模块,输入为单目或者是双目的RGB图和深度图。首先立体深度估计都方法提取深度信息。为了充分利用基于图像的语义信息,同时采用了基于学习的单目系统,获得单目相机的深度信息;Pre-processing为预处理模块,主要进行对象实例分割和光流估计;Tracking为追踪模块,主要工作为特征检测、相机位姿估计、动态目标追踪和目标运动估计;Mapping为建图模块,主要进行局部批量优化和全局批量优化Output为最终的输出。 本文的主要贡献为: 在机器人位姿、静态和动态3D点以及物体运动的统一估计框架中对动态场景建模的新公式;准确估计SE(3)动态物体的运动,优于最先进的算法,以及一种提取物体在场景中的速度的方法;一种鲁棒的方法来跟踪运动对象利用语义信息与处理间接遮挡的能力,导致语义对象分割失败;在复杂和引人注目的现实世界场景中演示完整系统。 2. 相关工作 目前,在不同的研究目的下,对于动态场景下的SLAM的研究主要分为以下3类 2.1 探索针对动态环境的健壮SLAM 时期方法结果早期检测和删除动态场景中提取到的信息降低SLAM性能发展移除动态前景+修复获重建被遮挡的静态场景DynaSLAM经典几何+深度学习——>检测和移除动态对象多视角信息——>修复被遮挡的背景Light Field SLAM通过合成孔径成像(SAI)重建被遮挡的静态场景对重建的静态背景上的特征也进行了跟踪与利用较好的SLAM性能 所有的方法几乎都是将动态信息丢弃,但是这些被丢弃的信息对SLAM也许会有潜在的好处; 除了SLAM之外,理解动态信息对机器人的其他任务(如:规划、控制和避障)也至关重要 2.2 分别执行SLAM和运动对象跟踪(MOT),作为传统SLAM的扩展,用于动态场景理解。 时期方法结果最新将估计问题分解为两个独立的估计器以便实时更新两个滤波器并行解决运动中的结构和运动物体的跟踪问题系统输出统一包含静态结构和运行物体轨迹的的三维动态地图解决了动态物体的SLAM物体随后整合语义约束进一步赶紧3D重建最近基于立体的密集映射算法具有大规模动态环境中,准确高效地重建静态背景和运动物体的优势 证明了将多目标跟踪与SLAM相结合的可行性,适用于动态场景的探索。 通过适当的开发和建立机器人与静态背景、静态和动态物体之间的时空关系。证明了SLAM和多目标跟踪问题是相互有益的。 2.3 对象SLAM(通常包括静态和动态对象) 这种算法通常需要对三维物体进行特定的建模和表示,有三维形状、曲面或体积模型、几何模型等,提取高级原语并整合到SLAM框架中。 类型方法效果SLAM++该范式在物体表层表示杂乱的场景在相机和物体姿态之间构建显示图实现联合姿态图优化密集SLAM的同时重建、分割和识别提出一种新颖的3D物体识别算法保证系统的鲁棒性提高估计物体姿态的准确性MaskFusion采用表面表示对场景中的物体进行建模和重建无需预先了解对象模型MID-Fusion采用基于八叉树的体积模型构建多目标动态SLAM系统无需预先了解对象模型 2.4 最近工作 类型方法效果最近使用基本集合来表示对象复杂度低、易于集成到SLAM框架中Quadric-SLAM紧凑参数化物体的大小和三维姿态将检测到的物体表示为椭球体将二次参数直接约束为几何误差并与相机位姿一起在因子图SLAM中进行联合估计CubeSLAM将二维和三维目标检测与SLAM相结合多视图捆绑调整与点和相机一起优化 仍然存在的问题: 以上方法都能证明被检测对象和SLAM之间的利用关系,但是主要关注的都是静态场景下的对象检测和SLAM,本文沿着这一方向,在SLAM框架内解决动态目标跟踪的挑战性问题,并利用动态目标与智能机器人、静态和动态结构之间的关系来获得潜在的优势。 3. 主要内容概括 对于论文还没有进行公式推理,所以此处先进行的系统分析。

java中的BigDecimal详解及使用

文章目录 1 BigDecimal简介1.1 构造函数1.1.1 构造API1.1.2 使用 1.2 方法1.2.1 方法API1.2.2 加法操作1.2.3 除法方法1.2.3.1 引出问题1.2.3.2 解决方法1.2.3.2.1 方法一1.2.3.2.2 方法二 1.2.4 BigDecimal和格式化 1 BigDecimal简介 BigDecimal是由任意精度的整数非标度值和32位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal表示的数值是(unscaledValue × 10-scale) 双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算 1.1 构造函数 1.1.1 构造API BigDecimal类的主要构造器和方法 构造器描述BigDecimal(int)创建一个具有参数所指定整数值的对象BigDecimal(double)创建一个具有参数所指定双精度值的对象BigDecimal(long)创建一个具有参数所指定长整数值的对象BigDecimal(String)创建一个具有参数所指定以字符串表示的数值的对象 1.1.2 使用 主要测试参数类型为double和String的两个常用构造函数 BigDecimal adouble =new BigDecimal(1.22); System.out.println("construct with a double value: " + adouble); BigDecimal astring = new BigDecimal("1.22"); System.out.println("construct with a String value: " + astring); 输出结果会是什么呢?如果你没有认为第一个会输出1.22,那么恭喜你答对了,输出结果如下: construct with a doublevalue:1.2199999999999999733546474089962430298328399658203125 construct with a String value: 1.

性能测试 —— 吞吐量和并发量的关系? 有什么区别?

吞吐量(Throughput)和并发量(Concurrency)是性能测试中常用的两个指标,它们描述了系统处理能力的不同方面。 吞吐量(Throughput) 是指系统在单位时间内能够处理的请求数量或事务数量。它常用于评估系统的性能和容量。 在软件测试领域,吞吐量通常用来衡量系统在一定负载下能够处理的请求或事务的数量。对于一个高并发的系统,吞吐量的大小直接关系到系统的性能和稳定性。 吞吐量的计算方式可以根据具体的场景而有所不同。一种常见的计算方式是通过每秒完成的事务数来衡量。例如,一个电商网站每秒钟能够处理100个订单,那么它的吞吐量就是100 TPS(Transactions Per Second)。另一种计算方式是通过每秒钟处理的请求数量来衡量。例如,一个API服务器每秒钟能够处理1000个请求,那么它的吞吐量就是1000 QPS(Queries Per Second)。 在进行性能测试时,我们通常会通过模拟真实用户的行为或者生成大量的请求来测试系统的吞吐量。通过监测系统在不同负载下的吞吐量,可以评估系统的性能瓶颈、优化效果以及系统是否能够承受预期的工作量。 并发量(Concurrency) 是指系统能够同时处理的请求数量或事务数量。它描述了系统在同一时间段内可以同时执行的任务数。 在软件测试和系统设计中,并发量是一个重要的指标,用来衡量系统的并发处理能力和性能。并发量通常与系统的资源、线程数量以及处理能力相关。 并发量可以通过两个角度来理解: 用户并发量:表示系统能够同时处理的用户请求或并发连接数量。例如,一个Web服务器能够同时处理1000个并发用户请求,那么它的并发量就是1000。 事务并发量:表示系统能够同时处理的事务或任务数量。例如,一个数据库管理系统能够同时处理100个并发事务,那么它的并发量就是100。 并发量对于系统设计和性能优化非常重要。如果系统的并发量超过了系统所支持的范围,可能会导致系统性能下降、响应时间延长甚至系统崩溃。因此,在进行系统设计和性能测试时,需要充分考虑并发量,并保证系统能够合理处理并发请求,确保系统的稳定性和性能。 现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。 如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受 可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛 分享他们的经验,还会分享很多直播讲座和技术沙龙 可以免费学习!划重点!开源的!!! qq群号:110685036 吞吐量和并发量之间存在密切的关系。 并发量是指系统能够同时处理的请求数量或事务数量,它描述了系统在同一时间段内可以同时执行的任务数。而吞吐量是指系统在单位时间内能够处理的请求数量或事务数量。 从定义上看,吞吐量是对并发量的衡量,是并发量的一个衍生指标。并发量决定了系统同时能处理多少请求或事务,而吞吐量则表示在给定的并发量下,系统实际每秒能够完成的请求数量或事务数量。 在性能测试中,我们通过模拟并发请求来测试系统的性能,并监测系统的吞吐量。在增加并发负载的情况下,我们可以观察到系统的吞吐量随着并发量的增大而变化。通常情况下,在并发量较低的情况下,系统的吞吐量可能会逐渐增加,直到达到某个临界点。当并发量继续增加时,系统的吞吐量可能会趋于饱和或者开始下降,因为系统已经达到了自身的极限或者出现了性能瓶颈。 因此,吞吐量和并发量之间存在一种相互影响和制约的关系。通过对系统的并发量和吞吐量进行测试和分析,可以帮助我们了解系统的性能状况、找出系统的性能瓶颈,并进行相应的优化和调整,以提高系统的性能和稳定性。 吞吐量和并发量是两个不同的概念,但在性能测试中经常会一起讨论。 吞吐量(Throughput)指单位时间内系统处理的请求数量或数据量。例如,一个Web服务器每秒钟能够处理100个请求,那么它的吞吐量就是100 req/s。吞吐量可以用来评估系统的处理能力和性能,通常越高越好。 并发量(Concurrency)指同时处理的请求数量或用户数。例如,一个应用程序能够同时支持1000个并发用户,那么它的并发量就是1000。并发量可以用来评估系统的并发处理能力和承载能力,通常越高越好。 虽然吞吐量和并发量都涉及到单位时间内的处理能力,但区别在于吞吐量关注的是总体的处理能力,而并发量则关注的是同时处理的请求数量或用户数。在实际系统设计和性能测试中,我们需要综合考虑吞吐量和并发量,并根据具体需求进行优化和评估。 今天的分享就到此结束了,大家还有什么不懂的可以评论区下提问哈,如果我的文章对你有所帮助的话,可以点赞三联支持一下哈 最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 软件测试面试文档 我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。