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

053 性能压测 单机锁 setnx

文章目录

  • 性能压测-压力测试
    • 索引
    • thymeleaf
    • nginx
    • 减少数据库查询(代码有bug)
    • 缓存
  • 安全
    • 单机锁(防止缓存击穿)
    • setnx
  • pom.xml

性能压测-压力测试

1 响应时间(Response Time: RT):响应时间指用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,整个过程所耗费的时间。
HPS(Hits Per Second):每秒点击次数,单位是次/秒
TPS(Transaction per Second):系统图每秒处理交易数,单位是笔/秒
OPS(Query per Second):系统每秒处理查询次数,单位是次/秒
2 性能测试主要关注如下三个指标:
吞吐量:每秒钟系统能够处理的请求数、任务数
响应时间:服务处理一个请求或一个任务的耗时
错误率:一批请求中结果出错的请求所占比例
https://jmeter.apache.org/download_jmeter.cgi

索引

索引

thymeleaf

spring:thymeleaf:cache: true

nginx

conf.d

location /static {root /usr/share/nginx/html;}location / {proxy_set_header Host $host;proxy_pass http://cubemall;}

减少数据库查询(代码有bug)

    /*** 获取三级分类* @return*/@Overridepublic List<CategoryVo> getLevel1Categorys() {//改为查询所有分类List<CategoryEntity> selectList = baseMapper.selectList(null);List<CategoryEntity> categoryEntities = getParentId(selectList,0);List<CategoryVo> CategoryVoList = categoryEntities.stream().map(categoryEntity -> {CategoryVo categoryVo = new CategoryVo();BeanUtils.copyProperties(categoryEntity, categoryVo);//查询一级分类下的二级分类List<CategoryEntity> level2Categorys = getParentId(selectList,categoryEntity.getId());//将当前一级分类下的二级分类封装成Voif (level2Categorys != null) {List<Category2Vo> category2VoList = level2Categorys.stream().map(level2Category -> {Category2Vo category2Vo = new Category2Vo();category2Vo.setId(level2Category.getId().toString());category2Vo.setName(level2Category.getName());category2Vo.setCategory1Id(categoryEntity.getId().toString());//查询二级分类下的三级分类List<CategoryEntity> level3Categorys = getParentId(selectList,level2Category.getId());//将当前二级分类下的三级分类封装到Voif (level3Categorys != null) {List<Category3Vo> category3VoList = level3Categorys.stream().map(level3Category -> {Category3Vo category3Vo = new Category3Vo();category3Vo.setId(level3Category.getId().toString());category3Vo.setName(level3Category.getName());category3Vo.setCategory2Id(category2Vo.getId());return category3Vo;}).collect(Collectors.toList());category2Vo.setCategory3VoList(category3VoList);}return category2Vo;}).collect(Collectors.toList());categoryVo.setCategory2VoList(category2VoList);}return categoryVo;}).collect(Collectors.toList());return CategoryVoList;}private List<CategoryEntity> getParentId(List<CategoryEntity> selectList, Integer parentId) {List<CategoryEntity> collect = selectList.stream().filter(item -> {return item.getParentId() == parentId;}).collect(Collectors.toList());return collect;}

缓存

缓存使用

    /*** 使用redis改造三级分类* @return*/public List<CategoryVo> getLevel1Categorys() {//1.从缓存中查询数据String categoryJSON = redisTemplate.opsForValue().get("categoryJSON");if (StringUtils.isEmpty(categoryJSON)) {//2.缓存中没有数据,查询数据库,从数据库查询分类数据List<CategoryVo> categoryJsonFromDb = getCategoryJsonFromDb();//3.查询的数据放入缓存中,将对象转换为json传入redisTemplate.opsForValue().set("categoryJSON", JSON.toJSONString(categoryJsonFromDb));return categoryJsonFromDb;}//4.如果缓存中有数据,将查询出的数据转换为java对象,指明转为的对象类型List<CategoryVo> categoryVos = JSON.parseObject(categoryJSON, new TypeReference<List<CategoryVo>>() {});return categoryVos;}

安全

单机锁(防止缓存击穿)

单机锁

/*** 使用redis改造三级分类* @return*/public List<CategoryVo> getLevel1Categorys() {//1.从缓存中查询数据String categoryJSON = redisTemplate.opsForValue().get("categoryJSON");if (StringUtils.isEmpty(categoryJSON)) {System.out.println("缓存不命中,查询数据库。。。");//2.缓存中没有数据,查询数据库,从数据库查询分类数据List<CategoryVo> categoryJsonFromDb = getCategoryJsonFromDb();return categoryJsonFromDb;}System.out.println("缓存命中。。。");//4.如果缓存中有数据,将查询出的数据转换为java对象,指明转为的对象类型List<CategoryVo> categoryVos = JSON.parseObject(categoryJSON, new TypeReference<List<CategoryVo>>() {});return categoryVos;}/*** 获取三级分类* @return*/public List<CategoryVo> getCategoryJsonFromDb() {synchronized (this){//得到锁之后,去查看缓存中是否有数据,如果没有数据,继续查询数据库String categoryJSON = redisTemplate.opsForValue().get("categoryJSON");if(!StringUtils.isEmpty(categoryJSON)){List<CategoryVo> categoryVos = JSON.parseObject(categoryJSON, new TypeReference<List<CategoryVo>>() {});return categoryVos;}System.out.println("查询了数据库。。。");//改为查询所有分类List<CategoryEntity> selectList = baseMapper.selectList(null);List<CategoryEntity> categoryEntities = getParentId(selectList,0);List<CategoryVo> CategoryVoList = categoryEntities.stream().map(categoryEntity -> {CategoryVo categoryVo = new CategoryVo();BeanUtils.copyProperties(categoryEntity, categoryVo);//查询一级分类下的二级分类List<CategoryEntity> level2Categorys = getParentId(selectList,categoryEntity.getId());//将当前一级分类下的二级分类封装成Voif (level2Categorys != null) {List<Category2Vo> category2VoList = level2Categorys.stream().map(level2Category -> {Category2Vo category2Vo = new Category2Vo();category2Vo.setId(level2Category.getId().toString());category2Vo.setName(level2Category.getName());category2Vo.setCategory1Id(categoryEntity.getId().toString());//查询二级分类下的三级分类List<CategoryEntity> level3Categorys = getParentId(selectList,level2Category.getId());//将当前二级分类下的三级分类封装到Voif (level3Categorys != null) {List<Category3Vo> category3VoList = level3Categorys.stream().map(level3Category -> {Category3Vo category3Vo = new Category3Vo();category3Vo.setId(level3Category.getId().toString());category3Vo.setName(level3Category.getName());category3Vo.setCategory2Id(category2Vo.getId());return category3Vo;}).collect(Collectors.toList());category2Vo.setCategory3VoList(category3VoList);}return category2Vo;}).collect(Collectors.toList());categoryVo.setCategory2VoList(category2VoList);}return categoryVo;}).collect(Collectors.toList());//3.查询的数据放入缓存中,将对象转换为json传入redisTemplate.opsForValue().set("categoryJSON", JSON.toJSONString(CategoryVoList),1, TimeUnit.DAYS);return CategoryVoList;}}private List<CategoryEntity> getParentId(List<CategoryEntity> selectList, Integer parentId) {List<CategoryEntity> collect = selectList.stream().filter(item -> {return item.getParentId() == parentId;}).collect(Collectors.toList());return collect;}

setnx

setnx

    /*** 获取三级分类(redis分布式锁)* @return*/public List<CategoryVo> getCategoryJsonFromWithRedisLock() {String uuid = UUID.randomUUID().toString();//1.占分布式Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid,30,TimeUnit.SECONDS);if (lock){//加锁成功,执行业务//设置过期时间//redisTemplate.expire("lock",30,TimeUnit.SECONDS);//List<CategoryVo> dataFromDb = getDataFromDb();//删除锁
//            String lockValue = redisTemplate.opsForValue().get("lock");
//            if (uuid.equals(lockValue)) {
//                //删除自己的锁
//                redisTemplate.delete("lock");
//            }List<CategoryVo> dataFromDb = null;try {dataFromDb = getDataFromDb();} finally {//删除锁String script = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";redisTemplate.execute(new DefaultRedisScript<Integer>(script, Integer.class), Arrays.asList("lock"), uuid);}return dataFromDb;} else {//加锁失败,重试return getCategoryJsonFromWithRedisLock();//自旋}}private List<CategoryVo> getDataFromDb() {//得到锁之后,去查看缓存中是否有数据,如果没有数据,继续查询数据库String categoryJSON = redisTemplate.opsForValue().get("categoryJSON");if(!StringUtils.isEmpty(categoryJSON)){List<CategoryVo> categoryVos = JSON.parseObject(categoryJSON, new TypeReference<List<CategoryVo>>() {});return categoryVos;}System.out.println("查询了数据库。。。");//改为查询所有分类List<CategoryEntity> selectList = baseMapper.selectList(null);List<CategoryEntity> categoryEntities = getParentId(selectList,0);List<CategoryVo> CategoryVoList = categoryEntities.stream().map(categoryEntity -> {CategoryVo categoryVo = new CategoryVo();BeanUtils.copyProperties(categoryEntity, categoryVo);//查询一级分类下的二级分类List<CategoryEntity> level2Categorys = getParentId(selectList,categoryEntity.getId());//将当前一级分类下的二级分类封装成Voif (level2Categorys != null) {List<Category2Vo> category2VoList = level2Categorys.stream().map(level2Category -> {Category2Vo category2Vo = new Category2Vo();category2Vo.setId(level2Category.getId().toString());category2Vo.setName(level2Category.getName());category2Vo.setCategory1Id(categoryEntity.getId().toString());//查询二级分类下的三级分类List<CategoryEntity> level3Categorys = getParentId(selectList,level2Category.getId());//将当前二级分类下的三级分类封装到Voif (level3Categorys != null) {List<Category3Vo> category3VoList = level3Categorys.stream().map(level3Category -> {Category3Vo category3Vo = new Category3Vo();category3Vo.setId(level3Category.getId().toString());category3Vo.setName(level3Category.getName());category3Vo.setCategory2Id(category2Vo.getId());return category3Vo;}).collect(Collectors.toList());category2Vo.setCategory3VoList(category3VoList);}return category2Vo;}).collect(Collectors.toList());categoryVo.setCategory2VoList(category2VoList);}return categoryVo;}).collect(Collectors.toList());//3.查询的数据放入缓存中,将对象转换为json传入redisTemplate.opsForValue().set("categoryJSON", JSON.toJSONString(CategoryVoList),1, TimeUnit.DAYS);return CategoryVoList;}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.18.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.xd.cubemall</groupId><artifactId>cubemall-product</artifactId><version>0.0.1-SNAPSHOT</version><name>cubemall-product</name><description>cubemall-product</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.SR3</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency><!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><!--当修改页面后不需要再重启项目--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><!--引入common公共模块--><dependency><groupId>com.xd.cubemall</groupId><artifactId>cubemall-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!--添加模板技术渲染页面--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--阿里云OSS-->
<!--        <dependency>-->
<!--            <groupId>com.aliyun.oss</groupId>-->
<!--            <artifactId>aliyun-sdk-oss</artifactId>-->
<!--            <version>3.17.4</version>-->
<!--        </dependency>--></dependencies><dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.1.0.RELEASE</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

相关文章:

053 性能压测 单机锁 setnx

文章目录 性能压测-压力测试索引thymeleafnginx减少数据库查询&#xff08;代码有bug&#xff09;缓存 安全单机锁&#xff08;防止缓存击穿&#xff09;setnx pom.xml 性能压测-压力测试 1 响应时间&#xff08;Response Time: RT&#xff09;&#xff1a;响应时间指用户从客…...

【天线】IFA天线知识点摘抄

MIFA天线的尺寸与性能关系 1&#xff0c;辐射效率 天线越小&#xff0c;辐射效率越低。唯一好处是减少PCB占用空间 2&#xff0c;带宽 一般MIFA天线在2.4G频段内的带宽&#xff1a;S11≤-10dB的范围为2.44GHz230MHz。较小的尺寸可能会限制带宽 3&#xff0c;增益 MIFA天线的…...

Mysql视图有什么作用?你是否使用过视图?

MySQL视图&#xff08;View&#xff09;是一种虚拟表&#xff0c;其内容由查询定义。视图并不实际存储数据&#xff0c;而是基于一个或多个表的查询结果生成。以下是关于MySQL视图的详细说明&#xff1a; 1. 视图的定义 概念&#xff1a;视图是一个虚拟表&#xff0c;其内容由…...

【vue项目如何利用event-stream实现文字流式输出效果】

引言 在现代 Web 应用中&#xff0c;实时数据展示是一个常见需求&#xff0c;例如聊天消息逐字显示、日志实时推送、股票行情更新等。传统的轮询或一次性数据加载方式无法满足这类场景的流畅体验&#xff0c;而 流式传输&#xff08;Streaming&#xff09; 技术则能实现数据的…...

微信问题总结(onpageshow ,popstate事件)

此坑描述 订单详情某按钮点击&#xff0c;通过window.location.href跳转到&#xff08;外部&#xff09;第三方链接后&#xff0c;回退后&#xff0c;在ios中生命周期和路由导航钩子都失效了&#xff0c;无法触发。 在安卓中无视此坑&#xff0c; 回退没有问题 解决 原因&am…...

【Gin-Web】Bluebell社区项目梳理3:社区相关接口开发

本文目录 一、接口详情1. 获取分类社区列表接口2. 根据id查询社区 二、值类型与引用类型 一、接口详情 跟社区有关的接口详情如下。 1. 获取分类社区列表接口 首先是Controller层&#xff0c;然后跳转到Logic层业务逻辑的开发。 这是Logic层&#xff0c;再做一次跳转&#…...

Unity 聊天气泡根据文本内容适配

第一步 拼接UI 1、对气泡图进行九宫图切割 2、设置底图pivot位置和对齐方式 pivot位置&#xff1a;&#xff08;0&#xff0c;1&#xff09; 对齐方式&#xff1a;左上对齐 3、设置文本pivot位置和对齐方式&#xff0c;并挂上布局组件 pivot设置和对齐方式和底图一样&#…...

对学习编程语言的一些理解

目录 一、代码运行的过程 二、跨平台的实现 1&#xff09;C/C 2&#xff09;C# 3&#xff09;Java 三、总结 一、代码运行的过程 开发程序无论使用何种编程语言&#xff0c;至少都需要经历编码、编译、连接和运行这么4个过程&#xff0c;C语言是这样&#xff0c;Java语言…...

MySQL MHA 部署全攻略:从零搭建高可用数据库架构

文章目录 1.MHA介绍2.MHA组件介绍3.集群规划4.服务器初始化5.MySQL集群部署5.1 安装MySQL集群5.2 配置一主两从5.3 测试MySQL主从5.4 赋予MHA用户连接权限 6.安装MHA环境6.1 安装MHA Node6.2 安装MHA Manager 7.配置MHA环境8.MySQL MHA高可用集群测试8.1 通过VIP连接MySQL8.2模…...

windows怎样查看系统信息(处理器等)

首先打开命令行工具 win R 输入 cmd&#xff0c; 输入 msinfo32 &#xff0c;然后回车 这个页面就可以看到 电脑的锐龙版就是 AMD 芯片 酷睿版就是 intel 芯片...

007 HBuilderX提示IDE service port disabled. To use CLI Call, open IDE

描述 微信小程序 工具的服务端口已关闭 解决方案 在HBuider的菜单“运行”选择“运行到小程序模拟器-微信开发者工具”时&#xff0c;步骤如图&#xff1a; 提示&#xff1a;IDE service port disabled. To use CLI Call, open IDE -> Settings -> Security Settings,…...

计算机网络之TCP的可靠传输

上一篇内容可能比较多&#xff0c;显得比较杂乱&#xff0c;这一篇简单总结一下TCP是靠什么实现可靠传输的吧。 校验和 TCP是端到端的传输&#xff0c;由发送方计算校验和&#xff0c;接收方进行验证&#xff0c;目的是为了验证TCP首部和数据在发送过程中没有任何改动&#x…...

Python爬虫系列教程之第十四篇:爬虫项目部署、调度与监控系统

大家好&#xff0c;欢迎继续关注本系列爬虫教程&#xff01; 在前面的文章中&#xff0c;我们已经详细讲解了如何构建爬虫、如何处理反爬、如何实现分布式爬虫以及如何使用 Scrapy 框架开发高效的爬虫项目。随着项目规模的不断扩大&#xff0c;如何将爬虫项目稳定部署到生产环境…...

线程与进程的深入解析及 Linux 线程编程

在操作系统中&#xff0c;进程和线程是进行并发执行的两种基本单位。理解它们的区别和各自的特点&#xff0c;能够帮助开发者更好地进行多任务编程&#xff0c;提高程序的并发性能。本文将探讨进程和线程的基础概念&#xff0c;及其在 Linux 系统中的实现方式&#xff0c;并介绍…...

在ubuntu上用Python的openpyxl模块操作Excel的案例

文章目录 安装模块读取Excel数据库取数匹配数据和更新Excel数据 在Ubuntu系统的环境下基本职能借助Python的openpyxl模块实现对Excel数据的操作。 安装模块 本次需要用到的模块需要提前安装(如果没有的话) pip3 install openpyxl pip3 install pymysql在操作前&#xff0c;需…...

【OS安装与使用】part6-ubuntu 22.04+CUDA 12.4运行MARL算法(多智能体强化学习)

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 下载源码并安装2.2.2 安装缺失的依赖项2.2.3 训练执行MAPPO算法实例 三、疑问四、总结 一、待解决问题 1.1 问题描述 已配置好基础的运行环境&#xff0c;尝试运行MARL算法。 1…...

【Python爬虫(35)】解锁Python多进程爬虫:高效数据抓取秘籍

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

HarmonyOS 开发套件 介绍 ——上篇

HarmonyOS 开发套件 介绍 ——上篇 在当今科技飞速发展的时代&#xff0c;操作系统作为智能设备的核心&#xff0c;其重要性不言而喻。而HarmonyOS&#xff0c;作为华为推出的全新操作系统&#xff0c;正以其独特的魅力和强大的功能&#xff0c;吸引着越来越多的开发者和用户的…...

Linux 高级篇 日志管理、定制自己的Linux系统、备份与恢复

一、日志管理 &#xff08;1&#xff09;基本介绍 日志文件是重要的系统信息文件&#xff0c;记录了如用户登录、系统启动、系统安全、邮件及各种服务等相关重要系统事件在安全方面&#xff0c;日志也至关重要&#xff0c;它能记录系统日常发生的各类事情&#xff0c;可用于检…...

deepseek与其他大模型配合组合

DeepSeek与其他大模型的配合组合&#xff0c;展现了其在多个领域中的强大应用潜力和灵活性。以下是对DeepSeek与其他大模型配合组合的详细分析&#xff1a; 一、DeepSeek与华知大模型的组合 背景介绍&#xff1a; 华知大模型是同方知网与华为联手打造的&#xff0c;具备全学科…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...