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

常见问题整理

DevOps 和 CICD

DevOps

全称Development & Operation
一种实现开发和运维一体化的协同模式,提供快速交付应用和服务的能力
用于协作:开发,部署,质量测试 整体生命周期工作内容,最终实现持续继承,持续部署,持续交付

DevOps 平台组成部分:

代码托管 git,svn
项目管理:jira 禅道 Teambition
运维平台:腾讯蓝鲸 /自主研发平台
持续交付:jenkins /gitlab

DevOps 是理念,不是具体某个工具
部分观点:Development & operations collaboration Means faster and smaller releases

CICD

CI-Continus integration
多名开发人员在开发不同代码过程中,可以频繁的将代码行合并到一起并相互不影响工作

CICD:

行为规范循环操作流:
Plan—>code—>build—>test—>release—>deploy—>operate—>monitor—>plan->….

Git 分布式持续集成工具

发布流程:
基于master 拉去分支development
基于开发分支开发,单元测试,sonar质量扫描
Code review
合并到master上,进行build,单元测试
Build docker image
部署到test env
Smoke test
进行QA系统测试(压力测试&功能性测试)
System test
预发布,QA测试,压测
灰度发布
生产100%发布

Linux

free -m
rz -y 把文件上传到Linux中,如果有相同文件名的文件,会将其覆盖。
Rz -e 把文件上传到Linux中,如果有相同文件名的文件,不会将其覆盖,而是会在所上传文件后面加上 .序号

Redis

Redis 击穿 穿透 雪崩

雪崩:Key短时间大量过期,redis服务不可用
击穿:redis中没有数据,直接访问到数据库
穿透:redis和数据库中都没有,例如恶意大量访问

开发规范:防止击穿,雪崩

Public void getValue(String key){
//先判断访问的key是否是黑名单,如果是拦截---这段逻辑,根据需求,可有可无
//判断访问的key是否存在于布隆过滤器白名单中,存在,才放行---这段逻辑,根据需求,可有可无// 用key从redis中获取//如果不存在,则进入到锁代码块中(获取锁){// 双重校验,再从redis中获取
//  如果不存在,到数据库中获取Object value = getValueFromDB();
If(value!=null){//将value保存到redis中,并设置随机过期时间(避免雪崩)
}
对于value不存在的,要要在redis中缓存空对象(但是要考虑不存在的key是否很多)
避免不存在的key太多,可以额外用布隆过滤器维护一套白名单,再请求以前,先过下过滤器
Return value;
}
}

防止服务器不可用造成的雪崩

集群模式,哨兵模式,保证高可用

针对穿透:

方案1:增加参数校验:判断key是否存在,存在才让程序往下走
方案2:Redis中缓存空对象:对于不存在的key,也可以在redis中保存,这样也能将这些不存在的key拦截到数据库以外;
方案3:创建布隆过滤器,可以将存在的key放到布隆过滤器中,类似于白名单功能

场景:当一个key以前很冷门,突然变成爆款

对于非常热门的key,可以设置永不过期(或者设计过期时间很长)
可以通过nginx 内置lua脚本或者其他方式计算哪些key访问次数,将超过阈值的key,自动调正为热门key

单独一个线程统计访问量,对于爆款的key,自动将这些key更新为永不过期;不热门的key,如果是永不过期的,自动更新为有有效期

实现方案要遵循:大道至简原则,能代码层实现的,不要上升到组件,解决方案也要遵循先代码层,再组件层,网络层递进解决

用redis记录上亿用户的签到问题

采用bitmap

存储的是二进制,0 /1
String类型=512M
1type=8个bit
512M=51210241024*8=4,294,967,296==42亿
也就是说可以存储42亿用户的bit格式的数据信息

例如统计30天的签到信息
可以以天数为维度创建30个bitmap
01day: 0 0 0 0 0 ………,每一个bit 对应一个用户,这样每一天都可以存储上亿的用户,登录就将相应的下标标注为1

02day 又是一个新的bitmap

每一个bitmap 的过期时间是30天

也可以以用户为维度,但是这种要求用户比较少的场景

如何统计上亿用户的共同好友

假设有两个集合 set1 和 set2

redis> SADD set1 "a"
redis> SADD set1 "b"
redis> SADD set1 "c"
redis> SADD set2 "b"
redis> SADD set2 "c"
redis> SADD set2 "d"# 计算交集
redis> SINTER set1 set2
# 输出:
# 1) "b"
# 2) "c"

但是如果上亿的用户好友,直接都存储到内存中,太耗费资源了
我们可以将好友的数据存到的数据库中;
再结合Neo4j(本身就是用于社交数据结构)计算共同好友
或者通过大数据套件(Hbase+Hadoop)来进行海量离线计算

如何避免重复下单

前端,点完下单,下单按钮不可用
后端:自定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RepeatSubmit {enum Type{PARAM,TOKEN}Type limitType() default Type.PARAM;long lockTime() default 5;        
}

在需要保证幂等性的接口上,增加此注解
注解切面中:
将请求URL+用户TOKEN+关键词(例如sumitOrder),作为key保存到redis中,且按照locktime设置过期时间,且采用setNX的方式,一旦保存失败,则注解拦截返回;

Redis6为什么引入多线程

只是在网络IO层面上实现了多路复用,但是redis 实际的命令执行依然是单线程的

热点key问题

方案1:本地缓存—适合于提前预知哪些是热点key
方案2:请求分摊,将热key拆分成多个子key
方案3:限流

Import com.google.common.util.concurrent.RateLimiter;
Public class RateLimiterExmaple{Private RateLimiter rateLimiter = RateLimiter.create(10);Public String accessResource(String key){If(rateLimiter.tryAcquire()){Return RedisClient.get(key);}}
}

增加监测:
监控和报警:
通过设计监控来实时观测redis的使用情况,及时应对热key问题,一般对接热点探测系统

大key如何解决

Redis的大key:

指单个key所对应的数据过大,一般单个key超过10kb,就会被认为是大key

导致的问题:

1.网络延迟增加:传输数据需要更多时间
2. 阻塞Redis性能:大key的操作会阻塞Redis单线程的性能
3. 内存不足和导致OOM:大key可能会占用过多内存,影响其它部分的缓存使用

解决办法:
1. 分拆大key
Big list:list1,list2,list3,。。。listN
Big hash:可以将数据分段存储,比如一个大的key,假设存了一百万的用户数据,可以拆分成200个key,每个key下面存储5000个用户

2. 压缩数据
存储之前将数据进行压缩

public class DataCompressor {public byte[] compress(String data) throws IOException {ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length());GZIPOutputStream gzip = new GZIPOutputStream(bos);gzip.write(data.getBytes(StandardCharsets.UTF_8));gzip.close();return bos.toByteArray();}public void storeCompressKey(String key,String data){try{byte[] compressData = compress(data);RedisClient.set(key.getBytes(StandardCharsets.UTF_8),compressData);}catch (IOException e){}}}

3. 开启惰性删除的配置
当更新或删除大key的时候,使用惰性删除(lazyfree-lazy-expire yes)来避免阻塞整个redis

如果大key过期,redis会将过期的key同步做删除,如果不开启惰性删除,会阻塞前端发过来的命令的。

开启后,会对redis阻塞会有缓解

4. 使用SCAN 代替KEYS
在处理集合的时候,使用SCAN命令遍历key 而不是keys,避免一次性加载所有数据

public class RedisScanner {private Jedis jedis;public RedisScanner(Jedis jedis){this.jedis = jedis;}public void scanLargeKey(String largSetKey){String cursor = ScanParams.SCAN_POINTER_START;ScanParams scanParams = new ScanParams().count(100);//分批次取100个do{ScanResult<String> scanResult = jedis.sscan(largSetKey,cursor,scanParams);List<String> results = scanResult.getResult();//do somethingcursor = scanResult.getStringCursor();}while (!cursor.equals(ScanParams.SCAN_POINTER_START));}
}

数据库和redis数据不一致问题

在使用redis缓存作为数据库加速层时,可能会遇到缓存和数据库双写不一致的问题。这种不一致通常发生在更新操作时,就是写入数据库,但未及时更新缓存或者缓存更新后数据库未同步,导致读取到过时的数据。

解决办法:

  1. 缓存Aside模式(Cache Aside Pattern)–一般公司都是用这种
    这个方案只是改善,并不能彻底解决
    读操作:先存缓存读取数据,如果缓存未命中,再从数据库读取数据,然后将数据写入缓存
    写操作:先更新数据库,再删除缓存。这种方式会导致缓存短暂失效,下一次读取会动数据库加载到缓存中。

因为这种不是实时一致的,所以就需要设置一个合理的过期时间

  1. 更新缓存策略
    使用分布式锁,确保只有一个更新操作在同时进行
    锁内:获取锁:更新数据库,更新缓存,释放锁
    更新操作,串行化—一般不用
  1. 采用canal中间件,异步更新缓存
    Alibaba:通过监听数据库更新的binlog日志,去异步更新缓存

Redis中保证实时一致性,代价太大

  1. 利用过期时间
    利用合理的过期时间可以缓解不一致带来的影响,通过TTL确保数据在一定时间后更新

key 过期后如何删除的

Redis中,key的过期和删除不是实时的,redis采用了一种惰性删除 lazy deletion 和定期删除 periodic expiration 相结合的机制来处理过期键

1. 惰性删除 lazy deletion

机制:当客户访问一个键的时候,Redis会检查这个键是否已经过期,如果键过期了,那么它会在被访问时被惰性删除。
特点:这种机制表示一个键过期了,只要它没有被访问,Redis是不会主动删除它的。因此,惰性删除并不保证过期键会立即小时。

2. 定期删除

机制:Redis会周期性地随机抽取一部分设置了过期时间键进行检查,并删除已过期的键。
频率:定期删除由Redis的后台执行,大约每隔100毫秒进行一次扫描

key 和value规范

Key要短小,不要超过256字节
使用命名空间,用:分隔,例如:user:1001:profile
避免热key:确保key的分布均匀,避免单一key访问压力太大,可能需要进行分片处理

存储value的时候,避免值太大

  1. 分片存储: 对于需要存储大量数据的value,可以考虑拆分成多部分存储,可以降低单个操作的复杂度
  2. 合理设置blob:如果需要存储blob数据,考虑放在外部存储引擎中,只将引用或索引保存在redis中
  3. 将数据进行压缩

使用redis要点

  1. 优化数据结构,拒绝大key,避免热key

  2. 设计良好的命名空间,用:命名空间

  3. 合理的过期时间设置

  4. 持久化策略,混合持久化机制 RDB +AOF
    定期备份数据到其他机器上

  5. 监控和报警
    实时监控:使用Redis自带的INFO命令,慢查询日志或者外部监控工具如Prometheus,Grafana,实时监控Redis性能指标
    设置警报:针对内存使用,链接数,请求延迟等关键指标,设置自动警报

  6. 集群模式,主从架构和哨兵,不要用单点模式
    减少网络延迟:确保redis和应用程序在同一个数据中心,降低网络演延迟;
    批量操作:使用批量操作减少网络往返次数

  7. 参数调优:
    调整Redis配置:例如maxmemory,maxclients,timeout等参数需根据应用实际情况调整
    慢查询日志:启动慢查询日志

  8. 客户端重试策略:
    合理的重试机制:在网络抖动或者瞬间故障情况下,使用适当的重试机制和熔断策略

  9. 访问控制和安全:
    为Redis 服务设置访问密码,增加安全性
    使用ACL:从redis6.0开始,利用ACL进行访问控制管理,细化权限控制

  10. 代码实现时规避雪崩,穿透,击穿问题

Redis分布式锁

JVM 本地锁 synchronized,ReentrantLock
分布式锁:一般流程
a. 加锁 b.执行业务 c.删除锁

  1. 问题: 如果用户加锁后,因为特殊原因,没有释放锁,造成死锁—解决:锁过期时间
  2. 但是加锁setNX 和设置过期时间是 两个命令,并不是原子性的,还是会出现,加锁以后,宕机了,没有对key设置上过期时间
  3. –解决:采用setNX加强版命令,在设置的时候,直接设置上过期时间,让set和过期命令在一个原子里,例如set key1 value1 ex 10nx
  4. 进一步分析,还有问题,如果用户A加锁后,执行业务的时候,锁过期了,用户B请求过来,也加上锁了。此时,用户A 执行完,删除锁,把用户B加的锁给删除了
  5. 解决办法: 对锁加一个唯一标识,每个请求会生成唯一ID,加锁的时候,让ID作为锁的值; 当删除锁的时候,判断,锁的value是否和当前请求的ID一致,一致才可以删除。
  6. 还是有问题,场景:假设用户A,判断完当前锁是自己加的,正当准备删除锁的时候,CPU调度其他的了,而这个时候,正好锁也到期了,自己就没了;此时用户B过来,加上了用户B的锁。然后CPU又恢复调度到了用户A删除锁,这样就又把用户B的锁给删除了。
  7. 所以解决办法: 要保证 加锁—执行业务—判断锁ID—删除锁 都要在一个原子里才可以。
  8. 解决办法:Lua 脚本
 public boolean test(String phoneId){String lockKey = "phone-"+phoneId;String id = String.valueOf(idGenerator.nextId());try{String result = jedis.set(lockKey,id,SetParams.setParams().nx().ex(5));if(!"OK".equals(result)){return false;}Integer stock = iphoneService.getStock(phoneId);if(stock<1){return false;}stock = stock - 1;iphoneService.updateStock(phoneId,stock);}finally{//删除锁String script = "local value = redis.call('get',KEYS[1])"+"if(value ==ARGV[1]) then"+"redis.call(‘del’,KEYS[1])"+"return 'OK'"+"else"+"return nil"+"end";List<String> KEYS = Stream.of(lockKey).toList();List<String> ARGV = Stream.of(id).toList();Jedis.eval(script,KEYS,ARGV);}return true;}

对分布式完善的框架Redisson,不仅可以解决以上提到的所有问题,还能提供
自动续期
读写锁
公平锁

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.16.2</version>
</dependency>
application.properties配置文件spring.redisson.address=redis://127.0.0.1:6379
spring.redisson.password=null

Lock

@Autowired
private RedissonClient redissonClient;
//获取锁
RLock lock = null;
try {lock = redisson.getLock("Lxlxxx_Lock");// 加锁lock.lock();// 或者使用lock.lock(10, TimeUnit.SECONDS);
} catch (Exception e) {e.getStackTrace();
} finally {// 解锁if (lock != null) {lock.unlock();}System.out.println("Finally,释放锁成功");
}
//获取锁
RLock lock = null;
try {// 等待2秒,上锁以后10秒自动解锁if (lock.tryLock(2, 10, TimeUnit.SECONDS)) {//执行业务逻辑} else {System.out.println("未获取到锁");}
} catch (Exception e) {e.getStackTrace();
} finally {// 解锁if (lock != null) {lock.unlock();}System.out.println("Finally,释放锁成功");
}

Lock
  ①. lock.lock()方法:会尝试获取锁,如果锁被其他客户端持有,则当前客户端会阻塞,直到获取到锁为止。

②. lock.lock(long leaseTime, TimeUnit unit) :跟无参数类似,多了锁的持有时间,单位由unit参数指定。在这个时间内,如果锁的持有者没有主动释放锁,Redisson会自动释放锁,以避免因为线程崩溃等原因导致的死锁。

TryLock
  ①. 无参数版本:lock.tryLock()。这个版本的tryLock()会立即返回,无论锁是否可用。

②. 等待时间参数版本:lock.tryLock(long waitTime, long leaseTime, TimeUnit unit)。这个版本的tryLock()会尝试获取锁,最多等待waitTime时间(由unit参数指定时间单位)。如果在这个时间内成功获取到锁,则锁的租约时间(lease time)将被设置为leaseTime。如果等待时间结束后仍未获取到锁,则方法将返回false。

lock方法:这是一种阻塞式的获取锁的方式。当线程调用lock方法时,如果锁已经被其他线程持有,则当前线程会被阻塞,直到获取到锁或者发生超时、中断等情况。这种方式可以确保线程对共享资源的访问是互斥的,适用于需要确保共享资源只能被一个线程访问的场景。

tryLock方法:这是一种非阻塞式的获取锁的方式。当线程调用tryLock方法时,如果锁已经被其他线程持有,则当前线程不会被阻塞,而是立即返回一个布尔值来表示是否成功获得了锁

原理:

加锁的时候,用的是什么结构
用的是hset命令 –key就是锁的key,value 用的是map结构 key线程id value重入次数
如何保证,加锁和解锁是同一个线程
如何给锁自动续期—看门狗机制,默认锁过期时间是30s,如果30s业务没有结束,这个看门狗每10s扫描一次,发现业务还没有结束,会设置过期时间30s
重入锁是如何实现的

看门狗机制,默认是关闭的

如果加锁失败,线程就会被semaphore(其实就是AQS)阻塞住,当锁被释放以后,当前阻塞的线程会被semaphore唤醒,被唤醒后,会再一次尝试加锁逻辑

Redis set 的时候,会将key的过期时间清楚
Redis实例中最多放多少key

相关文章:

常见问题整理

DevOps 和 CICD DevOps 全称Development & Operation 一种实现开发和运维一体化的协同模式&#xff0c;提供快速交付应用和服务的能力 用于协作&#xff1a;开发&#xff0c;部署&#xff0c;质量测试 整体生命周期工作内容&#xff0c;最终实现持续继承&#xff0c;持续部…...

使用Vue创建前后端分离项目的过程(前端部分)

前端使用Vue.js作为前端开发框架&#xff0c;使用Vue CLI3脚手架搭建项目&#xff0c;使用axios作为HTTP库与后端API交互&#xff0c;使用Vue-router实现前端路由的定义、跳转以及参数的传递等&#xff0c;使用vuex进行数据状态管理&#xff0c;后端使用Node.jsexpress&#xf…...

【Springboot知识】Redis基础-springboot集成redis相关配置

文章目录 1. 添加依赖2. 配置Redis连接3. 配置RedisTemplate&#xff08;可选&#xff09;4. 使用RedisTemplate或StringRedisTemplate5. 测试和验证 集群配置在application.properties中配置在application.yml中配置 主从配置1. 配置Redis服务器使用配置文件使用命令行 2. 配置…...

网络安全概论——身份认证

一、身份证明 身份证明可分为以下两大类 身份验证——“你是否是你所声称的你&#xff1f;”身份识别——“我是否知道你是谁&#xff1f;” 身份证明系统设计的三要素&#xff1a; 安全设备的系统强度用户的可接受性系统的成本 实现身份证明的基本途径 所知&#xff1a;个…...

OpenHarmony-4.HDI 框架

HDI 框架 1.HDI介绍 HDI&#xff08;Hardware Device Interface&#xff0c;硬件设备接口&#xff09;是HDF驱动框架为开发者提供的硬件规范化描述性接口&#xff0c;位于基础系统服务层和设备驱动层之间&#xff0c;是连通驱动程序和系统服务进行数据流通的桥梁&#xff0c;是…...

leecode494.目标和

这道题目第一眼感觉就不像是动态规划&#xff0c;可以看出来是回溯问题&#xff0c;但是暴力回溯超时&#xff0c;想要用动态规划得进行一点数学转换 class Solution { public:int findTargetSumWays(vector<int>& nums, int target) {int nnums.size(),bagWeight0,s…...

在Spring中application 的配置属性(详细)

application 的配置属性。 这些属性是否生效取决于对应的组件是否声明为 Spring 应用程序上下文里的 Bean &#xff08;基本是自动配置 的&#xff09;&#xff0c;为一个不生效的组件设置属性是没有用的。 multipart multipart.enabled 开启上传支持&#xff08;默认&a…...

jvm符号引用和直接引用

在解析阶段中,符号引用和直接引用是Java类加载和内存管理中的重要概念,它们之间存在显著的区别。以下是对这两个概念的详细解析: 一、定义与特性 符号引用(Symbolic Reference) 定义:符号引用是编译器生成的用于表示类、方法、字段等的引用方式。特性: 独立性:符号引用…...

一文流:JVM精讲(多图提醒⚠️)

一文流系列是作者苦于技术知识学了-忘了,背了-忘了的苦恼,决心把技术知识的要点一笔笔✍️出来,一图图画出来,一句句讲出来,以求刻在🧠里。 该系列文章会把核心要点提炼出来,以求掌握精髓,至于其他细节,写在文章里,留待后续回忆。 目前进度请查看: :::info https:/…...

python 分段拟合笔记

效果图: 源代码: import numpy as np import cv2 import matplotlib.pyplot as plt from numpy.polynomial.polynomial import Polynomialdef nihe(x_points,y_points,p_id):# 按照 p_id 将 points 分成两组group_0_x = []group_0_y = []group_1_x = []group_1_y = []for i, …...

Mysql索引类型总结

按照数据结构维度划分&#xff1a; BTree 索引&#xff1a;MySQL 里默认和最常用的索引类型。只有叶子节点存储 value&#xff0c;非叶子节点只有指针和 key。存储引擎 MyISAM 和 InnoDB 实现 BTree 索引都是使用 BTree&#xff0c;但二者实现方式不一样&#xff08;前面已经介…...

数据结构——队列的模拟实现

大家好&#xff0c;上一篇博客我带领大家进行了数据结构当中的栈的模拟实现 今天我将带领大家实现一个新的数据结构————队列 一&#xff1a;队列简介 首先来认识一下队列&#xff1a; 队列就像我们上学时的排队一样&#xff0c;有一个队头也有一个队尾。 有人入队的话就…...

在window环境下安装openssl生成钥私、证书和签名,nodejs利用express实现ssl的https访问和测试

在生成我们自己的 SSL 证书之前&#xff0c;让我们创建一个简单的 Express应用程序。 要创建一个新的 Express 项目&#xff0c;让我们创建一个名为node-ssl -server 的目录&#xff0c;用终端cmd中进入node-ssl-server目录。 cd node-ssl-server 然后初始化一个新的 npm 项目…...

Redis 最佳实践

这是以前写下来的文章&#xff0c;发出来备份一下 Redis 在企业中的最佳实践可以帮助提高性能、可用性和数据管理效率。以下是一些推荐的做法&#xff1a; 选择合适的数据结构&#xff1a; 根据需求选择适当的 Redis 数据结构&#xff08;如 Strings、Lists、Sets、Hashes、So…...

网站灰度发布?Tomcat的8005、8009、8080三个端口的作用什么是CDNLVS、Nginx和Haproxy的优缺点服务器无法开机时

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…...

从客户跟进到库存管理:看板工具赋能新能源汽车销售

在新能源汽车市场日益扩张的今天&#xff0c;门店销售管理变得更加复杂和重要。从跟踪客户线索到优化订单流程&#xff0c;再到团队协作&#xff0c;效率低下常常成为许多门店的“隐形成本”。如果你曾为销售流程不畅、客户管理混乱而苦恼&#xff0c;那么一种简单直观的工具—…...

算法时间空间复杂度的计算

一、时间复杂度 &#xff1a;找循环最内层 二、空间复杂度&#xff1a; 1.找int float等变量 2.递归调用&#xff1a;空间复杂度递归调用的深度 int 型变量: 四个字节...

人才画像系统如何支撑企业的人才战略落地

在当今竞争激烈的商业环境中&#xff0c;企业的人才战略对于其长期发展至关重要。为了有效实施人才战略&#xff0c;企业需要一套精准、高效的人才管理工具&#xff0c;而人才画像系统正是满足这一需求的关键解决方案。本文将探讨人才画像系统如何支撑企业的人才战略落地&#…...

[数据结构] 链表

目录 1.链表的基本概念 2.链表的实现 -- 节点的构造和链接 节点如何构造? 如何将链表关联起来? 3.链表的方法(功能) 1).display() -- 链表的遍历 2).size() -- 求链表的长度 3).addFirst(int val) -- 头插法 4).addLast(int val) -- 尾插法 5).addIndex -- 在任意位置…...

三格电子——新品IE103转ModbusTCP网关

型号&#xff1a;SG-TCP-IEC103 产品概述 IE103转ModbusTCP网关型号SG-TCP-IEC103&#xff0c;是三格电子推出的工业级网关&#xff08;以下简称网关&#xff09;&#xff0c;主要用于IEC103数据采集、DLT645-1997/2007数据采集&#xff0c;IEC103支持遥测和遥信&#xff0c;可…...

遥感影像目标检测:从CNN(Faster-RCNN)到Transformer(DETR

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…...

深入详解神经网络基础知识——理解前馈神经网络( FNN)、卷积神经网络(CNN)和循环神经网络(RNN)等概念及应用

深入详解神经网络基础知识 深度学习作为人工智能&#xff08;AI&#xff09;的核心分支之一&#xff0c;近年来在各个领域取得了显著的成果。从图像识别、自然语言处理到自动驾驶&#xff0c;深度学习技术的应用无处不在。而深度学习的基础&#xff0c;神经网络&#xff0c;是理…...

react 项目打包二级目 使用BrowserRouter 解决页面刷新404 找不到路由

使用BrowserRouter package 配置 &#xff08;这部分代码可以不做配置也能实现&#xff09; {"homepage": "/admin",}vite.config 配置 export default defineConfig({base: /admin])BrowserRouter 添加配置项 <BrowserRouter basename/admin>&l…...

EasyPlayer.js播放器Web播放H.265要兼顾哪些方面?

在数字化时代&#xff0c;流媒体技术已经成为信息传播和娱乐消费的重要方式。随着互联网技术的飞速发展和移动设备的普及&#xff0c;流媒体服务正在重塑我们的生活和工作方式。从视频点播、在线直播到音乐流媒体&#xff0c;流媒体技术的广泛应用不仅改变了内容的分发和消费模…...

使用 acme.sh 申请域名 SSL/TLS 证书完整指南

使用 acme.sh 申请域名 SSL/TLS 证书完整指南 简介为什么选择 acme.sh 和 ZeroSSL&#xff1f;前置要求安装过程 步骤一&#xff1a;安装 acme.sh步骤二&#xff1a;配置 ZeroSSL 证书申请 方法一&#xff1a;手动 DNS 验证&#xff08;推荐新手使用&#xff09;方法二&#xf…...

睡岗和玩手机数据集,4653张原始图,支持YOLO,VOC XML,COCO JSON格式的标注

睡岗和玩手机数据集&#xff0c;4653张原始图&#xff0c;支持YOLO&#xff0c;VOC XML&#xff0c;COCO JSON格式的标注 数据集分割 训练组70&#xff05; 3257图片 有效集20&#xff05; 931图片 测试集10&#xff05; 465图片 预处理 没有采用任何预处…...

[Unity] 【VR】【游戏开发】在VR中使用New Input System获取按键值的完整教程

在使用Unity开发VR项目时,推荐使用 New Input System 来处理输入操作。相比于旧的Input系统,New Input System更加灵活、功能强大,尤其在处理VR控制器的按键输入时具有明显优势。本文将详细介绍如何在VR项目中使用New Input System获取按键值,并通过代码示例和图文讲解,帮…...

网络安全渗透有什么常见的漏洞吗?

弱口令与密码安全问题 THINKMO 01 暴力破解登录&#xff08;Weak Password Attack&#xff09; 在某次渗透测试中&#xff0c;测试人员发现一个网站的后台管理系统使用了非常简单的密码 admin123&#xff0c;而且用户名也是常见的 admin。那么攻击者就可以通过暴力破解工具&…...

2024年合肥师范学院信息安全小组内部选拔赛(c211)WP

目录 前言MISC签到题_熟悉吗又来一道签到题文件包含 CRYPTO古典1古典2RSA webbaby_sql 前言 [HFNU 校级选拔] 已经结束&#xff0c;接下来一起了解下题目是怎么做的。 通过网盘分享的文件&#xff1a;ARCHPR_4.66.266.0_汉化绿色版.7z 链接: https://pan.baidu.com/s/1N_c0PJX…...

GESP CCF C++八级编程等级考试认证真题 2024年12月

202412 GESP CCF C八级编程等级考试认证真题 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 小杨家响应国家“以旧换新”政策&#xff0c;将自家的汽油车置换为新能源汽车&#xff0c;正在准备自编车牌。自编车牌包括5 位数字或英文字母&#xff0c…...