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

Java面试题025:一文深入了解数据库Redis(1)

欢迎大家关注我的JAVA面试题专栏,该专栏会持续更新,从原理角度覆盖Java知识体系的方方面面。

一文吃透JAVA知识体系(面试题)https://blog.csdn.net/wuxinyan123/category_7521898.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=7521898&sharerefer=PC&sharesource=wuxinyan123&sharefrom=from_link

 1、Redis简介

        Redis是一种基于键值对(key-value)的NoSQL数据库。

        支持string(字符串)、hash(哈希)、 list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、 HyperLogGEO(地理信息定位)等多种数据结构,因此Redis可以满足很多应用场景,常用于缓存、消息队列、会话存储等应用场景。

2、Redis数据结构

        Redis有五种基本数据结构。

(1)String

        字符串类型的值可以是字符串(简单的字符串、复杂的字符串(例如JSON、 XML))、数字 (整数、浮点数),甚⾄至是二进制(图片、音频、视频),但最大不能超过512MB

常用命令

  • SET key value:设置键的值。

  • GET key:获取键的值。

  • INCR key:将键的值加 1。

  • DECR key:将键的值减 1。

redis 127.0.0.1:6379> SET rutime "20250621"
OK
redis 127.0.0.1:6379> GET rutime 
"20250621"

(2)hash

        hash 是一个键值(key=>value)对集合。

常用命令

  • HSET key field value:设置哈希表中字段的值。

  • HGET key field:获取哈希表中字段的值。

  • HGETALL key:获取哈希表中所有字段和值。

  • HDEL key field:删除哈希表中的一个或多个字段。

redis 127.0.0.1:6379> HMSET ddd field1 "Hello" field2 "World"
"OK"
redis 127.0.0.1:6379> HGET ddd  field1
"Hello"

(3)List

        用来存储多个有序的字符串。

常用命令

  • LPUSH key value:将值插入到列表头部。

  • RPUSH key value:将值插入到列表尾部。

  • LPOP key:移出并获取列表的第一个元素。

  • RPOP key:移出并获取列表的最后一个元素。

  • LRANGE key start stop:获取列表在指定范围内的元素。

(4)Set

        Set 是 string 类型的无序集合。

常用命令

  • SADD key value:向集合添加一个或多个成员。

  • SREM key value:移除集合中的一个或多个成员。

  • SMEMBERS key:返回集合中的所有成员。

  • SISMEMBER key value:判断值是否是集合的成员。

(5)zset(sorted set:有序集合)

        有序集合中的每个元素都需要指定一个分数,根据分数对元素进行升序排序,如果多个元素有相同的分数,则以字典序进行升序排序,sorted set因此非常适合实现排名。

常用命令

  • ZADD key score value:向有序集合添加一个或多个成员,或更新已存在成员的分数。

  • ZRANGE key start stop [WITHSCORES]:返回指定范围内的成员。

  • ZREM key value:移除有序集合中的一个或多个成员。

  • ZSCORE key value:返回有序集合中,成员的分数值。

3、Redis速度快的原因

        单机的Redis就可以支撑每秒十几万的并发,相对于MySQL来说,性能是MySQL的几十倍。

        原因主要有几点:

(1)开发语言。使用C语言开发,C语言是非常贴近操作系统的语言,所以执行会比较快。

(2)纯内存访问。Redis将所有数据放在内存中,非数据同步正常工作中,是不需要从磁盘读取数据的,0次IO。内存响应时间大约为100纳秒,这是Redis速度快的重要基础。

(3)单线程。单线程避免了线程切换以及加锁释放锁带来的消耗,对于服务端开发来说,锁和线程切换通常是性能杀手。

(4)非阻塞多路I/O复用机制

        什么是I/O多路路复用。
        假设你是一个老师,让30 个学⽣生解答一道题,然后检查学生做的是否正确,你有下面几个选择:
  • 第一种选择:按顺序逐个检查,先检查A,然后是B,之后是CD。。。如果有一个学生卡住,全班都会被耽误。这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。
  • 第二种选择:你创建30个分身,每个分身检查一个学生的答案是否正确。 这种类似于为每一个用户创建一个进程或者多线程处理。
  • 第三种选择,你站在讲台上等,谁解答完谁举手。这时CD举手,你下去依次检查 C、D的答案,然后继续回到讲台上等。EA又举手,然后去处理EA
第一种就是阻塞 IO 模型,第三种就是 I/O 复用模型。

I/O 多路复用其实是在单个线程中通过记录跟踪每一个socket(I/O流) 的状态来管理多个I/O流。

4、Redis应用场景

(1)缓存

        是Redis应用最广泛地⽅。由于redis访问速度块、支持的数据类型比较丰富,Web应用会使用Redis作为缓存来存储热点数据,来降低数据源压力,提高响应速度。另外结合expire,我们可以设置过期时间然后再进行缓存更新操作,这个功能最为常见。

(2)计数器

        redis的incrby命令可以实现原子性的递增,所以可以运用于高并发的秒杀活动、分布式序列号的生成、具体业务还体现在比如限制一个手机号发多少条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。

(3)消息队列

        Redis提供了发布订阅功能和阻塞队列的功能,可以满足一般消息队列功能。

(4)排行榜

        借助redis的SortedSet进行热点数据的排序。

(5)分布式锁

        主要利用redis的setnx命令实现。

(6)限时场景

        比如验证码过期,利用Redis的过期操作。

5、缓存击穿

        一个并发访问量比较大的key 在某个时间过期,导致所有的请求直接打在 DB 上。

解决方案:

(1)加互斥锁

该方法是比较普遍的做法,即,在根据key获得的value值为空时,先锁上,再从数据库加载,加载完毕,释放锁。若其他线程发现获取锁失败,则睡眠50ms后重试。

至于锁的类型,单机环境用并发包的Lock类型就行,集群环境则使用分布式锁( redis的setnx)。

优点

1、数据的实时性较高,不需要其他外部系统依赖,利用了redis自己的特性,实现分布式锁,保证了同样的数据库查询同时只会查询1次,对数据库的压力较小
2、不会侵入业务代码,spring的aop就能很好的实现

不足

1、阻塞等待分布式锁是个自旋阻塞操作,对应用服务器来说非常浪费cpu的分片时间,如果大量请求打过来, 应用服务器反而会先扛不住。

2、如果用户的查询是由多个系统的结果构成,每个系统的查询依赖上一个系统查询的结果,各个查询是串行的,那么自旋的睡眠时间可能会成为拖慢请求的罪魁祸首,多个系统都这么设计都在自旋睡眠,明显效率很低。

(2)定时任务主动刷新缓存

适用情况

1、已有一套现成的高可靠分布式定时任务系统
2、查询的数据变化不大
3、用户的请求量非常大的情况下

(3)布隆过滤器

        布隆过滤器 (Bloom Filter) 是 1970 年由布隆提出的,是一种非常节省空间的概率数据结构,运行速度快,占用内存小,但是有一定的误判率且无法删除元素。它实际上是一个很长的二进制向量和一系列随机映射函数组成,主要用于判断一个元素是否在一个集合中。【单独一节详细介绍】

        当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。打个比方,当它说不认识你时,肯定就不认识;当它说见过你时,可能根本就没见过面,不过因为你的脸跟它认识的人中某脸比较相似 (某些熟脸的系数组合),所以误判以前见过你。

使用过程:

1.离线数据加载到布隆过滤器

2.布隆过滤器查询

3.布隆过滤器不存在,直接返回

4.布隆过滤器存在,cache不存在,从数据库查询

5.数据返回

(4)不过期

        包含两层意思:

        从缓存层面来看,没有设置过期时间,不会出现热点key过期后产生的问题,也就是物理不过期。

        从功能层面来看,当发现热点key的值发生变化时,使用单独的线程去更新缓存。

6、缓存穿透

        缓存穿透是指数据在redis不存在,数据库也不存在,返回空,一般来说空值是不会写入redis的,如果反复请求同一条数据,那么则会发生缓存穿透。

        存穿透导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。

(1)缓存空值/默认值

        在数据库不命中之后,把一个空对象或者默认值保存到缓存,之后再访问这个数据,就会从缓存中获取,这样就保护了数据库。

        但是如果每次请求不同的key,同时这个key在数据库中也是不存在的,依然会发生缓存穿透。

(2)布隆过滤器

        首先初始化项目的时候从数据库查询出来所有的key值,然后放到布隆过滤器中,当应用访问的时候,先去布隆过滤器中判断kedy值,如果发觉没有key值不存在,直接返回;如果key值在布隆过滤器存在,则去访问redis,由于是有误判率的,所以redis也有可能不存在;那么这时候就去访问数据库,数据库不存在,那就直接返回空就行。

        如果误判率为3%,当有100万个请求同时过来的时候,布隆过滤器已经挡住了97万个请求,剩下3万个请求假如是误判的,这时候再访问数据库可以通过加锁的方式实现,只有竞争到锁了就去访问数据库,这样就完全可以解决缓存穿透问题。

7、缓存雪崩

        某一时刻发生大规模的缓存失效的情况,例如缓存服务宕机、大量量key在同一时间过期,这样的后果就是大量的请求进来直接打到DB上,可能导致整个系统的崩溃,称为雪崩。

(1)提高缓存可用性

        1. 集群部署:通过集群来提升缓存的可用性,可以利用Redis本身的Redis Cluster或者第三方集群方案如Codis 等。

        2. 多级缓存:设置多级缓存,第一级缓存失效的基础上,访问二级缓存,每一级缓存的失效时间都不同。

(2)过期时间

        1. 均匀过期:为了避免大量的缓存在同一时间过期,可以把不同的 key 过期时间随机生成,避免过期时间太过集中。

        2. 热点数据永不不过期。

(3)熔断降级

        1. 服务熔断:当缓存服务器宕机或超时响应时,为了防止整个系统出现雪崩,暂时停止业务服务访问缓存系统。

        2. 服务降级:出现大量缓存失效,而且处在高并发高负荷的情况下,在业务系统内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的 fallback(退路)错误处理信息。

8、缓存预热

缓存预热,就是提前把数据库里的数据刷到缓存里,通常有这些方法:

1、直接写个缓存刷新页面或者接口,上线时手动操作。

2、数据量不大,可以在项目启动的时候自动进行加载。

3、定时任务刷新缓存。

9、redis 过期策略

        redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。

        redis 采用两种策略:定期删除+惰性删除。

(1)定期删除

        Redis 默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。

  1. 从过期字典中随机 20 个 key;

  2. 删除这 20 个 key 中已经过期的 key;

  3. 如果过期的 key 比率超过 1/4,那就重复步骤 1;

        同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。

        如果Redis 实例中所有的 key (几十万个)在同一时间过期,Redis 会持续扫描过期字典 (循环多次),直到过期字典中过期的 key 变得稀疏,才会停止 (循环次数明显下降)。内存管理器需要频繁回收内存页,此时会产生一定的 CPU 消耗,必然导致线上读写请求出现明显的卡顿现象。

        当客户端请求到来时(服务器如果正好进入过期扫描状态),客户端的请求将会等待至少 25ms 后才会进行处理,如果客户端将超时时间设置的比较短,比如 10ms,那么就会出现大量的链接因为超时而关闭,业务端就会出现很多异常。

        一定要注意不宜全部在同一时间过期,可以给目标过期时间的基础上再加一个随机范围(redis.expire_at(key, random.randint(86400) + expire_ts)),分散过期处理的压力。

        集群环境中从库不会进行过期扫描,从库对过期的处理是被动的。主库在 key 到期时,会在 AOF 文件里增加一条 del 指令,同步到所有的从库,从库通过执行这条 del 指令来删除过期的 key。因为指令同步是异步进行的,所以主库过期的 key 的 del 指令没有及时同步到从库的话,会出现主从数据的不一致,主库没有的数据在从库里还存在,分布式锁的算法漏洞就是因为这个同步延迟产生的。

(2)惰性删除

        在客户端访问key时再进行检查如果过期了就立即删除。

10、Redis内存回收策略

        如果定期删除漏掉了很多过期key,然后也没及时去查,也就没走被动处理,导致大量过期key堆积在内存里,当 Redis 已使用内存超出物理内存限制时,内存中的数据开始和磁盘产生频繁的交换 (swap),Redis 的性能急剧下降,此时Redis存取效率基本上等于不可用。

        在生产环境中这是不允许的,为了限制最大使用内存,Redis 提供了配置参数 maxmemory 来限制内存超出期望大小。

redis.conf中配置
maxmemory <bytes>             #最大内存(单位字节)
maxmemory-policy noeviction   #默认

        如果实际内存超出 maxmemory ,Redis提供了几种可选策略 (maxmemory-policy) 来让用户自己决定如何腾出新的空间(即回收内存)以继续提供读写服务。

  • volatile-xxx 策略只会针对带过期时间的 key 进行淘汰,

  • allkeys-xxx 策略会对所有的 key 进行淘汰

如果只是拿 Redis 做缓存,那最好使用 allkeys-xxx,客户端写缓存时不必携带过期时间。

如果还想同时具备持久化功能,那就使用 volatile-xxx 策略,好处就是,没有设置过期时间的 key 不会被 LRU 算法淘汰。

相关文章:

Java面试题025:一文深入了解数据库Redis(1)

欢迎大家关注我的JAVA面试题专栏&#xff0c;该专栏会持续更新&#xff0c;从原理角度覆盖Java知识体系的方方面面。 一文吃透JAVA知识体系&#xff08;面试题&#xff09;https://blog.csdn.net/wuxinyan123/category_7521898.html?fromshareblogcolumn&sharetypeblogco…...

Web攻防-XSS跨站Cookie盗取数据包提交网络钓鱼BEEF项目XSS平台危害利用

知识点&#xff1a; 1、Web攻防-XSS跨站-手工代码&框架工具&在线平台 2、Web攻防-XSS跨站-Cookie盗取&数据提交&网络钓鱼 演示案例-WEB攻防-XSS跨站-Cookie盗取&数据提交&网络钓鱼&Beef工具 1、XSS跨站-攻击利用-凭据盗取 条件&#xff1a;无防…...

(LeetCode 面试经典 150 题) 169. 多数元素(哈希表 || 二分查找)

题目&#xff1a;169. 多数元素 方法一&#xff1a;二分法&#xff0c;最坏的时间复杂度0(nlogn)&#xff0c;但平均0(n)即可。空间复杂度为0(1)。 C版本&#xff1a; int nnums.size();int l0,rn-1;while(l<r){int mid(lr)/2;int ans0;for(auto x:nums){if(xnums[mid]) a…...

71、单元测试-Junit5简介

71、单元测试-Junit5简介 # JUnit 5 简介 JUnit 5 是 Java 平台上最流行的单元测试框架之一&#xff0c;是 JUnit 的重大升级版本&#xff0c;引入了许多新特性和改进&#xff0c;旨在提供更现代化、灵活和强大的测试体验。 ## 主要组成部分 JUnit 5 由三个模块组成&#xff1a…...

IEC61850 一致性测试中的 UCA 测试

一、IEC61850 与 UCA 的关系背景 标准演进&#xff1a;IEC61850 是电力系统自动化领域的国际通信标准&#xff0c;其发展与美国 UCA&#xff08;User Communications Architecture&#xff09;标准密切相关。2001 年&#xff0c;UCA 国际用户组织与 IEC 合作&#xff0c;将 UC…...

ProtoBuf:proto3 语法详解

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;ProtoBuf 在语法详解部分&#xff0c;依旧使⽤项⽬推进的⽅式完成讲解。这个部分会对通讯录进⾏多次升级&#xff0c;使⽤2.x表⽰升级的版本&#xff0c;最终将会升级如下内容&#xff1a; 不再打…...

博图SCL语言GOTO语句深度解析:精准跳转

在SCL编程中&#xff0c;**GOTO语句**是控制流程的底层工具&#xff0c;它允许程序无条件跳转到指定的**标签位置**。虽然现代编程中较少使用&#xff0c;但在特定工业场景下仍能发挥独特价值。 GOTO语句核心机制 基本语法结构 // 定义标签 <标签名>: // 跳转指令 GOTO…...

面试题-在ts中有两个类型,一个是a,一个是b,这两个联合起来就是c,如何实现联合

在 TypeScript 中&#xff0c;若要将两个类型 a 和 b 联合成一个新类型 c&#xff0c;可以使用 联合类型&#xff08;Union Type&#xff09; 或 交叉类型&#xff08;Intersection Type&#xff09;&#xff0c;具体取决于你的需求&#xff1a; 一、联合类型&#xff08;Unio…...

Mac电脑-触摸板增强工具-BetterTouchTool

BetterTouchTool mac 触摸板增强工具&#xff0c;允许用户使用各种手势来控制其计算机。 Bettertouchtool mac是一个小而高效的macOS应用程序&#xff0c;旨在帮助您为手势定义快捷方式。 此外&#xff0c;Bettertouchtool可用于使用常规鼠标和键盘快捷键&#xff0c;并提供伴…...

MySQL误删数据急救指南:基于Binlog日志的实战恢复详解

背景 数据误删是一个比较严重的场景 1.典型误操作场景 场景1&#xff1a;DELETE FROM orders WHERE status0 → 漏写AND create_time>‘2025-06-20’ 场景2&#xff1a;DROP TABLE customer → 误执行于生产环境 认识 binlog 1.binlog 的核心作用 记录所有 DDL/DML 操…...

API网关Apisix管理接口速查

&#x1f9ed; 管理接口总体分类&#xff08;基于 REST API&#xff09; 资源类别接口路径前缀功能说明路由&#xff08;Routes&#xff09;/apisix/admin/routes/{id}定义 HTTP 请求的匹配规则及转发目标服务&#xff08;Services&#xff09;/apisix/admin/services/{id}封装…...

React 组件通信

父传子 函数式组件 function Footer(props){const [count,setCount] useState(0)const {name,age} propsconst onClick ()>{setCount(count1)}return (<div><button onClick{()>{onClick()}}>点此1</button><div>{count}</div><di…...

Zephyr 电源管理机制深度解析:从 Tickless Idle 到平台 Suspend 实践

本文系统解析 Zephyr 的电源管理机制&#xff0c;包括 Tickless Idle 模式、系统 suspend/resume 生命周期管理、平台级功耗优化 Hook、自定义设备电源域&#xff0c;以及如何结合低功耗 SoC 实现最小化功耗设计。全文超过 5000 字&#xff0c;适合构建对功耗敏感的 IoT、BLE、…...

clickhouse-server连不上clickhouse-keeper的问题记录

背景 想简单部署一个1 shard 2 replica&#xff0c;1keeper的集群。 有两个虚拟机&#xff1a;192.168.1.3&#xff0c;192.168.1.6。 192.168.1.3&#xff1a;部署1个ck&#xff0c;1个keeper 192.168.1.6&#xff1a;部署1个ck 192.168.1.3和192.168.1.6的ck组成1个shar…...

Python 数据分析与可视化 Day 3 - Pandas 数据筛选与排序操作

&#x1f3af; 今日目标 掌握 DataFrame 的条件筛选&#xff08;布尔索引&#xff09;学会多条件筛选、逻辑运算熟练使用排序&#xff08;sort_values&#xff09;提升数据组织力结合列选择进行数据提取分析 &#x1f9ea; 一、列选择与基本筛选 ✅ 选择单列 / 多列 df[&quo…...

Android NDK下载链接及配置版本

Android NDK下载链接及配置版本 https://github.com/android/ndk/releases 在build.gralde里面这样配置ndk具体版本号&#xff1a; android {ndkVersion "27.0.12077973" } Android Studio报错&#xff1a;Could not move temporary workspace () to immutable locat…...

Mac Parallels Desktop Kali 2025 代理设置

Mac Parallels Desktop Kali 2025 代理设置 核心步骤&#xff1a; kali设置桥接wifi 查看kali和主机ip 运行命令ifconfig查看kali ip&#xff1a; mac主机ip&#xff1a; kali设置proxy ip填写主机ip&#xff0c;port为主机proxy端口 enjoy...

Python 的内置函数 hash

Python 内建函数列表 > Python 的内置函数 hash Python 的内置函数 hash() 是一个非常有用的工具函数&#xff0c;主要用于获取对象的哈希值。哈希值是一个固定长度的整数&#xff0c;代表该对象的唯一标识。在 Python 中&#xff0c;hash() 函数常用于字典键值、集合元素等…...

文生视频(Text-to-Video)

&#x1f552; 生成时间&#xff1a;每张图大概 10–60 秒&#xff08;取决于设备&#xff09; ✅ 二、文生视频&#xff08;Text-to-Video&#xff09; 以下项目中&#xff0c;很多都基于 SD 模型扩展&#xff0c;但视频生成复杂度高&#xff0c;生成时间一般 超过 30 秒&am…...

(LeetCode 面试经典 150 题) 80. 删除有序数组中的重复项 II (双指针、栈)

题目&#xff1a;80. 删除有序数组中的重复项 II 思路&#xff1a;左指针 left 类似于指向栈顶的下一个待填的元素&#xff0c;每次遍历只需看当前元素nums[i]和栈顶的下一个元素nums[left-2]是否相等&#xff0c;不等就可以插入栈当中。时间复杂度0(n)。 C版本&#xff1a; …...

【舞蹈】编排:如何对齐拍子并让小节倍数随BPM递减

音的强弱关系 当前划分编排最小单位的代码的分析 📊 代码逻辑分析 ✅ 完整性方面 代码逻辑相对完整,包含了: 结构段落分析(intro, verse, chorus等)强拍时间点提取歌词时间轴处理AI增强的编舞建议生成⚠️ 主要问题 1. 强拍对齐逻辑不够精确 # 当前代码只是简单提取…...

LangGraph--基础学习(工具调用)

本节将详细学习大模型是怎么调用工具的&#xff0c;为什么可以调用工具等等&#xff0c;手写一个工具调用&#xff0c;后续可以通过mcp自己调用即可&#xff0c;没必要自己写&#xff0c;但是学习过程中需要手写&#xff0c;通常怎么使用第三方工具调用呢&#xff1f; import o…...

华为云 Flexus+DeepSeek 实战:华为云单机部署 Dify-LLM 开发平台全流程指南【服务部署、模型配置、知识库构建全流程】

华为云 FlexusDeepSeek 实战&#xff1a;华为云单机部署 Dify-LLM 开发平台全流程指南【服务部署、模型配置、知识库构建全流程】 文章目录 华为云 FlexusDeepSeek 实战&#xff1a;华为云单机部署 Dify-LLM 开发平台全流程指南【服务部署、模型配置、知识库构建全流程】前言1、…...

【appium】2.初始连接脚本配置

连接配置 from appium import webdriver desired_caps {platformName: Android,automationName: UIAutomator2,deviceName: ZTEB880,appPackage: com.taobao.taobao,appActivity: com.taobao.tao.welcome.Welcome,noReset: True }driver webdriver.Remote(http://localhost:…...

磁性传感器在电机控制闭环系统中的反馈作用

磁性传感器的基本原理和类型 基本原理 &#xff1a;磁性传感器是基于磁学原理来检测磁场强度、方向或其他与磁场相关的物理量。常见的磁性传感器有霍尔传感器、磁阻传感器等。霍尔传感器是利用霍尔效应工作的&#xff0c;当电流通过置于磁场中的半导体材料时&#xff0c;在垂直…...

Python:.py文件如何变成双击可执行的windows程序?(版本1)

1、如下.py文件&#xff0c;右键重命名文件后缀名&#xff1a;py改为&#xff1a;pyw 2、修改时&#xff0c;提示如下&#xff1a;不用管点击&#xff1a;是即可 3、之后双击&#xff0c;即可执行python代码文件。 好的&#xff0c;我们来详细介绍一下 Python 的 .pyw 文件。 简…...

Spring Boot + MyBatis + Vue:全栈开发的深度剖析与实践指南

一、技术栈深度剖析 &#xff08;一&#xff09;Spring Boot&#xff1a;后端开发的加速器 Spring Boot 是基于 Spring 框架的一个开源 Java 项目&#xff0c;旨在简化基于 Spring 的应用开发。它通过自动配置机制&#xff0c;能够根据项目中添加的依赖自动配置 Spring 和相关…...

学习C++、QT---03(C++的输入输出、C++的基本数据类型介绍)

每日一言 你比想象中更强大&#xff0c;那些咬牙坚持的瞬间&#xff0c;都在雕刻更好的你。 案例&#xff1a;C的输入输出 但是我也会用c语言的方式来回顾c语言的写法&#xff0c;因为两种语言都是密不可分的&#xff0c;所以不能忘记&#xff0c;所以两个一起写 注意点&#…...

八、Redis的主从原理、哨兵

简介&#xff1a; 想要了解Redis的主从原理&#xff0c;首先得认识一个基本的分布式理论-CAP理论。要理解这个理论&#xff0c;其实也非常简单。 CAP理论 C&#xff1a;Consistency、A&#xff1a;Available、P&#xff1a;Partition tolerance 。这是CAP三个字母的全称。C&…...

springboot通过独立事务管理器实现资源隔离与精准控制​

安心流转站核心业务模块&#xff0c;为什么&#xff01;我们考虑这样设计&#xff0c;下面讲讲专用事务管理器的设计与必要性​&#xff01; 一、为什么需要专属事务管理器&#xff1f;​​ 在安心流转站模块中&#xff0c;存在 ​​「多资源混合操作」​​ 和 ​​「业务高敏…...

59-Oracle 10046事件-知识准备

上一篇说到了autotrace&#xff0c;SQL调试时候的获取性能和参数数据&#xff0c;直接用上trace&#xff0c;还有个更全能的工具10046。是不是很多小伙伴会对这么个数字&#xff0c;觉得起名很奇怪&#xff0c;数字起名任性。“10046”本质是Oracle内核事件的随机性技术编号&am…...

2025年渗透测试面试题总结-2025年HW(护网面试) 03(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年HW(护网面试) 03 1. 同源策略&#xff08;Same-Origin Policy&#xff09; 2. XSS攻击用途 3. XSS类…...

嵌入式开发之嵌入式系统硬件架构设计时,如何选择合适的微处理器/微控制器?

在嵌入式系统硬件架构设计中&#xff0c;选择合适的微处理器 / 微控制器&#xff08;MCU/MPU&#xff09;是关键环节&#xff0c;需从多维度综合评估。以下是系统化的选择策略及核心考量因素&#xff1a; 一、明确应用需求与核心指标 1. 性能需求 处理能力&#xff1a;根据任…...

C++(面向对象编程——继承)

继承基础概念 1.什么是继承&#xff1f; 继承是C三大特性之一&#xff1b;继承是一个已经存在的类的基础上新建一个类&#xff0c;新建的类拥有已经存在的类的特性。主要提现的是代码复用的思想。新的类继承了基类的所有成员变量和成员函数&#xff0c;包括不显示的函数&…...

Unity Shader开发-着色器变体(2)-定义着色器变体

一.定义着色器变体 定义一个着色器变体&#xff08;Shader Variant&#xff09;从概念和实现上讲&#xff0c;主要包括以下几个核心部分 1.使用预编译指令来声明变体关键字 关键字是驱动变体生成的“开关”。它们是简单的字符串标识符&#xff0c;用于在 Shader 代码中标记不…...

Cookie和Session的作用和区别

Cookie 客户端持久化保存服务器数据的一种机制&#xff08;持久化存储就是存硬盘里&#xff09;。Cookie文件数据为键值对形式&#xff0c;客户端根据服务器域名的不同分别存储Cookie&#xff0c;不同域名的Cookie不同&#xff0c;不会产生冲突。 典型应用场景&#xff1a; 保…...

Redis集群部署终极指南:架构选型、生产部署与深度优化

第一部分&#xff1a;Redis集群技术全景解析 1.1 Redis集群演进史 单机时代&#xff08;2009-2012&#xff09;&#xff1a;Redis 2.8之前&#xff0c;纯单机模式复制时代&#xff08;2012-2015&#xff09;&#xff1a;Redis 2.8引入PSYNC改进复制哨兵时代&#xff08;2015-…...

腾讯云IM即时通讯:开启实时通信新时代

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;即时通讯已然成为互联网世界中不可或缺的关键元素。无论是个人日常生活中的社交互动&#xff0c;还是企业运营里的高效协作&#xff0c;即时通讯都发挥着举足轻重的作用&#xff0c;已然渗透到人们生活与工作的每一个角落…...

基于Qt的UDP主从服务器设计与实现

概述 一个基于Qt框架实现的UDP主从服务器系统&#xff0c;该系统具备自动主机选举、故障转移和状态同步等关键功能&#xff0c;适用于分布式能源管理系统中的设备通信与协调。 系统核心功能 1. 自动主机选举与故障转移 系统通过优先级机制实现自动主机选举&#xff0c;当主机…...

JVM(8)——详解分代收集算法

JVM 的分代收集算法不是一种具体的垃圾收集算法实现&#xff0c;而是一种指导思想和设计原则&#xff0c;是现代 JVM 垃圾收集器的基石。其核心思想源于对程序运行过程中对象生命周期分布的观察&#xff08;即弱分代假说&#xff09;。 核心思想与理论基础&#xff1a;分代假说…...

深入Java面试:从Spring Boot到微服务

深入Java面试&#xff1a;从Spring Boot到微服务 在准备互联网大厂的Java岗位面试时&#xff0c;掌握核心技术栈是关键。本文将从技术栈中选取几个重要的技术点进行探讨&#xff0c;帮助你在面试中脱颖而出。 问题一&#xff1a;Spring Boot的核心特性是什么&#xff1f; 面…...

【软考高级系统架构论文】论无服务器架构及其应用

论文真题 近年来,随着信息技术的迅猛发展和应用需求的快速更迭,传统的多层企业应用系统架构面临越来越多的挑战,已经难以适应这种变化。在这一背景下,无服务器架构(Serverless Architecture) 逐渐流行,它强调业务逻辑由事件触发,具有短暂的生命周期,运行于无状态的轻量…...

Snapchat矩阵运营新策略:亚矩阵云手机打造高效社交网络

1. Snapchat平台特性与风控挑战​​ Snapchat作为全球领先的即时社交平台&#xff0c;其独特的阅后即焚功能和强社交属性使其风控系统极为严格&#xff1a; ​​核心风控机制​​ ​​设备指纹检测​​&#xff1a;记录设备ID、系统版本、IP地址等硬件信息​​行为模式分析​…...

BGP路由反射器(RR)实验详解,结尾有详细脚本

目录 路由反射器基础概念 实验拓扑与设计 实验配置步骤 配置验证与排错 实验总结 完整配置命令集 路由反射器基础概念 在传统的IBGP网络中&#xff0c;为了防止路由环路&#xff0c;BGP规定通过IBGP学到的路由不能再传递给其他IBGP对等体&#xff0c;这导致所有IBGP路由…...

【JAVA】数组的使用

文章目录 前言一、数组的基本概念1.1 数组的创建和初始化1.2 数组的基本使用 二、数组是引用类型2.1 初始JVM的内存分布JVM内存划分&#xff08;按功能分区&#xff09; 2.2 基本类型变量与引用类型变量的区别2.3 再谈引用变量2.4 认识null 三、数组作为函数的参数和返回值四、…...

Python的6万张图像数据集CIFAR-10和CIFAR-100说明

CIFAR-10和CIFAR-100数据集是8000万张微小图像数据集的标记子集。CIFAR-10和CIFAR-100都是由AlexKrizhevsky、VinodNair和GeoffreyHinton创建。数据集说明的网页&#xff1a;https://www.cs.toronto.edu/~kriz/cifar.html 一、CIFAR-10数据集 &#xff08;一&#xff09;CIFA…...

CTF--PhP Web解题(走入CTF)

前情提要 分享有趣CTF题目&#xff0c;记录学习过程 题目&#xff08;带注释,方便理解&#xff09; <?php // 开启PHP源代码高亮显示&#xff0c;输出当前文件内容&#xff08;用于调试/展示&#xff09; highlight_file(__FILE__);// 关闭所有错误报告&#xff0c;防止敏感…...

【Linux仓库】进程概念与基本操作【进程·贰】

&#x1f31f; 各位看官好&#xff0c;我是&#xff01; &#x1f30d; Linux Linux is not Unix &#xff01; &#x1f680; 今天来学习Linux中进程概念与基本操作。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更多人哦&#xff01…...

Z-Ant开源程序是简化了微处理器上神经网络的部署和优化

​一、软件介绍 文末提供程序和源码下载 Z-Ant &#xff08;Zig-Ant&#xff09; 是一个全面的开源神经网络框架&#xff0c;专门用于在微控制器和边缘设备上部署优化的 AI 模型。Z-Ant 使用 Zig 构建&#xff0c;为资源受限的硬件上的模型优化、代码生成和实时推理提供端到端…...

面试题-在ts中类型转换的方法

在 TypeScript 中&#xff0c;类型转换主要分为 类型断言&#xff08;Type Assertion&#xff09;、类型守卫&#xff08;Type Guard&#xff09; 和 类型兼容转换 三种方式。以下是详细分类和示例&#xff1a; 一、类型断言&#xff08;Type Assertion&#xff09; 强制编译…...