文章目录 6.消息重复消费问题6.1问题介绍6.2解决思路6.3将该消息存储到Redis6.3.1将id存入string(单消费者场景)(1)实现思路(2)问题 6.3.2将id存入list中(多消费场景)(1)实现思路 6.3.3将id以key增量存入string中并设置过期时间(1)实现思路 6.4总结 6.消息重复消费问题 6.1问题介绍 什么是消息重复消费?首先我们来看一下消息的传输流程。消息生产者–>MQ–>消息消费者;消息生产者发送消息到MQ服务器,MQ服务器存储消息,消息消费者监听MQ的消息,发现有消息就消费消息。
所以消息重复也就出现在 两个阶段
1 :生产者多发送了消息给MQ;
2 :MQ的一条消息被消费者消费了多次。
具体场景如下:
生产者发送消息给MQ,在MQ确认的时候出现了网络波动,生产者没有收到确认,这时候生产者就会重新发送这条消息,导致MQ会接收到重复消息。消费者消费成功后,给MQ确认的时候出现了网络波动,MQ没有接收到确认,为了保证消息不丢失,MQ就会继续给消费者投递之前的消息。这时候消费者就接收到了两条一样的消息。由于重复消息是由于网络原因造成的,无法避免。 6.2解决思路 发送消息时让每个消息携带一个全局的唯一ID在消费消息时先判断消息是否已经被消费过,保证消息消费逻辑的幂等性。具体消费过程为: 消费者获取到消息后先根据id去查询redis/db是否存在该消息如果不存在,则正常消费,消费完毕后写入redis/db如果存在,则证明消息被消费过,直接丢弃 6.3将该消息存储到Redis 6.3.1将id存入string(单消费者场景) (1)实现思路 将id号存入value中,并且value类型为string即以队列名称为key,以消息id为值每次消息过来都覆盖之前的消息 @RabbitListener(queues = "queueName4")//发送的队列名称 @RabbitListener注解到类和方法都可以 @RabbitHandler public void receiveMessage1(Message message) throws UnsupportedEncodingException { //获取唯一id String messageId = message.getMessageProperties().getMessageId(); String msg = new String(message.getBody(),"utf-8"); //获取redis中该队列名称对应的value值 String messageRedisValue = redisUtil.get("queueName4",""); //检验唯一id是否存在 if (messageRedisValue.equals(messageId)) { //存在 return; } System.out.println("消息:"+msg+", id:"+messageId); //以队列为key,id为value redisUtil.set("queueName4",messageId); } (2)问题 并发冲突:如果多个消费者同时操作 Redis 中的已消费消息列表,由于 Redis 是单线程处理命令,可能会出现并发冲突导致数据不一致或丢失问题。特别是在高并发情况下,使用字符串类型的 ID 可能会增加并发冲突的风险内存占用:字符串类型的 ID 在内存中占用空间相对较大,尤其是对于大量消息的情况下,会增加 Redis 的内存占用。比较效率:字符串类型的 ID 比较起来相对复杂,需要进行字符串比较操作。 6.
其实过程也很简单的,首先我们需要保证网络畅通
我们可以先去看看ScreenShotToCode的官网
这里点击一下这个
https://screenshottocode.com/ 官网的登录,去使用GitHub账号登录,然后去看看
可以看到登录以后,然后我们再去点击getStarted,就可以看到,显示
15美元,去生成100次,可以,或者输入自己的OpenAI API Key使用
可以看到左上角是它可以支持的生成的,代码的种类,可以看到直接使用在线的也可以:
Screenshot to Code在这个网址,使用git hub登录成功以后,然后,点击右上角getstarted
然后进入这个页面,然后
可以看到收费标准,15美元一个月,生成100个信用,100个信用是100次代码生成权限
也就是大概130一个月,还是挺贵的,然后如果使用自己的OpenAI API key的话,那么
可以自己去申请
可以看到如果是按年订阅1300多一年
To use Screenshot to Code, subscribe (100 generations for $15) or use your own OpenAI API key with GPT4 vision access (follow these instructions to deposit a minimum $5 credit and obtain a key). 可以看到需要15美元100次生成.或者使用自己的OpenAI API key也可以GPT4 然后 需要自己申请OpenAI API key会便宜一点
点击右下角付费订阅的时候,可以看到,可以使用银行卡付款
然后左上角的设置,这里,可以看到如果付费以后会给一个access code可以输入到这里
一、调优概述
二、数据倾斜发生时的现象
三、数据倾斜发生的原理
四、如何定位导致数据倾斜的代码
五、某个task执行特别慢的情况
六、某个task莫名其妙内存溢出的情况
七、查看导致数据倾斜的key的数据分布情况
八、数据倾斜的解决方案:
解决方案一:使用 Hive ETL 预处理数据解决方案二:过滤少数导致倾斜的key解决方案三:提高shuffle操作的并行度解决方案四:两阶段聚合(局部聚合+全局聚合)解决方案五:将reduce join转为map join解决方案六:采样倾斜key并分拆join操作解决方案七:使用随机前缀和扩容RDD进行join解决方案八:多种方案组合使用 一、调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性能会比期望差很多。数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能。
二、数据倾斜发生时的现象 绝大多数task执行得都非常快,但个别task执行极慢。比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时。这种情况很常见。原本能够正常执行的Spark作业,某天突然报出OOM(内存溢出)异常,观察异常栈,是我们写的业务代码造成的。这种情况比较少见。
三、数据倾斜发生的原理 数据倾斜的原理很简单:在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或join等操作。此时如果某个key对应的数据量特别大的话,就会发生数据倾斜。比如大部分key对应10条数据,但是个别key却对应了100万条数据,那么大部分task可能就只会分配到10条数据,然后1秒钟就运行完了;但是个别task可能分配到了100万数据,要运行一两个小时。因此,整个Spark作业的运行进度是由运行时间最长的那个task决定的。
因此出现数据倾斜的时候,Spark作业看起来会运行得非常缓慢,甚至可能因为某个task处理的数据量过大导致内存溢出。
下图就是一个很清晰的例子:hello这个key,在三个节点上对应了总共7条数据,这些数据都会被拉取到同一个task中进行处理;而world和you这两个key分别才对应1条数据,所以另外两个task只要分别处理1条数据即可。此时第一个task的运行时间可能是另外两个task的7倍,而整个stage的运行速度也由运行最慢的那个task所决定。
四、如何定位导致数据倾斜的代码 数据倾斜只会发生在shuffle过程中。这里给大家罗列一些常用的并且可能会触发shuffle操作的算子:distinct、groupByKey、reduceByKey、aggregateByKey、join、cogroup、repartition等。出现数据倾斜时,可能就是你的代码中使用了这些算子中的某一个所导致的。
五、某个task执行特别慢的情况 首先要看的,就是数据倾斜发生在第几个stage中。如果是用yarn-client模式提交,那么本地是直接可以看到log的,可以在log中找到当前运行到了第几个stage,可以看下之前写的Hive数据倾斜:Hive 数据倾斜问题定位排查及解决
如果是用yarn-cluster模式提交,则可以通过Spark Web UI来查看当前运行到了第几个stage。
此外,无论是使用yarn-client模式还是yarn-cluster模式,我们都可以在Spark Web UI上深入看一下当前这个stage各个task分配的数据量,从而进一步确定是不是task分配的数据不均匀导致了数据倾斜。
比如下图中,倒数第三列显示了每个task的运行时间。明显可以看到,有的task运行特别快,只需要几秒钟就可以运行完;而有的task运行特别慢,需要几分钟才能运行完,此时单从运行时间上看就已经能够确定发生数据倾斜了。此外,倒数第一列显示了每个task处理的数据量,明显可以看到,运行时间特别短的task只需要处理几百KB的数据即可,而运行时间特别长的task需要处理几千KB的数据,处理的数据量差了10倍。此时更加能够确定是发生了数据倾斜。
知道数据倾斜发生在哪一个stage之后,接着我们就需要根据stage划分原理,推算出来发生倾斜的那个stage对应代码中的哪一部分,这部分代码中肯定会有一个shuffle类算子。
精准推算stage与代码的对应关系,需要对Spark的源码有深入的理解,这里我们可以介绍一个相对简单实用的推算方法:只要看到Spark代码中出现了一个shuffle类算子或者是Spark SQL的SQL语句中出现了会导致shuffle的语句(比如group by语句),那么就可以判定,以那个地方为界限划分出了前后两个stage。这里我们就以Spark最基础的入门程序——单词计数来举例,如何用最简单的方法大致推算出一个stage对应的代码。如下示例,在整个代码中,只有一个reduceByKey是会发生shuffle的算子,因此就可以认为,以这个算子为界限,会划分出前后两个stage。
stage0,主要是执行从textFile到map操作,以及执行shuffle write操作。shuffle write操作,我们可以简单理解为对pairs RDD中的数据进行分区操作,每个task处理的数据中,相同的key会写入同一个磁盘文件内。stage1,主要是执行从reduceByKey到collect操作,stage1的各个task一开始运行,就会首先执行shuffle read操作。执行shuffle read操作的task,会从stage0的各个task所在节点拉取属于自己处理的那些key,然后对同一个key进行全局性的聚合或join等操作,在这里就是对key的value值进行累加。stage1在执行完reduceByKey算子之后,就计算出了最终的wordCounts RDD,然后会执行collect算子,将所有数据拉取到Driver上,供我们遍历和打印输出。 val conf = new SparkConf() val sc = new SparkContext(conf) val lines = sc.textFile("hdfs://...") val words = lines.flatMap(_.split(" ")) val pairs = words.map((_, 1)) val wordCounts = pairs.
文章目录 一、图形界面下启动mysql服务二、在命令行重新启动mysql服务3 推荐阅读4 源码获取: Windows系统下,MySQL服务的启动,常见的两种启动方式如下: 一、图形界面下启动mysql服务 在图形界面下启动mysql服务的流程如下(windows10操作系统):
找到此电脑,右击选择”管理”;
选择”服务”选项;
在目录中寻找”MySQL”相关服务;
鼠标右击,选择”属性®”打开
点击按键“启动”救会开启mysql服务,此时会显示已开启MySQL80服务,刷新服务目录也会显示已启用MySQL服务。如此一来,通过图形界面启动MySQL服务便已完成。
二、在命令行重新启动mysql服务 系统任务栏上的搜索栏中输入CMD或者命令提示符,然后右键点击以管理员身份运行。
net stop mysql
有一些电脑是
net stop mysql57 net stop mysql80 终止目前的mysql服务;
假如显示如下的报错,则说明目前用户的管理权限不够,必须进到管理员权限才能操作,这时返回桌面,以管理员身份运行cmd,再度输入net stop mysql命令。此次mysql服务就被成功终止了。
输入net start mysql,就可以再次启动mysql服务了。
有一些电脑是
net start mysql57 net start mysql80 3 推荐阅读 Java基于SpringBoot的在线学习平台
Java基于SpringBoot的实习管理系统
基于SpringBoot的在线考试系统网站
Java基于 SpringBoot 的人事管理系统
4 源码获取: 大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻
👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟
2022-2024年最全的计算机软件毕业设计选题大全:1000个热门选题推荐✅
Java项目精品实战案例《100套》
Java微信小程序项目实战《100套》
Python项目实战《100套》
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及文档编写等相关问题都可以给我留言咨询,希望帮助更多的人
Repaly是一款集成了人工智能伴奏提取和AI翻唱功能的音频处理工具。同时支持win和mac,它旨在为用户提供从音频文件中提取伴奏以及利用AI技术进行音乐翻唱创作的全方位解决方案。Repaly的主要特点包括高效准确的伴奏提取功能,通过先进的信号处理算法和深度学习模型,能够精确地分离出音乐中的背景音乐或乐器声音。同时,它还集成了AI翻唱功能,利用深度学习技术模仿人声并将其应用到音频文件中,实现自动化的音乐翻唱。用户可以选择不同的音乐风格和声音特点,生成符合自己需求的翻唱音频。
AI翻唱工具离线版,简单易操作,实现所有歌曲一键翻唱,并附上25个声音模型,工具已打包好,附下载方式
① 下载整合包后,解压,双击Windows_Replay-3.3.0-installer.exe文件安装
② 安装好之后,打开这个替换文件夹,打开替换路径
③ 复制这串路径,再随便打开一个文件夹,粘贴到文件夹路径栏,回车
④ 然后在整合包中复制这个文件夹,粘贴替换到文件目录中
⑤ 然后打开程序,也可以双击桌面的图标打开
⑥ 系统会提示更新,点击“Not now”,就可以一直免费使用
⑦ 下方有内置的声音模型,如果你有训练好的模型,可以直接拖进去,整合包中给大家准备了25个声音模型
⑧ 放入一首想要翻唱的歌,选择好之后,点击创造歌曲
下载地址: https://www.qianxun1688.com/details/D1EE6158
最后,软件在本地运行AI算力,会消耗CPU和GPU,推荐运行内容在8G以上的机器运行
1、支付方式选择 2、交互流程 3、1. 对接准备 2.加密解密 + 签名验签 3.沙箱环境 4、内网穿透 5、二维码 6、下单 7、异步通知回调 8、查询支付结果 9、退款 10、通用版SDK
需求:系统A对接支付宝,实现支持用户扫码支付
1、支付方式选择 对接的API文档:
https://open.alipay.com/api
可选的支付方式有:
扫码付:出示付款码或者用户扫码付款
APP支付:在APP中唤起支付宝
手机网站支付:在移动端网页中唤起支付宝 App 或支付宝网页
电脑网站支付:在PC端唤起支付宝App或者网页登录支付宝账户
刷脸付:需硬件支持
商家扣款:类似每月会员扣款
预授权支付:冻结对应额度,交易完成后给商家
JSAPI支付:小程序
这里选择扫码付的方式,点击下单后,返回支付二维码,用户扫码支付。
2、交互流程 画个下单流程的时序图:
图片
大致流程:
用户下单,系统A组装信息后(订单信息、回调地址、签名),调用支付宝预下单接口,返回二维码链接
系统A将二维码链接转二维码图片
用户扫码,唤醒本地支付宝,完成支付
支付宝返回支付成功信息给用户
支付宝异步通知系统A支付成功的消息(回调地址),如果用户支付成功,支付宝就调用回调地址的API,回调接口中自然是系统A收到用户支付成功消息后的动作
上一步如果通知失败,比如网络异常或支付宝调用异步通知接口时系统A正好挂了 ⇒ 可主动调支付宝提供的查询支付结果接口,或者加定时任务轮询来查询交易状态,如3s-5s
还可以考虑在第一步请求支付宝接口时加上二维码的有效时间,过期就重新发起
查询支付结果流程:
图片
退款流程同上查询支付结果。PS:注意下单、退款过程中,相关订单的业务数据落库到系统A。
3、对接准备 1)加密解密 + 签名验签 支付信息不能在网络上明文传输,以防被篡改。系统A到支付宝的方向,采用:
支付宝公钥加密 + 系统A的私钥签名(系统A做的事)
支付宝私钥解密 + 系统A的公钥验签(收到信息后,支付宝做的事)
同理,支付宝返回支付结果时,就是在支付宝中用系统A的公钥加密+支付宝的私钥签名,传输到系统A后,则是先用支付宝的公钥验签,再用系统A的私钥解密支付结果
图片
2)沙箱环境 调试过程中,可采用支付宝提供的沙箱环境,点击右上角控制台,登录后选择沙箱:
图片
这里有一套可调试的APPID、系统A的公钥、密钥、支付宝的公钥、支付宝的网关地址,以及商家账户和用户账户(用于后续登录沙箱版本支付宝APP完成支付)
图片
图片
点击【沙箱工具】侧边栏,下载沙箱版支付宝APP,等于上面的买家账户。
3)内网穿透 前面提到,用户支付成功后,支付宝需要回调系统A接口来通知系统A,但我的开发环境在内网,支付宝访问不到,考虑做内网穿透,让支付宝通知到一个中转地址,再由中转地址到我的内网。穿透工具选择cpolar,下载地址 https://dashboard.
大家好!
今天给大家分享一些AI绘画工具。
1.Stable diffusion Stable Diffusion是一种基于潜在扩散模型的文本到图像生成模型,开源且可独立安装部署,也可以使用云端部署(收费)。
它能够从文本描述中生成详细的图像,虽然免费且强大,但是使用Stable Diffusion需要高性能电脑,且因为是本地部署,所以对关键词没有限制,但提示词门槛高,上手有点难度。
官网:https://stability.ai/
2.Midjourney Midjourney是由人工智能研究实验室Midjourney, Inc.开发的Al图像生成工具,可以根据输入的文本提示生成图像。该程序最早于2022年7月12日进入公开测试阶段,用户可以通过Discord的机器人指令进行操作,创作出许多不同风格的图像作品。
类似于OpenAl的DALL-E和StabilityAl的Stable Diffusion,该Al绘画工具只需用户输入想到的文字,就能通过人工智能创建相对应的图片,耗时只有大约一分钟。不同之处在于,Midjourney目前尚需通过Discord社区来进行Al图图片的生成。
官网:https://www.midjourney.com/home
Midjourney的主要功能
1.文本到图像生成:在Discord中使用/imagine命令后,输入文本提示词,即可生成对应描述的图片
2.图像混合创意叠图:使用/blend命令,可以将多张图片合并以创建融合型风格的全新图片,激发独特创意
3.图像扩展和平移:Midjourney支持在上下左右四个方向平移图像扩展画面内容,还支持zoomout外绘缩放画面主体
4.图像高清放大:Midjourney默认生成1024*1024像素的图片,支持最高放大图像4倍
Midjourney的产品定价
Midjourney目前提供有四个订阅级别,按年支付可享受20%的折扣。每个订阅计划都包括访问Midjourney会员图库、官方Discord、一般商业使用等。
1.Basic Plan基础版:10美元每月(年付96美元)
2.Standard Plan标准版:30美元每月(年付288美元)
3.ProPlan专业版:60美元每月(年付576美元)
4.Mega Plan大型版:120美元每月(年付1152美元)
Midjourney的使用方法
1.登录或注册Discord账号:由于Midjourney目前需要通过Discord社区来生成图片,所以首先需要Discord账户
2.选择一个付费版本订阅:访问midjourney.com/account,使用Discord帐户登录,选择一个订阅计划
3.在Discord上加入Midjourney服务器:访问https://discord.com/invite/midjourney点击接受邀请加入该服务器
4.切换到#General或#Newbie频道:在Discord上找到并选择标有general或newbie的任何频道
5.使用/imagine命令生成图片:在输入框键入/imagine指令,然后输入提示词描述,即可生成图片
3.DALL·E3 OpenAI 开发 DALL 系列图像生成 AI 已经有一段时间了,DALL-E3 是它的最新版本。
另外,由于它是 OpenAI 开发的 AI,我们使用了联网功能向 ChatGPT 询问了 DALL-E3 的功能!
ChatGPT 只能将 DALL-E3 用于付费的 Plus 版和 Enterprise 版用户。
需要魔法上网,IP地址最好是美国,不然容易被屏蔽。
界面比较简洁,输入文字描述,就能快速生成一张AI创作的艺术画作;它还能根据你提供的原画作,拓展延伸画出画布外面的画面;还可以对原画作进行编辑,如在画面中添加/删除一个元素,同时兼顾阴影、反射、材质等;以原画作为灵感创造出新的作品。
入口在Chatgpt-4的顶部,看下图!
4.奇域 网址:http://www.qiyuai.net简介:表达中式审美的AI绘画创作社区,扎根于中国文化和中式审美的AI绘画创作社区。每一位创作者都是华夏艺术宝藏的“寻宝师” 功能特点:
极具中国文化和中式审美
轻松上手
汇聚众多AI绘画头部创作者
交流氛围极佳的互动社群
从0开始接入Unity IAP 欢迎进入Unity内购系列整体流程介绍第一篇(内购接入)接入环境一、创建空工程二、添加IAP插件三、写代码四、Google后台配置五、IOS后台配置六、打包测试七、Demo 欢迎进入Unity内购系列 你好! 这将是一个系列的文章
第一篇 介绍客户端里支付的调起以及购买。
第二篇 介绍后台对购买结果的验证以及发货(IOS)。
第三篇 介绍后台对购买结果的验证以及发货(Android)。
第四篇 介绍后台对内购退单问题的处理(IOS欺诈检测以及欺诈信息反馈)。
整体流程介绍 我们是用的Unity客户端+PHP后台。
客户端内完成内购 -> 内购结果发送给PHP后台 -> PHP后台向IOS或Google后台请求验证订单真实性 -> 验证通过则进行发货 -> 正常情况到此就结束了
非正常情况:如果玩家后期在IOS或Google申请退款,如果退款成功,则IOS或Google会向我们提供的接口发送通知,这时我们需要对退款订单进行处理
第一篇(内购接入) 本篇介绍unity里内购插件IAP的接入,这一篇只包含客户端内支付的调起以及购买。
流程非常简单,不需要开启Unity Service等服务,也不需要Google后台服务公钥,只需5分钟即可完成接入,只需要按照我的流程,就一定能成功。
接入环境 本篇介绍unity里内购插件IAP的接入,这一篇只包含客户端内支付的调起以及购买。
unity版本: 2021.3.21f1;其中JDK、NDK、SDK使用unity自带的。IAP版本: 4.10.0; 一、创建空工程 使用2021.3.21f1创建3D核心模板空工程
二、添加IAP插件 1、打开Package Manager,选择Unity Register,找到In App Purchasing,点击Install。
2、IAP导入完成之后会有一个弹窗让我们Link Project,这里我们不用管,选Close就可以了。
不要选Link Project,因为那些是给单机游戏用的,需要客户端内自己验证订单的情况下要选Link Project,然后还要填入Google的公钥以及其他设置。
三、写代码 1、创建UI,新建2个按钮,一个挂载脚本的空物体。
2、新建脚本,代码如下,将脚本拖到空物体上。
3、给按钮点击事件赋值。
using System; using UnityEngine; using UnityEngine.Purchasing; using UnityEngine.Purchasing.Extension; using UnityEngine.UI; public class MyIAP : MonoBehaviour, IDetailedStoreListener { IStoreController m_StoreController; // The Unity Purchasing system.
一、 中标麒麟系统安装 下载中标麒麟桌面操作系统软件(兆芯版)V7.0镜像文件,在虚拟机安装中标麒麟系统,安装过程不详细赘述,跟windows类似。国产操作系统、麒麟操作系统——麒麟软件官方网站
二、 达梦数据库安装 1. 下载dm8镜像文件
2. 在opt下创建dm8文件夹,把数据iso文件上传到该文件夹下
3. 在根目录创建dm8
4. 修改配置文件 vim ~/.bash_profile
增加 export DM_HOME=/dm8
export PATH=$DM_HOME/bin:$DM_HOME/tool:$PATH:$HOME/bin
5. source ~/.bash_profile 刷新配置文件
6. 在home下创建dm8临时目录,然后执行以下命令:
export DM_INSTALL_TMPDIR=/home/dm8
7. 挂在iso文件,进入iso存放位置,执行命令:,挂载到mnt目录
mount dm8_20220525_x86_rh6_64.iso /mnt/
8. 进入mnt,执行
9. 安装目录为/dm8
三、redis安装 安装模式跟liunx一样,请参照liunx进行安装
启动:./bin/redis-server redis.conf 启动redis命令
ps -ef | grep redis 查看redis进程
Kill -p 端口号 杀死进程
四、minIO安装 1. 创建目录
sudo mkdir /usr/local/minio
2. 下载安装包
sudo wget https://dl.min.io/server/minio/release/linux-amd64/minio
3. 赋予执行权限
chmod +x minio
4. 启动minio
1.为什么要保证顺序 消息队列中的若干消息如果是对同一个数据进行操作,这些操作具有前后的关系,必须要按前后的顺序执行,否则就会造成数据异常。举例:
比如通过mysql binlog进行两个数据库的数据同步,由于对数据库的数据操作是具有顺序性的,如果操作顺序搞反,就会造成不可估量的错误。比如数据库对一条数据依次进行了 插入->更新->删除操作,这个顺序必须是这样,如果在同步过程中,消息的顺序变成了 删除->插入->更新,那么原本应该被删除的数据,就没有被删除,造成数据的不一致问题。
2.出现顺序错乱的场景 (1)rabbitmq
①一个queue,有多个consumer去消费,这样就会造成顺序的错误,consumer从MQ里面读取数据是有序的,但是每个consumer的执行时间是不固定的,无法保证先读到消息的consumer一定先完成操作,这样就会出现消息并没有按照顺序执行,造成数据顺序错误。
rabbitmq消息顺序错乱第一种情况示意图.png
②一个queue对应一个consumer,但是consumer里面进行了多线程消费,这样也会造成消息消费顺序错误。
abbitmq消息顺序错乱第二种情况示意图.png
3.保证消息的消费顺序 (1)rabbitmq
①拆分多个queue,每个queue一个consumer,就是多一些queue而已,确实是麻烦点;这样也会造成吞吐量下降,可以在消费者内部采用多线程的方式取消费。
一个queue对应一个consumer
②或者就一个queue但是对应一个consumer,然后这个consumer内部用内存队列做排队,然后分发给底层不同的worker来处理
一个queue对应一个consumer,采用多线程.png
一、Linux下安装Redis 1、下载Redis2、连接Linux(或者VMwear)3、进入redis目录下4、Redis是基于c语言编写的需要安装依赖,需要安装gcc:5、redis默认安装路径:/usr/local/bin6、将redis配置文件复制到bin目录下(先新建文件夹然后再将redis配置文件coyp进去)7、redis默认不是后台启动,更改启动方式8、启动redis-server服务9、使用redis-cli连接测试10、查看redis的进程是否开启(新开一个绘画)11、如何关闭redis服务12、设置Redis开机自启动13、性能测试 1、下载Redis Redis官网:https://redis.io/
历史版本:
http://download.redis.io/releases
本文中安装的版本为:http://download.redis.io/releases/redis-7.0.5.tar.gz
2、连接Linux(或者VMwear) 我们安装的是linux版本的redis,这里用的是云服务器所以需要远程连接,这里使用的是xshell连接到服务器,没有服务器的话也可以使用虚拟机,这里不过多赘述。
打开xftp我们需要先将我们的Redis上传到服务器上
上传文件:
解压安装包:
程序一般放在opt下 ,我们可以使用命令将文件移动到对应目录:
mv redis-7.0.5.tar.gz /opt 使用命令对Redis文件进行解压:
tar zxvf redis-7.0.5.tar.gz 3、进入redis目录下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9XsutmcD-1683894704945)(D:/USB/Typora%E5%9B%BE%E7%89%87/image-20221109152311141.png)]
4、Redis是基于c语言编写的需要安装依赖,需要安装gcc: yum install gcc-c++ 查看gcc版本:
gcc -v 输入make命令配置Gcc需要的文件:
make 执行成功后:
在次进行make:
make make install确认所有都安装完成:
make install 5、redis默认安装路径:/usr/local/bin 6、将redis配置文件复制到bin目录下(先新建文件夹然后再将redis配置文件coyp进去) 我们要将配置文件复制一份,我们以后就是用这个配置文件来启动。
mkdir redisconfig cp /opt/redis-7.0.5/redis.conf redisconfig 我们之后就是用这个文件启动
7、redis默认不是后台启动,更改启动方式 有关redis配置文件的一些说明:
然后修改redis.conf文件中的一些配置
# 允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0 bind 0.0.0.0 # 守护进程,修改为yes后即可后台运行 daemonize yes # 密码,设置后访问Redis必须输入密码 requirepass 123321 Redis的其它常见配置:
# 监听的端口 port 6379 # 工作目录,默认是当前目录,也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录 dir .
1:问题现象 在进行Android平台需求移植的过程中,在某一应用中添加了注册广播相关的代码,在编译完成后出现了,应用停止运行或闪退的现象
log问题:根据操作与log日志的观察,发现在点击应用应用停止运行时抛出了报错,如下
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.soundrecorder/com.sprd.soundrecorder.RecorderActivity}: java.lang.SecurityException: com.android.soundrecorder: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts... 2:代码检查 根据代码分析到走入下面方法后就没有走出来:
根据上面log与此处代码判断是注册广播出现了某个问题。
3:分析解决 搜索后知道:
对比Android13,Android14对广播,注册context-registered接收器时需要 指定导出标志 。
如:
Android13:
registerReceiver(mReceiver, intentFilter); Android14:
registerReceiver(mReceiver, intentFilter,Context.RECEIVER_EXPORTED); 即给registerReceiver方法增加第三个参数:
RECEIVER_EXPORTED
或者
RECEIVER_NOT_EXPORTED
先安装docker Docker安装详情
安装Nginx镜像 1、拉去取Nginx镜像 Nginx官方镜像
docker pull nginx 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest ) docker pull nginx:xxx 下载指定版本的Nginx镜像 (xxx指具体版本号) 我们拉去1.24.0的nginx镜像
docker pull nginx:1.24.0 2、查看镜像 docker images 查看镜像
3、创建Nginx配置文件 启动前需要先创建Nginx外部挂载的配置文件/home/nginx/conf/nginx.conf之所以要先创建 , 是因为Nginx本身容器只存在/etc/nginx 目录 , 本身就不创建 nginx.conf 文件当服务器和容器都不存在 nginx.conf 文件时, 执行启动命令的时候 docker会将nginx.conf 作为目录创建 4、创建挂载目录 # 创建挂载目录 mkdir -p /home/nginx/conf mkdir -p /home/nginx/log mkdir -p /home/nginx/html 容器中的nginx.conf文件和conf.d文件夹复制到宿主机
5、先生成容器并把nginx对应配置放入本地文件夹一份 # 生成容器 docker run --name nginx -p 80:80 -d nginx:1.24.0 # 将容器nginx.conf文件复制到宿主机 docker cp nginx:/etc/nginx/nginx.
目录 调试流程看我另一个链接
[游戏开发][Unity] IOS调试与发布-CSDN博客[游戏开发][Unity] IOS调试与发布https://blog.csdn.net/liuyongjie1992/article/details/136836480
打包前注意事项 使用Xcode导出安装包之前,必须先确认账户的所有合约是否全部同意,如果有不同意的,在出包的时候会弹出报错
点击前往苹果开发者官网https://appstoreconnect.apple.com/agreements/
登录自己的开发者账户后,可以看到提示,有未同意的合约
还有一点要注意的是,Xcode工程在导出安装包之前,执行build必须没有错误。
发布前设置 如果你导入了_dis证书,则上传的是正式包,如果你导入的是_dev证书,则发布的是TestFlight包,当然上传还得选择Archive选项导出Archive包。
Build报错记录
Command PhaseScriptExecution failed with a nonzero exit code
双击可以查看报错信息,这个报错是因为Unity给我们xcode工程生成了一个sh文件,但运行它的时候有语法错误,我直接把整个运行sh的地方删了。因为它考虑的armv7,咱们不考虑,都是arm64了。
/Users/hailong/Documents/ZhangMenXcode/Unity-iPhone.xcodeproj has conflicting provisioning settings. is automatically signed, but provisioning profile ZMDJ_dis has been manually specified. Set the provisioning profile value to "Automatic" in the build settings editor, or switch to manual signing in the Signing & Capabilities editor.
这个问题就是,如果你自己选择了手动输入证书,则设置界面不允许选择autumatic自动选择任何东西。
确认编译运行Scheme,这一步很关键,直接决定项目运行编译能否通过
第一步 先在Xcode中,菜单栏 => Product=> Archive 开始打包Archive,右上角显示打包Archive进度
Ollama简介 Ollama是一个创新的平台,它允许用户在本地启动并运行大型语言模型。它提供了一个简单易用的内容生成接口,类似于OpenAI,但无需开发经验即可直接与模型进行交互。Ollama支持热切换模型,为用户提供了灵活性和多样性。
安装Ollama 要安装Ollama,请访问官方网站的下载页面:Ollama下载页面。在这里,你可以根据你的操作系统选择合适的版本进行下载,目前,Ollama支持macOS 11 Big Sur或更高版本。
macOS用户 对于macOS用户,可以直接点击下载链接获取Ollama的压缩包:Download for macOS。
Windows用户 对于Windows用户,可以参照上述链接中的步骤进行安装,安装过程中,你可以通过注册来接收新更新的通知。
使用Ollama 安装完成后,你可以通过命令行查看Ollama的可用命令。例如,在Windows的PowerShell中,输入ollama即可查看帮助信息和可用命令。
PS C:\Users\Admin> ollama Usage: ollama [flags] ollama [command] Available Commands: serve Start ollama create Create a model from a Modelfile show Show information for a model run Run a model pull Pull a model from a registry push Push a model to a registry list List models cp Copy a model rm Remove a model help Help about any command Flags: -h, --help help for ollama -v, --version Show version information Use "
项目介绍 一直想做一款酒店管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套管理系统。学习过程中遇到问题可以咨询留言。
在线体验 http://hotel.gitapp.cn/
源码地址 https://github.com/geeeeeeeek/python_hotel
界面预览 功能介绍 系统分为后台和前台两部分。
后台的主要功能:
房间管理:管理系统可以录入、修改和查询房间的基本信息,如房间名称、配套、价格、备注等。类型管理:系统可以管理房间的类型信息,包括类型的名称等。标签管理:管理标签录入、修改和查询标签的信息。评论管理:管理和浏览整个网站的评论信息。订单管理:管理和浏览整个网站的订单信息。用户管理:管理和浏览网站的用户信息,可以新增、编辑和删除用户。统计分析:系统可以根据房间的活动数据和会员参与度进行统计和分析,帮助管理员了解整个系统的状况。消息管理:房间管理员可以在系统上发布消息,整个网站的用户都能收到。系统信息:管理员可以查看系统的基本信息,包括系统名称、服务器信息、内存信息、cpu信息、软件信息等。 前台的主要功能:
注册登录:用户通过注册和登录后,才能使用网站。门户浏览:用户进入首页后,可以浏览房间列表信息,包括最新、最热、推荐。智能推荐:详情页右侧的热门推荐。用户中心:包括用户基本资料修改、用户邮箱推送、消息。我的订单:包括我预订的房间的信息。模糊搜索:顶部搜索功能,支持模糊搜索房间信息。房间评论:详情页下侧用户可以评论房间。 开发环境 后端: Python 3.8 + Django 3.2前端: Javascript + Vue数据库:MySQL 5.7开发平台:Pycharm + vscode运行环境:Windows 10/11 关键技术 前端技术栈 ES6、vue、vuex、vue-router、vue-cli、axios、antd后端技术栈 Python、Django、pip 后端技术 django框架 Django是一款基于Python开发的全栈式一体化Web应用框架。2003年问世之初,它只是美国一家报社的内部工具,2005年7月使用BSD许可证完成了开源。Django采用MTV设计模式,即Model(模型)+ Template(模板)+ View(视图)。它遵循MVC设计,并且内置了对象关系映射(ORM)层,使得开发者无需关心底层的数据存取细节,可以更专注于业务逻辑的开发。
Django的目的是削减代码量,简单且迅速地搭建以数据库为主体的复杂Web站点。它是全栈式框架,因此安装起来很简单,而且使用者众多。这使得Django除具有完备的官方文档之外,还有大量的关联文档、丰富的第三方库可供使用。与其他框架相比,Django用起来要轻松得多。
优点:
提供了定义序列化器Serializer的方法。可以快速根据Django ORM或者其他库自动序列化或反序列化。提供了丰富的类视图MIXIN扩展类。可以简化视图的编写。具有丰富的定制层级。包括函数视图、类视图,还可以将视图与自动生成API结合,满足各种需求。支持多种身份认证和权限认证方式。内置了限流系统。 前端技术 npm:node.js的包管理工具,用于统一管理我们前端项目中需要用到的包、插件、工具、命令等,便于开发和维护。ES6:Javascript的新版本,ECMAScript6的简称。利用ES6我们可以简化我们的JS代码,同时利用其提供的强大功能来快速实现JS逻辑。vue-cli:Vue的脚手架工具,用于自动生成Vue项目的目录及文件。vue-router: Vue提供的前端路由工具,利用其我们实现页面的路由控制,局部刷新及按需加载,构建单页应用,实现前后端分离。vuex:Vue提供的状态管理工具,用于统一管理我们项目中各种数据的交互和重用,存储我们需要用到数据对象。Ant-design:基于MVVM框架Vue开源出来的一套前端ui组件。 运行步骤 后端运行步骤 (1) 安装mysql数据库,启动服务
(2) 打开cmd命令行,进入mysql,并新建数据库
mysql -u root -p CREATE DATABASE IF NOT EXISTS python_hotel DEFAULT CHARSET utf8 COLLATE utf8_general_ci; (3) 恢复sql数据
use xxx source xxxx.
目录
一.前期准备
二.主数据库服务器的操作
1.主数据库需要新建发布向导
2.配置分发服务器
3.配置快照文件夹
4.选择需要分发的数据库
5.选择发布类型
6.选择要发布的对象
7.筛选数据设置
8.指定何时运行快照
9.选择安全设置
10.创建发布
11.填写发布名称,点击完成
三.从数据库服务器的操作
1.新建订阅
2.选择发布服务器 3.选择分发代理
4.选择订阅服务器和订阅数据库
5.配置分发代理安全性
6.配置同步计划
7.配置初始化订阅 8.创建订阅 9.完成向导 四.发布状态监测
1.启动复制监视器 2.查看同步状态,并启动 一.前期准备 1.源端的表,需要添加主键;
2.检查主库的所有者必须为sa;
3.检查主库的排序规则,备库要和主库的排序规则要一致;
4.建议安装与源端一致的操作系统和数据库版本或相近版本;
5.启动sqlserver 代理服务;
6.主库服务器的主机名不要和备库服务器的主机名一样;
7.在备库服务器可以通过主机名的方式访问主库。
二.主数据库服务器的操作 1.主数据库需要新建发布向导 右键点击本地发布并选择新建发布;
2.配置分发服务器 3.配置快照文件夹 需要先将文件夹配置共享文件夹,设置共享权限,添加所有人,权限为读取/写入
4.选择需要分发的数据库 5.选择发布类型 事务复制:
数据几乎是实时更新的,只要发布服务器上有事务提交,分发代理就会立即将更改传递给订阅服务器。这意味着在事务复制的情况下,理论上数据几乎是瞬时同步的。
快照复制:
快照复制不是实时更新的,而是定期(如每天、每周或自定义间隔)生成并分发数据库的完整快照。订阅服务器上的表将在下次快照应用时更新数据。
6.选择要发布的对象 7.筛选数据设置 这里我们要复制表的所有数据所以不做设置
8.指定何时运行快照 我们选择初始话数据,并选择默认的运行快照频率,也可以点击更改进行自定义;
9.选择安全设置 10.创建发布 11.填写发布名称,点击完成 三.从数据库服务器的操作 1.新建订阅 2.选择发布服务器 3.选择分发代理 4.选择订阅服务器和订阅数据库 5.配置分发代理安全性 6.配置同步计划 7.配置初始化订阅 8.创建订阅 9.完成向导 四.发布状态监测 1.启动复制监视器 2.查看同步状态,并启动
探索ExcelJS:新一代JavaScript库,让你在Web上优雅地处理电子表格 项目地址:https://gitcode.com/guyonroche/exceljs
项目简介 ExcelJS 是一个轻量级且强大的JavaScript库,允许开发者在浏览器端或者Node.js环境中生成、读取和修改Excel文件。无论你是需要创建动态报告、导出复杂数据,还是希望提供一种用户友好的方式来交互数据,ExcelJS都能成为你的得力助手。
技术分析 文件格式支持 ExcelJS 支持最新的ECMAScript标准,并且兼容多种Excel文件格式,包括老式的.xls 和现代的 .xlsx(基于OpenXML标准)。这意味着你可以用它处理大多数用户可能拥有的任何Excel文件。
API 设计 其API设计简洁直观,易于上手。例如,你可以通过类似数组的方式来操作工作表和单元格,这使得从零开始构建一个新的电子表格或者修改已存在的变得极其简单:
const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('My Sheet'); worksheet.addRow(['Hello', 'World']); 性能优化 ExcelJS 使用流式处理机制,即使处理大量数据也能保持良好的性能。这意味着即使在内存有限的设备或低性能服务器上,也能流畅地生成和读取大文件。
动态渲染与导出 借助于它的HTML5 Canvas支持,ExcelJS可以将电子表格以交互式的HTML形式呈现出来,这对于实现在线预览功能非常有用。此外,只需调用一个方法,就能将整个工作簿导出为.xlsx文件,方便用户下载。
应用场景 数据可视化:生成带有交互数据的表格,用于数据分析或报表。用户输入处理:允许用户直接在Web页面上编辑Excel文件,然后保存到服务器。数据导入与导出:从Excel文件中读取数据,或将应用内数据导出为Excel格式。教育与协作工具:构建在线课程或团队协作平台时,提供便捷的数据交换方式。 特点概览 全面的文件格式支持 - 支持.xls 和 .xlsx 格式。易用的API - 类似于JSON的对象模型简化了操作流程。高性能 - 采用流式处理和内存管理策略,处理大数据高效稳定。实时预览与导出 - 实现了HTML5 Canvas的渲染和一键导出功能。跨环境 - 在浏览器和Node.js环境下均能无缝运行。 结语 如果你在寻找一款能够帮助你在Web上优雅处理Excel文件的库,那么ExcelJS无疑是一个值得尝试的选择。其强大的功能、易用的API和出色的性能,定会为你的开发工作带来便利。现在就动手试试吧!让我们一起探索ExcelJS的世界,开启全新的数据之旅。
项目地址:https://gitcode.com/guyonroche/exceljs
꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱
ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶
个人主页:xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
系列专栏:xiaoxie的JAVA系列专栏——CSDN博客●'ᴗ'σσணღ*
我的目标:"团团等我💪( ◡̀_◡́ ҂)" ( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝+关注(互三必回)!
一.红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何 一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。
二.红黑树的性质 1. 每个结点不是红色就是黑色 2. 根节点是黑色的 3. 如果一个节点是红色的,则它的两个孩子结点是黑色的【没有2个连续的红色节点】
4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点
5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点) 三.红黑树的插入 红黑树是在二叉搜索树的基础上加上其平衡限制条件,因此红黑树的插入可分为两步:
1. 按照二叉搜索的树规则插入新节点
2. 检测新节点插入后,红黑树的性质是否造到破坏 因为新节点的默认颜色是红色,因此:如果其双亲节点的颜色是黑色,没有违反红黑树任何性质,则不需要 调整;但当新插入节点的双亲节点颜色为红色时,就违反了性质三不能有连在一起的红色节点,此时需要对 红黑树分情况来讨论: 这里解释一下为什么新插入的节点是红色的,因为假如插入节点的节点是黑色的,那么为了要满足性质4对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点就需要再插入节点为了满足性质4,这样就浪费很多空间,而要是新插入的节点是红色的,我们只需要调整颜色即可.
约定:cur为当前节点,p为父节点,g为祖父节点,u为叔叔节点
1.情况一: cur为红,p为红,g为黑,u存在且为红 出现这种情况情况,我们先需要把p和u 变成黑色,然后再把g变成红色即可.
这个时候,还需要考虑到
1.g为根节点,只需要在调整结束后,把它变为黑色即可
2.g有双亲节点,且为红色就需要将g当成cur,继续向上调整。(如果双亲节点,为黑色,p和g 变成黑色,然后再把g变成红色后就不违反红黑树的性质了)
这里再解释一下为什么要把把p和u变成黑色,然后再把g变成红色.
1.首先把p变成红色是因为cur为红色,p也为红色的话就违反了性质3,不能有两个连续的红色节点,所以需要把p变成黑色.
2.为什么要把u变成黑色是因为性质4,每条路径要有相同路径的黑色节点,如果u为红色,p为黑色就不满足该性质,所以要把u变成黑色
3.为什么要把g变成红色,因为假如g还有双亲节点的话,且双亲节点为黑色,那么,由于p和u变成了黑色,为了要满足,性质4,每条路径要有相同路径的黑色节点,就需要增加黑色节点的个数,所以需要把g变成红色,p和u变成黑色,就满足了性质4
2.情况二:cur为红,p为红, g为黑,u不存在/u为黑 就是因为在出现情况一之后,调整,p,u,g的颜色导致了情况二的发生
我们该如何调整调整使它满足红黑树的五条性质呢,我们可以发现,仅仅简单的改变颜色并不可以满足红黑树的五条性质,这个时候我们可以发现,这个情况是不是很像AVL树树中的左树高于,右数的情况,这个时候对于AVL树来说,可以使用右旋来解决这个问题,我们是不是也可以通过旋转操作可以调整节点的位置,然后只要在稍微改变个边节点的颜色即使它满足红黑树的性质.
探秘LocalAI:在本地实现智能化应用的新框架 项目简介 LocalAI是一个开源项目,旨在帮助开发者在本地环境中快速搭建和运行人工智能应用,无需云端依赖。该项目由Mudler发起,提供了一套简单易用的接口和工具,使得非AI专业人员也能轻松地将AI功能集成到自己的项目中。
技术分析 LocalAI的核心是其轻量级的模型管理器和灵活的数据处理流程。以下是它的主要技术特点:
模型封装:项目提供了多种预训练模型,如图像识别、文本分类等,并进行了封装,只需几行代码即可调用。
离线运行:所有计算都在本地进行,数据不需上传至云服务器,保护了用户的隐私和数据安全。
API友好:设计了一套简洁明了的API接口,方便开发者快速集成到现有系统。
跨平台支持:支持多种操作系统,包括Windows、macOS和各种Linux发行版。
易于扩展:对于需要自定义或新模型的场景,LocalAI允许用户导入TensorFlow、PyTorch等深度学习库构建的模型。
应用场景 由于其灵活性和隐私保护特性,LocalAI可广泛应用于以下场景:
智能家居:在物联网设备上实现本地化的语音识别和智能控制。移动应用:为应用添加实时的图像分析或自然语言处理能力,提高用户体验。企业内部工具:用于数据分析和报告生成,提升工作效率。隐私敏感项目:如医疗健康领域,确保患者数据的安全性。 特点与优势 高效:本地运行,无网络延迟,响应速度快。隐私:数据不出设备,避免了数据泄露的风险。可定制化:针对特定需求,可轻松调整或替换模型。社区驱动:开源项目,持续更新和优化,有活跃的开发者社区支持。 结语 如果你想在你的项目中加入AI功能,但又担心云端服务的成本和数据安全问题,那么LocalAI无疑是理想的选择。通过它,你可以更简单、更自由地实现本地化的人工智能应用。现在就访问,开始探索并参与到LocalAI的世界吧!让我们一起推动本地AI的发展,创造更多的可能性。