金华高端网站设计/百度网站关键词排名查询
Spring Boot 源码学习系列
JedisConnectionConfiguration 详解
- 引言
- 往期内容
- 主要内容
- 1. RedisConnectionFactory
- 1.1 单机连接
- 1.2 集群连接
- 1.3 哨兵连接
- 2. JedisConnectionConfiguration
- 2.1 RedisConnectionConfiguration
- 2.2 导入自动配置
- 2.3 相关注解介绍
- 2.4 redisConnectionFactory 方法
- 总结
引言
上篇博文,Huazie 带大家从源码角度分析了 Spring Boot 内置的有关 Redis 的自动配置类【RedisAutoConfiguration
】,其中有关 LettuceConnectionConfiguration
和 JedisConnectionConfiguration
这两个用于配置 Redis 连接的具体实现还未介绍。本篇就以我们常用的 Jedis 实现 为例,带大家详细分析一下 JedisConnectionConfiguration
配置类。
往期内容
在开始本篇的内容介绍之前,我们先来看看往期的系列文章【有需要的朋友,欢迎关注系列专栏】:
Spring Boot 源码学习 |
Spring Boot 项目介绍 |
Spring Boot 核心运行原理介绍 |
【Spring Boot 源码学习】@EnableAutoConfiguration 注解 |
【Spring Boot 源码学习】@SpringBootApplication 注解 |
【Spring Boot 源码学习】走近 AutoConfigurationImportSelector |
【Spring Boot 源码学习】自动装配流程源码解析(上) |
【Spring Boot 源码学习】自动装配流程源码解析(下) |
【Spring Boot 源码学习】深入 FilteringSpringBootCondition |
【Spring Boot 源码学习】OnClassCondition 详解 |
【Spring Boot 源码学习】OnBeanCondition 详解 |
【Spring Boot 源码学习】OnWebApplicationCondition 详解 |
【Spring Boot 源码学习】@Conditional 条件注解 |
【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解 |
【Spring Boot 源码学习】RedisAutoConfiguration 详解 |
主要内容
1. RedisConnectionFactory
RedisConnectionFactory
是 Spring Data Redis 中的一个接口,它提供了创建和管理 Redis 连接的方法。使用 RedisConnectionFactory
可以获取到 Redis 连接对象,然后通过该对象对 Redis 进行存储、查询、删除等操作。
我们来看看 RedisConnectionFactory
的相关的源码:
// 线程安全的 Redis 连接工厂
public interface RedisConnectionFactory extends PersistenceExceptionTranslator {RedisConnection getConnection();RedisClusterConnection getClusterConnection();boolean getConvertPipelineAndTxResults();RedisSentinelConnection getSentinelConnection();
}
我们简单分析一下 Redis 连接工厂中的方法:
RedisConnection getConnection()
:提供与 Redis 交互的合适连接。如果连接工厂需要初始化,但工厂尚未初始化,则抛出IllegalStateException
。RedisClusterConnection getClusterConnection()
:提供与 Redis Cluster 交互的合适连接。如果连接工厂需要初始化,但工厂尚未初始化,则抛出IllegalStateException
。boolean getConvertPipelineAndTxResults()
:指定是否应将管道结果转换为预期的数据类型。如果为false
,RedisConnection.closePipeline()
和RedisConnection#exec()
的结果将是底层驱动程序返回的类型。RedisSentinelConnection getSentinelConnection()
:提供与 Redis Sentinel 交互的合适连接。如果连接工厂需要初始化,但工厂尚未初始化,则抛出IllegalStateException
。
以常用的 Jedis 实现为例,我们介绍一下 Redis 连接工厂的 Jedis 实现,即 JedisConnectionFactory
。由于该类这是 Spring Data Redis 中的代码,本篇不详细展开了,感兴趣的朋友可以自行翻阅 Spring 源码进行查看。
那 JedisConnectionFactory
主要有哪些内容呢 ?
-
创建 Jedis 连接 :通过调用
createXXX()
方法,可以创建一个 Jedis 连接对象,用于与 Redis 服务器进行通信。当然,在获取连接之前,我们必须先初始化该连接工厂。 -
管理连接池 :它内部维护了一个连接池,用于管理和复用 Jedis 连接。当需要创建一个新的 Jedis 连接时,首先会检查连接池中是否有可用的连接,如果有则直接使用,否则创建一个新的连接。这样可以提高性能,减少频繁创建和关闭连接带来的开销。
protected Jedis fetchJedisConnector() {try {if (getUsePool() && pool != null) {return pool.getResource();}Jedis jedis = createJedis();// force initialization (see Jedis issue #82)jedis.connect();return jedis;} catch (Exception ex) {throw new RedisConnectionFailureException("Cannot get Jedis connection", ex);} }
-
配置连接参数 :允许用户自定义连接参数,例如 超时时间、最大连接数等。这些参数可以在创建连接时通过构造函数传入,也可以在创建连接后,通过
JedisPoolConfig
或者下面的三种连接类型的配置类进行修改。 -
支持多种连接类型 :包括 单机连接、哨兵连接 和 集群连接。这些连接类型的配置如下:
RedisStandaloneConfiguration
(单机配置)RedisSentinelConfiguration
(哨兵配置)RedisClusterConfiguration
(集群配置)
1.1 单机连接
单机连接,我们需要使用到 RedisStandaloneConfiguration
,可见如下示例:
@Configuration
public class RedisConfig {@Beanpublic JedisConnectionFactory jedisConnectionFactory() {RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration("localhost", 6379);JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(configuration);return jedisConnectionFactory;}
}
1.2 集群连接
集群连接,我们需要使用到 RedisClusterConfiguration
,示例如下:
@Configuration
public class RedisConfig {@Beanpublic JedisConnectionFactory jedisConnectionFactory() {Set<Host> nodes = new HashSet<>();nodes.add(new Host("127.0.0.1", 20011));nodes.add(new Host("127.0.0.1", 20012));nodes.add(new Host("127.0.0.1", 20013));RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration();clusterConfiguration.setClusterNodes(nodes);JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(clusterConfiguration);return jedisConnectionFactory;}
}
1.3 哨兵连接
哨兵连接,我们需要使用到 RedisSentinelConfiguration
,参考如下:
@Configuration
public class RedisConfig {@Beanpublic JedisConnectionFactory jedisConnectionFactory() {Set<Host> sentinels = new HashSet<>();sentinels.add(new Host("127.0.0.1", 30001));sentinels.add(new Host("127.0.0.1", 30002));sentinels.add(new Host("127.0.0.1", 30003));RedisSentinelConfiguration sentinelConfiguration = new RedisSentinelConfiguration();sentinelConfiguration.setMasterName("mymaster");sentinelConfiguration.setSentinels(sentinels);JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(sentinelConfiguration);return jedisConnectionFactory;}
}
2. JedisConnectionConfiguration
那么 Spring Data Redis 的 JedisConnectionFactory
的自动配置在 Spring Boot 是如何实现的呢?
Spring Boot 是通过内置的 JedisConnectionConfiguration
配置类来完成这一功能。下面我们具体分析一下:
注意: 以下涉及 Spring Boot 源码 均来自版本
2.7.9
,其他版本有所出入,可自行查看源码。
2.1 RedisConnectionConfiguration
翻看 JedisConnectionConfiguration
的源码,我们发现它继承了 RedisConnectionConfiguration
类,该类的部分源码如下:
abstract class RedisConnectionConfiguration {private static final boolean COMMONS_POOL2_AVAILABLE = ClassUtils.isPresent("org.apache.commons.pool2.ObjectPool",RedisConnectionConfiguration.class.getClassLoader());// 。。。protected final RedisStandaloneConfiguration getStandaloneConfig() {// 。。。}protected final RedisSentinelConfiguration getSentinelConfig() {// 。。。}protected final RedisClusterConfiguration getClusterConfiguration() {// 。。。}protected final RedisProperties getProperties() {// 。。。}protected boolean isPoolEnabled(Pool pool) {Boolean enabled = pool.getEnabled();return (enabled != null) ? enabled : COMMONS_POOL2_AVAILABLE;}private List<RedisNode> createSentinels(RedisProperties.Sentinel sentinel) {// 。。。}protected ConnectionInfo parseUrl(String url) {// 。。。}static class ConnectionInfo {private final URI uri;private final boolean useSsl;private final String username;private final String password;// 。。。}
}
简单阅读上述的源码,我们可以很快总结一下:
getStandaloneConfig()
:返回一个RedisStandaloneConfiguration
对象,用于配置单机模式的 Redis 连接。getSentinelConfig()
:返回一个RedisSentinelConfiguration
对象,用于配置哨兵模式的 Redis 连接。getClusterConfiguration()
:返回一个RedisClusterConfiguration
对象,用于配置集群模式的 Redis 连接。getProperties()
:返回一个RedisProperties
对象,用于获取 Redis 连接的相关配置信息。isPoolEnabled(Pool pool)
:判断给定的连接池是否启用。如果连接池的enabled
属性不为null
,则返回该属性值;否则返回COMMONS_POOL2_AVAILABLE
常量【如果org.apache.commons.pool2.ObjectPool
类存在,那么COMMONS_POOL2_AVAILABLE
将被设置为true
,否则将被设置为false
】。createSentinels(RedisProperties.Sentinel sentinel)
:根据给定的哨兵配置创建一个RedisNode
列表,用于配置哨兵模式的Redis
连接。parseUrl(String url)
:解析给定的 URL 字符串,并返回一个包含连接信息的ConnectionInfo
对象。
其中内部静态类ConnectionInfo
,用于存储解析后的连接信息,包括:uri
:连接的 URI。useSsl
:是否使用 SSL 加密。username
:连接的用户名。password
:连接的密码。
2.2 导入自动配置
上篇博文中,我们已经知道了 JedisConnectionConfiguration
是在 RedisAutoConfiguration
中通过 @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
导入的。
2.3 相关注解介绍
我们在 META-INF/spring-autoconfigure-metadata.properties
文件中,发现了有关 JedisConnectionConfiguration
的相关配置:
org.springframework.boot.autoconfigure.data.redis.JedisConnectionConfiguration=
org.springframework.boot.autoconfigure.data.redis.JedisConnectionConfiguration.ConditionalOnClass=org.apache.commons.pool2.impl.GenericObjectPool,redis.clients.jedis.Jedis,org.springframework.data.redis.connection.jedis.JedisConnection
显然这里涉及到了 ConditionalOnClass
注解,我们翻看 JedisConnectionConfiguration
配置类的源码,如下:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ GenericObjectPool.class, JedisConnection.class, Jedis.class })
@ConditionalOnMissingBean(RedisConnectionFactory.class)
@ConditionalOnProperty(name = "spring.redis.client-type", havingValue = "jedis", matchIfMissing = true)
class JedisConnectionConfiguration extends RedisConnectionConfiguration {// 。。。@BeanJedisConnectionFactory redisConnectionFactory(ObjectProvider<JedisClientConfigurationBuilderCustomizer> builderCustomizers) {return createJedisConnectionFactory(builderCustomizers);}// 。。。
}
我们先来看看上述 JedisConnectionConfiguration
配置类涉及到的注解,如下:
@Configuration(proxyBeanMethods = false)
: 该类是一个配置类,用于定义和配置 Spring 容器中的 bean。proxyBeanMethods = false
表示不使用 CGLIB 代理来创建 bean 的子类实例。@ConditionalOnClass({ GenericObjectPool.class, JedisConnection.class, Jedis.class })
:只有在项目中存在GenericObjectPool
、JedisConnection
和Jedis
这三个类时,才会加载这个配置类。这可以确保项目依赖中包含了这些类,避免因为缺少依赖而导致的配置错误。@ConditionalOnMissingBean(RedisConnectionFactory.class)
:表示只有在项目中不存在RedisConnectionFactory
这个 bean 时,才会加载这个配置类。这可以确保项目没有重复定义相同的 bean,避免冲突。@ConditionalOnProperty(name = "spring.redis.client-type", havingValue = "jedis", matchIfMissing = true)
:只有在项目的配置文件中指定了spring.redis.client-type
属性值为"jedis"
时,才会加载这个配置类。如果配置文件中指定该属性值不是"jedis"
,则不会加载这个配置类。matchIfMissing = true
表示如果没有找到匹配的属性值,也会加载这个配置类。@Bean
:用于声明一个方法创建的对象是一个 Spring 管理的 Bean。Spring 容器会自动管理这个 Bean 的生命周期,包括依赖注入、初始化和销毁等。
2.4 redisConnectionFactory 方法
通过翻看 JedisConnectionConfiguration
的源码,我们可以看到 redisConnectionFactory
方法是被 @Bean
注解标注的,意味着该方法创建的 Jedis
连接工厂将成为 Spring
管理的 Bean
对象。
该方法接受一个入参 ObjectProvider<JedisClientConfigurationBuilderCustomizer>
,它是一个提供者(Provider),它可以提供一个或多个JedisClientConfigurationBuilderCustomizer
对象。该对象是一个用于定制 Jedis 客户端配置的接口。通过实现这个接口,可以自定义 Jedis 客户端的配置,例如设置连接池大小、超时时间、SSL 配置等。这样我们就可以根据实际的需求灵活地调整 Jedis 客户端的行为。
进入 redisConnectionFactory
方法,我们看到它直接调用了 createJedisConnectionFactory
方法并返回一个 JedisConnectionFactory
对象。
我们继续查看 createJedisConnectionFactory
方法:
private JedisConnectionFactory createJedisConnectionFactory(ObjectProvider<JedisClientConfigurationBuilderCustomizer> builderCustomizers) {JedisClientConfiguration clientConfiguration = getJedisClientConfiguration(builderCustomizers);if (getSentinelConfig() != null) {return new JedisConnectionFactory(getSentinelConfig(), clientConfiguration);}if (getClusterConfiguration() != null) {return new JedisConnectionFactory(getClusterConfiguration(), clientConfiguration);}return new JedisConnectionFactory(getStandaloneConfig(), clientConfiguration);
}
我们详细来分析一下上述代码:
-
首先,调用
getJedisClientConfiguration
方法返回一个JedisClientConfiguration
配置类对象。-
继续进入
getJedisClientConfiguration
方法:private JedisClientConfiguration getJedisClientConfiguration(ObjectProvider<JedisClientConfigurationBuilderCustomizer> builderCustomizers) {JedisClientConfigurationBuilder builder = applyProperties(JedisClientConfiguration.builder());RedisProperties.Pool pool = getProperties().getJedis().getPool();if (isPoolEnabled(pool)) {applyPooling(pool, builder);}if (StringUtils.hasText(getProperties().getUrl())) {customizeConfigurationFromUrl(builder);}builderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));return builder.build(); }
-
首先,调用
applyProperties
方法,获取一个JedisClientConfigurationBuilder
对象,用于构建JedisClientConfiguration
对象。private JedisClientConfigurationBuilder applyProperties(JedisClientConfigurationBuilder builder) {PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();map.from(getProperties().isSsl()).whenTrue().toCall(builder::useSsl);map.from(getProperties().getTimeout()).to(builder::readTimeout);map.from(getProperties().getConnectTimeout()).to(builder::connectTimeout);map.from(getProperties().getClientName()).whenHasText().to(builder::clientName);return builder; }
该方法的主要目的是根据属性配置来定制
builder
对象。-
首先,创建一个
PropertyMapper
对象map
,并调用其alwaysApplyingWhenNonNull()
方法,以便在非空情况下始终应用映射规则。 -
接下来,使用
map.from()
方法设置映射规则。这里分别设置了以下映射规则:- 如果属性中的
isSsl
为true
,则调用builder::useSsl
方法,将builder
对象的useSsl
属性设置为true
。 - 将属性中的
timeout
值设置为builder
对象的readTimeout
属性。 - 将属性中的
connectTimeout
值设置为builder
对象的connectTimeout
属性。 - 如果属性中的
clientName
有文本内容,则调用builder::clientName
方法,将builder
对象的clientName
属性设置为该文本内容。
- 如果属性中的
-
最后,返回经过配置的
builder
对象。
-
-
接着,从
RedisProperties
中获取Jedis
连接池的配置信息。-
enabled
: 是否启用连接池。如果可用,则自动启用。在 Jedis 中,哨兵模式下的连接池是隐式启用的,此设置仅适用于单节点设置。 -
maxIdle
: 池中空闲连接的最大数量。使用负值表示无限数量的空闲连接。 -
minIdle
: 池中保持最小空闲连接的目标数量。此设置仅在空闲连接和驱逐运行之间的时间都为正时才有效。 -
maxActive
: 给定时间内,连接池可以分配的最大连接数。使用负值表示无限制。 -
maxWait
: 当连接池耗尽时,连接分配应阻塞的最长时间。使用负值表示无限期阻塞。 -
timeBetweenEvictionRuns
: 空闲对象驱逐线程的运行时间间隔。当值为正时,空闲对象驱逐线程开始运行,否则不执行空闲对象驱逐。
-
-
然后,判断连接池是否启用 ?
-
如果启用,则调用
applyPooling
方法,将连接池配置应用到builder
对象上。private void applyPooling(RedisProperties.Pool pool,JedisClientConfiguration.JedisClientConfigurationBuilder builder) {builder.usePooling().poolConfig(jedisPoolConfig(pool)); }private JedisPoolConfig jedisPoolConfig(RedisProperties.Pool pool) {JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(pool.getMaxActive());config.setMaxIdle(pool.getMaxIdle());config.setMinIdle(pool.getMinIdle());if (pool.getTimeBetweenEvictionRuns() != null) {config.setTimeBetweenEvictionRuns(pool.getTimeBetweenEvictionRuns());}if (pool.getMaxWait() != null) {config.setMaxWait(pool.getMaxWait());}return config; }
usePooling()
: 启用连接池功能poolConfig(jedisPoolConfig(pool))
:将连接池的配置信息传递给builder
对象
-
-
判断属性中的
spring.redis.url
是否包含非空的文本内容?- 如果包含非空的文本内容 ,则调用 customizeConfigurationFromUrl 方法:
private void customizeConfigurationFromUrl(JedisClientConfiguration.JedisClientConfigurationBuilder builder) {ConnectionInfo connectionInfo = parseUrl(getProperties().getUrl());if (connectionInfo.isUseSsl()) {builder.useSsl();} }
- 首先,调用
parseUrl
方法来解析URL
,并将结果存储在connectionInfo
变量中。 - 然后,调用
connectionInfo#isUseSsl
方法,判断是否需要使用 SSL 连接。如果需要使用 SSL 连接,则调用builder
对象的useSsl()
方法来启用 SSL 功能。
- 首先,调用
- 如果包含非空的文本内容 ,则调用 customizeConfigurationFromUrl 方法:
-
遍历
builderCustomizers
中的所有自定义器,并对每个自定义器调用其customize
方法,传入builder
作为参数,用于进一步定制 Jedis 客户端的配置。
-
-
-
接着,获取哨兵模式配置,并判断是否为空,如果不为空,则直接根据哨兵模式的配置创建并返回一个连接工厂实例。
-
然后,获取集群模式配置,并判断是否为空,如果不为空,则直接根据集群模式的配置创建并返回一个连接工厂实例。
-
最后,获取单机模式配置,根据单机模式的配置创建并返回一个连接工厂实例。
总结
本篇我们深入分析了 JedisConnectionConfiguration
配置类的相关内容,该类用于配置 Redis 连接的 Jedis 实现。
相关文章:

【Spring Boot 源码学习】JedisConnectionConfiguration 详解
Spring Boot 源码学习系列 JedisConnectionConfiguration 详解 引言往期内容主要内容1. RedisConnectionFactory1.1 单机连接1.2 集群连接1.3 哨兵连接 2. JedisConnectionConfiguration2.1 RedisConnectionConfiguration2.2 导入自动配置2.3 相关注解介绍2.4 redisConnectionF…...

联想服务器-HTTP boot安装Linux系统
HTTP boot与传统PXE的主要差异 HTTP不再需要使用UDP协议的tftp服务(连接不可靠、不支持大文件)了,只需要dhcp 和http 两个服务即可,支持较稳定的大文件传输。 实验环境 ThinkSystem服务器SR650V2 SR660V2 通过HTTP boot安装Cen…...

容器滚动更新过程中流量无损
应用在发布或重启的期间会出现少量的 5xx 异常,应该如何解决? 我们发现导致流量有损的原因有很多,比如: 上线时,应用在就绪前收到流量,导致请求无法被处理; 下线时,应用没有做优雅…...

深入理解JS中的this
1、浅谈this 1.1、调用位置 在学习this的绑定过程之前,首先要理解调用位置,即函数在代码中被调用的位置,因此我们需要分析调用栈,看以下代码 function baz(){// 当前调用栈是baz// 因此调用位置就是全局作用域console。log(&qu…...

rust 基础数据类型
默认类型 大部分情况下,rust 可以基于上下文自动推导出变量的类型。下面代码中,变量 x 没有显式,rust 默认是 i32 类型。 fn main() {let x 5; }但也有一些例外情况,比如,字符串类型的转换中变量 x 的类型ÿ…...

ELK极简上手
目录 引言 首先,下载相关的包 其次,安装启动elasticsearch 下一步,安装并启动logstash 最后,安装并启动kibana 进一步的,测试数据的流动 引言 最近整理电脑发现之前的一篇ELK极简入门笔记,现整理发出…...

在 JavaScript 中,变量的作用域是如何确定的?
在 JavaScript 中,变量的作用域是由作用域链(Scope Chain)来确定的。作用域链是指变量在执行期间访问的作用域的链式结构。 JavaScript 中的作用域分为全局作用域和局部作用域(函数作用域和块级作用域)。 全局作用域…...

常见面试题-TCP三次握手四次挥手
TCP 三次握手/四次挥手 参数用途SYN用于启动和建立连接时,同步设备之间的序列号。0到2^32 - 1的随机数。ACK向另一端确认已经收到 SYN,数值为收到 SYN 增一。SYN-ACK确认之前收到了 SYN,数值为自定义值。FIN终止连接。RST重置连接。 三次握…...

前端框架Vue学习 ——(六)Vue组件库Element
文章目录 Element 介绍快速入门常见组件表格分页Dialog 对话框组件表单 Container 布局容器 Element 介绍 Element:是饿了么团队研发的,一套为开发者、 设计师和产品经理准备的基于Vue 2.0的桌面端组件库。 组件:组成网页的部件,…...

第六章:Property-based Testing and Test Oracles
文章目录 Test OraclesActive and Passive Test OraclesTypes of Test OraclesFormal, executable specificationsSolved examplesMetamorphic oraclesAlternative implementations (备用实现)Heuristic oracles (启发式)The Golden Program!Oracle Deviation (Oracle偏差)T…...

react生命周期函数
React 组件的生命周期可分为三大阶段:挂载阶段(Mounting)、更新阶段(Updating)和卸载阶段(Unmounting)。 1.挂载阶段(Mounting) 在组件被插入到 DOM 中后,会…...

QSqlDatabase使用Sqlite
QSqlDatabase使用Sqlite Sqlite本身就可以被内嵌在程序中,QSqlDatabase也自带Sqlite驱动,无需任何第三方依赖,可以直接使用 QSqlDatabase _db QSqlDatabase::addDatabase("QSQLITE"); QString dbPath "/path/to/xxx.db&qu…...

宝马——使用人工智能制造和驾驶汽车
德国汽车制造商宝马(BMW)每年在全球制造和销售250万台汽车,其品牌包括宝马、MINI和劳斯莱斯。 宝马汽车以其卓越的性能和对新技术的应用而著名,它是道路上最精致的汽车之一,并且和其竞争对手戴姆勒(Daimler)一样,在将自动驾驶汽车…...

java入门,Map<? extends String, ?>
一、前言 是不是平时写业务代码的时候很少用到这个写法:Map<? extends String, ?>,这是Map类型,Map的键是? extends String 类型,值是?。为什么不是我们平时写的Map< String, Object>,这种写法有什么好…...

Spring Boot 统一处理功能
目录 1.用户登陆权限验证 1.1 每个方法验证 1.2 Spring AOP 用户统一登陆验证 1.3 拦截器 1.3.1 自定义拦截器 1.3.2 将自定义拦截器配置到系统设置中,并且设置拦截规则 1.3.3 排除所有的静态资源 1.4 登录拦截器(练习) 1.5 拦截器原…...

香港金融科技周VERTU CSO Sophie谈Web3.0的下一个风口 手机虚拟货币移动支付
10月31日,香港金融科技周正式拉开帷幕。这项香港金融科技界地年度盛事今年已经踏入了第八届,本届活动吸引超过数百位金融科技专业人士、创业者和行业领袖现场参与,线上参与观众超过10万人次。 在金融科技周的圆桌会议上,VERTU首席…...

分布式单元化
一 分布式单元化 1.1 两地三中心 顾名思义,两地指的是两个城市:同城,异地。三中心指的是三个数据中心:生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统,双中心具备相当的业…...

wvp-gb28181-pro接入海康摄像头
网络-高级配置-平台接入 sip服务器信息默认参数如下,一键安装wvp完成之后默认就是这样的参数 设置项 设置值 平台接入方式 28181 本地sip端口 5060 传输协议 tcp、udp(外网的话我建议还是用tcp) 启用 勾选 协议版本 GB/T28181-201…...

近视眼选择什么台灯好?专家推荐的防近视台灯
年轻的时候不懂,以为自己的眼睛不好,近视度数高,是因为长时间看书造成的,其实我们都忽视了一个最为重要的影响因素,那就是灯光。如今的孩子面临着比我们以前更要繁重的学习压力,因此更需要注意用眼健康了&a…...

数据标注工具【LabelImg】安装使用 用VOC制作自己的数据集
labelImg的安装 ⭐️LabelImg简介⭐️LabelImg的安装⭐️labelImg标注数据集⭐️利用VOC制作自己的数据集 ⭐️LabelImg简介 Labelimg是一款开源的数据标注工具,标签可用于分类和目标检测,它是用python写的,并使用Qt作为其图形界面…...

Zeus IoT : 基于 SpringBoot 的分布式开源物联网大数据平台
Zeus IoT 是一个集设备数据采集、存储、分析、观测为一体的开源物联网平台,全球首创基于 Zabbix 的物联网分布式数据采集架构,具备超百万级物联网设备的并发监控能力,真正具备工业级性能与稳定性的开源物联网大数据中台。 Zeus IoT 致力于让设…...

面试—如何介绍项目中的多级缓存?
项目中使用的多级缓存也就是 分布式缓存 Redis 本地缓存 Caffeine,那么令 Caffeine 作为一级缓存,Redis 作为二级缓存,在项目中通过记录数据的访问次数,将热点数据放在 本地缓存,将非热点数据放在 Redis缓存 中&#…...

PyTorch入门学习(十七):完整的模型训练套路
目录 一、构建神经网络 二、数据准备 三、损失函数和优化器 四、训练模型 五、保存模型 一、构建神经网络 首先,需要构建一个神经网络模型。在示例代码中,构建了一个名为Tudui的卷积神经网络(CNN)模型。这个模型包括卷积层、…...

《 Hello 算法 》 - 免费开源的数据结构与算法入门教程电子书,包含大量动画、图解,通俗易懂
这本学习算法的电子书应该是我看过这方面最好的书了,代码例子有多种编程语言,JavaScript 也支持。 《 Hello 算法 》,英文名称是 Hello algo,是一本关于编程中数据解构和算法入门的电子书,作者是毕业于上海交通大学的…...

数据库之事务
数据库之事务 事务的特点: ACID 原子性 一致性:数据库的完整性约束,不能被破坏 隔离性 持久性:数据一旦提交,事务的效果将会被永久的保留在数据库中。而且不会被回滚 主从复制 高可用 备份 权限控制 脏读&am…...

NOIP2023模拟12联测33 B. 游戏
NOIP2023模拟12联测33 B. 游戏 文章目录 NOIP2023模拟12联测33 B. 游戏题目大意思路code 题目大意 期望题 思路 二分答案 m i d mid mid ,我们只关注学生是否能够使得被抓的人数 ≤ m i d \le mid ≤mid 那我们就只关心 a > m i d a > mid a>mid 的房…...

代码随想录打卡第六十三天|84.柱状图中最大的矩形
84.柱状图中最大的矩形 题目:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。 提示: 1 < heights.length <105 0 < h…...

python tempfile 模块使用
在Python中,tempfile 模块用于创建临时文件和目录,它们可以用于存储中间处理数据,不需要长期保存。该模块提供了几种不同的类和函数来创建临时文件和目录。 下面是几个常用的 tempfile 使用方法: 临时文件 使用 NamedTemporary…...

【软件测试】接口测试实战详解
最近找到了几个问题,都还比较有代表性。 作为一个初级测试,想学接口测试,但是一点头绪都没有。求教大神指点,有没有好的书或者工具推荐?如何做接口测试呢?接口测试有哪些工具做接口测试的流程一般是怎么样…...

轻量封装WebGPU渲染系统示例<20>- 美化一下元胞自动机之生命游戏(源码)
当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/GameOfLifePretty.ts 系统特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据(内外部相关资源)和渲染机制分离…...