RedisTemplate使用详解
- RedisTemplate介绍
- StringRedisTemplate介绍
- RedisConnectionFactory介绍
- RedisConnectionFactory源码解析
- RedisOperations介绍
- RedisOperations源码解析
- RedisTemplate使用连接池
- 配置RedisTemplate连接池
- 连接池配置
- RedisTemplate应用场景
- RedisTemplate主要特点
- RedisTemplate使用案例
- RedisTemplate源码解析
- RedisTemplate中的设计模式
- RedisTemplate中的连接池长连接无法生效的原因
- RedisTemplate释放连接
- RedisTemplate如何处理连接超时异常
- Redis拓展

RedisTemplate介绍
RedisTemplate是Spring Data Redis的核心类,它提供了对Redis访问的支持。这个类在给定对象和Redis存储中的底层二进制数据之间执行自动序列化(Serialization)和反序列化(Deserialization)操作。
RedisTemplate的底层通过RedisConnectionFactory对多种Redis驱动进行集成,上层通过RedisOperations提供丰富的API,并结合Spring基于泛型的bean注入,为开发提供了极大的便利。一旦配置好,这个类就是线程安全的。
注意:虽然模板是通用的,但它取决于序列化程序/反序列化程序来正确地将给定对象与二进制数据相互转换。

StringRedisTemplate介绍
StringRedisTemplate是Spring Data Redis中一个重要的类,它是RedisTemplate以字符串为中心的扩展。由于针对Redis的大多数操作都是基于字符串的,因此StringRedisTemplate提供了一个专用的类来进行处理。
StringRedisTemplate继承自RedisTemplate类,它实现了BeanClassLoaderAware、Aware、InitializingBean、RedisOperations<K, V>接口。它是默认采用String的序列化策略,保存的key和value都是采用此策略序列化保存的。
另外,StringRedisTemplate与RedisTemplate两者的数据是不共通的,也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
RedisConnectionFactory介绍
RedisConnectionFactory是一个接口,用于配置连接信息。在Spring Data Redis方案中,它通常被JredisConnectionFactory、LettuceConnectionFactory或SrpConnectionFactory等实现类所替代。
这个接口的作用是建立与Redis服务器的连接,并提供一种方式来配置和管理这些连接。在具体实现中,可能会使用不同的连接库和驱动程序,以适应不同的应用场景和需求。
此外,RedisConnectionFactory还可以与哨兵模式结合使用,以实现Redis服务器的故障转移和自动切换。在这种模式下,Redis服务器可以有多个哨兵进程,每个进程都独立运行并监控其他Redis实例的运行状态。当某个主服务器宕机时,哨兵进程会自动将一个从服务器升级为主服务器,并通过发布订阅模式通知其他从服务器进行切换。这种机制可以保证系统的可用性和稳定性。
RedisConnectionFactory源码解析
RedisConnectionFactory 是 Spring Data Redis 的核心接口之一,用于创建 RedisConnection 对象,实现与 Redis 服务器的连接。以下是 RedisConnectionFactory 接口的源码:
public interface RedisConnectionFactory {/*** 根据 key 获取 RedisConnection 对象* @param key RedisConnection 的 key* @return RedisConnection 对象*/RedisConnection getConnection(String key);/*** 根据 key 获取 RedisTemplate 对象* @param key RedisTemplate 的 key* @return RedisTemplate 对象*/<T> RedisTemplate<T> getRedisTemplate(String key);/*** 关闭 RedisConnectionFactory 对象,释放资源*/void destroy();
}
在 RedisConnectionFactory 接口的实现类中,通常会实现 createConnection() 方法来创建 RedisConnection 对象,以及 destroyConnection() 方法来关闭 RedisConnection 对象并释放资源。此外,还可以通过实现 getRedisTemplate() 方法来提供 RedisTemplate 对象,方便用户进行 Redis 操作。
RedisOperations介绍
RedisOperations是一个接口,定义了一些对Redis操作的方法,它主要提供对Redis键、事务、运行脚本等命令的支持。它不负责数据的读写,而是专注于对Redis命令的操作。
RedisOperations接口定义的方法在RedisTemplate类中得到了实现,通过这个类可以实现对Redis的各种操作。例如,通过RedisTemplate可以发送Redis命令,并对返回的结果进行处理。
在具体实现上,RedisTemplate使用了不同的数据结构来实现对Redis命令的支持,例如使用List或Map等数据结构来存储命令,并在执行时将它们发送到Redis服务器。此外,RedisTemplate还提供了事务和管道等功能,以优化对Redis的访问。
RedisOperations是一个专注于对Redis命令操作的接口,通过RedisTemplate类可以实现对Redis的各种操作。
RedisOperations源码解析
RedisOperations 是 Spring Data Redis 的核心接口之一,它封装了对 Redis 的操作,包括对 Redis 的读写、删除等操作。以下是 RedisOperations 接口的源码:
public interface RedisOperations<K, V> {/*** 根据 key 获取 RedisConnection 对象* @param key RedisConnection 的 key* @return RedisConnection 对象*/RedisConnection getConnection(K key);/*** 根据 key 获取 RedisTemplate 对象* @param key RedisTemplate 的 key* @return RedisTemplate 对象*/<T> RedisTemplate<T> getRedisTemplate(K key);/*** 设置 key 的值为 value,并返回旧值。* @param key 键值对应的键* @param value 键值对应的值* @return 旧值*/V getAndSet(K key, V value);/*** 为 key 的值加上 delta。* @param key 需要进行操作的键值对应的键* @param delta 需要添加的值* @return 旧值*/Long increment(K key, long delta);
}
在 RedisOperations 接口的实现类中,通常会实现 doInRedis() 方法来执行具体的 Redis 操作,例如 set、get、delete 等操作。此外,还可以通过实现 getConnection() 和 getRedisTemplate() 方法来提供 RedisConnection 和 RedisTemplate 对象,方便用户进行 Redis 操作。
RedisTemplate使用连接池
RedisTemplate使用连接池来管理Redis连接。连接池可以重复利用连接,减少创建和销毁连接的开销,从而提高系统的性能和稳定性。在使用RedisTemplate时,需要配置RedisConnectionFactory来初始化连接池。
具体的配置方式可以参考Spring Data Redis的官方文档或相关教程。一般来说,需要设置连接池的参数,包括最大连接数、最小连接数、连接超时时间等。同时,还需要设置序列化程序和序列化参数,以便正确地将对象转换为二进制数据,并将二进制数据转换回对象。
在使用RedisTemplate时,可以通过execute等方法来发送Redis命令并处理返回结果。同时,RedisTemplate还提供了事务和管道等功能,以优化对Redis的访问。
使用RedisTemplate时需要配置连接池,以确保对Redis的访问更加高效和稳定。
配置RedisTemplate连接池
配置RedisTemplate连接池需要先配置RedisConnectionFactory,RedisConnectionFactory用于创建Redis连接。具体步骤如下:
- 导入相关依赖:
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
- 配置连接池参数:
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(100); // 设置最大连接数
poolConfig.setMaxIdle(10); // 设置最大空闲连接数
poolConfig.setMinIdle(1); // 设置最小空闲连接数
- 创建连接池:
JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379);
- 配置连接工厂:
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
- 配置连接工厂参数:
JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
connectionFactory.setHostName("localhost"); // 设置redis主机名
connectionFactory.setPort(6379); // 设置redis端口号
connectionFactory.setPoolConfig(poolConfig); // 设置连接池
- 创建连接工厂:
RedisConnectionFactory redisConnectionFactory = connectionFactory;
- 在RedisTemplate中使用连接工厂:
import org.springframework.data.redis.core.RedisTemplate;
- 配置RedisTemplate:
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
连接池配置
连接池参数是指配置连接池时需要设置的参数,包括最大连接数、最小连接数、连接超时时间等。这些参数可以影响连接池的性能和稳定性。
1. 最大连接数(maxTotal) :指定连接池的最大连接数,即连接池中允许同时存在的最大连接数量。当连接池已满时,新的请求会被阻塞等待,直到有可用的连接。适当设置最大连接数可以防止连接池被耗尽。
2. 最大空闲连接数(maxIdle) :指定连接池中允许的最大空闲连接数量,当连接池中的连接数超过最大空闲连接数时,多余的连接将被关闭。适当设置最大空闲连接数可以避免连接池中连接数过多,占用过多的系统资源。
3. 最小空闲连接数(minIdle) :指定连接池中的最小空闲连接数量,当连接池中的空闲连接数低于这个数值时,连接池将尝试创建新的连接。
4. 连接超时时间(maxWaitTime) :指定连接池等待可用连接的最大时间,超过这个时间将抛出异常。
5. 连接超时单位(maxWaitTimeUnit) :指定连接池等待可用连接的时间单位,如毫秒或秒。
以上是常见的连接池参数,根据不同的应用场景和需求,需要适当调整这些参数。在实际应用中,需要根据系统资源和性能需求来权衡这些参数的设置。以下是更多的配置参数
| 配置参数 | 配置含义 |
|---|---|
| testWhileIdle | 在连接闲置时是否进行有效性检测。 |
| minEvictableIdleTimeMillis | 一个连接在指定的时间内没有被使用,那么该连接将被回收。 |
| timeBetweenEvictionRunsMillis | 空闲连接的检测周期。 |
| numTestsPerEvictionRun | 每个idle eviction run中检测的空闲连接数量。 |
RedisTemplate应用场景
RedisTemplate是Spring Data Redis的核心类,主要用于对Redis的访问。它封装了Jedis和Lettuce的Redis操作,简化了对Redis的操作。
RedisTemplate的应用场景非常广泛,例如在项目启动时,可以使用RedisTemplate初始化Redis缓存,将数据提前加载到缓存中,避免在项目中查询数据库,从而提高性能。此外,RedisTemplate还支持高级特性,如pipelining、事务、LUA Scripting、Redis Sentinel、Redis Cluster等等,这些特性可以进一步扩展Redis的功能和性能。
在实际项目中,RedisTemplate通常被用于以下场景:
- 数据缓存 :将频繁查询的数据存储在Redis中,减少对数据库的访问次数,提高系统的响应速度和性能。
- 消息队列 :使用Redis作为消息队列,实现微服务之间的解耦和通信。通过Redis的发布订阅模式,可以实现消息的广播和订阅。
- 分布式锁 :使用Redis作为分布式锁的实现,确保多个微服务之间的线程安全。通过Redis的setnx命令,可以实现在分布式环境下获取锁的操作。
- 计数器 :使用Redis实现计数器功能,对访问次数、点击率等需要进行计数的操作进行统计。
- 会话管理 :将用户会话数据存储在Redis中,实现用户状态的保持和跨请求的处理。
- 分布式事务 :使用Redis实现分布式事务,确保分布式环境下的数据一致性和可靠性。
- 缓存雪崩 :使用Redis实现缓存雪崩的防御机制,通过设置缓存过期时间和缓存失效时间,避免缓存雪崩的发生。
RedisTemplate是Redis操作的核心类,可以用于各种不同的应用场景中,实现对Redis的灵活操作和管理。
RedisTemplate主要特点
RedisTemplate其主要特点包括:
- 类型安全:RedisTemplate天生具有类型安全的特性,所有Redis操作都是泛型的。
- 操作简单:RedisTemplate支持多种Redis数据类型,同时提供了灵活的操作API,使得对Redis的操作变得非常简单。
- 可扩展性高:RedisTemplate保证了Redis的高可靠性和可扩展性,这使得它成为了企业级应用接入Redis服务的首选工具。
RedisTemplate使用案例
RedisTemplate在Redis操作中具有广泛的应用,下面以一个简单的示例来说明其使用方法。
假设我们有一个需要频繁查询用户信息的系统,为了提高性能,我们希望将用户信息存储在Redis中。我们可以使用RedisTemplate来实现这个需求。
首先,我们需要在配置类中初始化RedisTemplate:
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);return template;}
}
然后,我们可以在服务类中使用RedisTemplate来查询用户信息:
@Service
public class UserService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public User getUser(String userId) {String key = "user:" + userId;return (User) redisTemplate.opsForValue().get(key);}
}
在这个示例中,我们将用户信息存储在Redis中,并使用RedisTemplate的opsForValue()方法来获取和操作数据。在实际应用中,我们可以根据需要使用其他Redis数据类型和操作方法来实现更复杂的业务需求。
RedisTemplate源码解析
RedisTemplate是Spring Data Redis的核心类,用于对Redis的访问。在RedisTemplate的源码中,主要实现了对Redis的基本操作和高级特性,包括数据读取、数据存储、数据删除、事务处理等。
RedisTemplate的源码主要分为以下几个部分:
- 构造函数:RedisTemplate的构造函数接受一个RedisConnectionFactory对象作为参数,用于创建Redis连接。同时,还可以设置序列化方式、连接超时时间等参数。
- 命令操作:RedisTemplate提供了一系列命令操作方法,如opsForValue()、opsForList()、opsForSet()等,用于对Redis的不同数据类型进行操作。这些方法返回不同类型的操作对象,如ValueOperations、ListOperations、SetOperations等,这些对象封装了对Redis的命令操作。
- 事务处理:RedisTemplate支持事务处理,通过事务管理器实现。事务管理器可以在一个事务中执行多个Redis命令,并保证这些命令的原子性。如果任何一个命令执行失败,整个事务将回滚。
- Pipelining:RedisTemplate支持管道化操作,即将多个Redis命令打包成一个管道,一次性发送到Redis服务器,并一次性接收服务器的响应。这样可以减少网络通信的开销,提高操作效率。
- 序列化和反序列化:RedisTemplate通过序列化和反序列化将Java对象转换为二进制数据存储到Redis中,或将二进制数据转换为Java对象读取出来。默认情况下,使用JDK自带的序列化机制进行序列化和反序列化。
- 异常处理:RedisTemplate对常见的Redis异常进行了封装和处理,使得在使用Redis时更加方便和安全。
总体来说,RedisTemplate的源码实现了对Redis的基本操作和高级特性,并提供了方便、安全、高效的接口供开发者使用。
RedisTemplate中的设计模式
RedisTemplate在实现过程中主要使用了以下几种设计模式:
- 模板方法模式:在RedisTemplate中,定义了一个模板方法,例如get,它包含了操作Redis的通用逻辑,如判断key是否存在等。具体的操作则留给子类去实现。子类需要实现exists和getValue两个抽象方法,分别用于判断key是否存在和获取key对应的值。这样,不同的子类可以根据自己的需求来实现具体的操作,使得代码更加灵活和可扩展。
RedisTemplate中的连接池长连接无法生效的原因
RedisTemplate中的连接池长连接无法生效的原因可能有以下几种:
- Redis连接池未正确设置。在使用Redis连接池时,需要正确地设置其参数,例如最大连接数、最小连接数、连接超时时间等。如果参数设置不正确,可能会导致连接池无法正常运行。
- 连接信息未正确存入Redis连接池。在使用Redis连接池获取连接时,需要将连接信息正确地存入Redis连接池,以便Redis连接池能够得到充分的利用。如果连接信息未正确存入,可能会导致连接池无法正常工作。
- Redis服务器异常。如果Redis服务器出现异常,例如网络故障、Redis进程崩溃等,可能会导致Redis连接池无法正常工作。
- 连接泄漏。如果在程序中使用完Redis连接后,没有正确地归还给连接池,可能会导致连接池中的连接数量超过最大限制,进而导致连接池无法正常工作。
- Redis客户端异常。如果Redis客户端出现异常,例如内存不足、线程阻塞等,可能会导致Redis连接池无法正常工作。
为了解决这些问题,可以采取以下措施:
- 正确设置Redis连接池的参数,包括最大连接数、最小连接数、连接超时时间等。
- 在使用Redis连接池获取连接时,确保将连接信息正确地存入Redis连接池。
- 定期检查Redis服务器的状态和性能,及时发现和处理问题。
- 在程序中使用完Redis连接后,要正确地归还给连接池,避免连接泄漏。
- 定期检查Redis客户端的状态和性能,及时发现和处理问题。
RedisTemplate释放连接
在使用RedisTemplate进行Redis操作后,需要手动释放连接,以避免连接泄漏。可以通过调用RedisConnectionUtils.unbindConnection(redisTemplate.getConnectionFactory())方法来释放连接。同时,在使用Redis连接池时,也需要正确设置其参数,包括最大连接数、最小连接数、连接超时时间等,以确保连接池能够正常运行。在使用RedisTemplate进行回调操作时,需要注意在同一条连接下执行多个Redis命令,以确保操作的原子性和一致性。
RedisTemplate实例在调用完成后,会自动回收连接。在执行完Redis操作后,RedisTemplate会调用Connection的close方法来关闭连接。同时,如果使用连接池的话,RedisTemplate会将连接归还给连接池,以便连接可以被重复利用。因此,在使用RedisTemplate进行Redis操作时,不需要手动回收连接。但是,需要注意的是,在使用完Redis连接后,应该将连接及时归还给连接池,以避免连接泄漏。
RedisTemplate如何处理连接超时异常
RedisTemplate在处理连接超时异常时,会根据配置的超时时间进行判断。如果在指定的超时时间内无法连接到Redis服务器,RedisTemplate会抛出RedisConnectionException异常。因此,在使用RedisTemplate进行Redis操作时,需要根据实际情况配置合适的超时时间,以避免连接超时异常的发生。同时,如果出现了连接超时异常,可以通过查看异常信息来进一步排查和解决问题。
Redis拓展
【Redis常用数据结构底层实现与验证-String】
【通过Redis实现数据的交集、并集、补集】
【redis设置与获取过期时间一网打尽】

相关文章:
RedisTemplate使用详解
RedisTemplate介绍StringRedisTemplate介绍RedisConnectionFactory介绍RedisConnectionFactory源码解析 RedisOperations介绍RedisOperations源码解析 RedisTemplate使用连接池配置RedisTemplate连接池连接池配置 RedisTemplate应用场景RedisTemplate主要特点RedisTemplate使用…...
6.Gin 路由详解 - GET POST 请求以及参数获取示例
6.Gin 路由详解 - GET POST 请求以及参数获取示例 GET POST 请求以及参数获取示例 Get 请求:获取 Quary 参数 // 获取query参数示例:GET /user?uid20&namejack&page1 r.GET("/user", func(c *gin.Context) {// 获取参数// Query获取参…...
CMakeLists.txt基础指令与cmake-gui生成VS项目的步骤
简介 本博客主要介绍cmake的基本指令,同时,很多使用Visual Studio小白从Gitbub下载项目源码后,看到CMakeLists.txt,不知道如何使用Visual Studio编译源码;针对以上问题,做一下简单操作与解释,方…...
IT应用运维最常用指标
可用性(Availability) 系统或服务在特定时间范围内可用的百分比。 计算方式:(总时间 - 不可用时间)/ 总时间 * 100%。 参考值:99.9%。 应用范围:应用系统、网络设备。 故障率(Fa…...
Go中各种newreader和newbuffer的使用
一、bytes.NewBuffer和bytes.NewReader func main() {var byteArr []bytebuf : bytes.NewBuffer(byteArr)buf.Write([]byte("今天不错"))fmt.Println(buf.String()) }package mainimport ("bytes""fmt" )func main() {data : []byte("路多…...
visual studio 如何建立 C 语言项目
安装这个 模块。 新建 空项目 创建完成 写demo 点击运行:...
app小程序定制开发的优势|企业软件网站建设
app小程序定制开发的优势|企业软件网站建设 小程序定制开发是目前互联网行业中备受关注的领域之一。随着智能手机的普及和移动互联网的迅猛发展,越来越多的企业和个人开始重视小程序的潜力,并积极寻求定制开发的服务。那么,为什么小程序定制开…...
物联网AI MicroPython学习之语法 WDT看门狗外设
学物联网,来万物简单IoT物联网!! WDT 介绍 模块功能: 看门狗WDT(WatchDog Timer)外设驱动模块 接口说明 WDT - 构建WDT对象 函数原型:WDT(timeout)参数说明: 参数类型必选参数?…...
JVM线程的几种状态
1.New 新建的线程,线程还没启动。 2.Runnable 线程正在运行或者等待操作系统中的其他资源,例如线程运行过程中,系统分配资源给其他操作,此时这个线程还是Runnable状态,可以理解为可运行的线程。 3.Blocked 阻塞状…...
基于单片机停车场环境监测系统仿真设计
**单片机设计介绍, 基于单片机停车场环境监测系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的停车场环境监测系统是一种利用单片机技术实现环境监测和数据处理的系统。它可以感知停车场的温湿…...
每日一题:LeetCode-589.N叉树的前序遍历
每日一题系列(day 01) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🔎…...
PTA 7-2 简单计算器
7-2 简单计算器 分数 20 全屏浏览题目 作者 张彤彧 单位 浙江大学 模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。 输入格式: 输入在一行中给出一个四则运…...
9、鸿蒙应用桌面图标外观和国际化
一、项目资源目录 项目下的resoueces目录为资源配置目录,其中base为基础配置,即在任何语言环境下都会加载的资源, color.json:用于配置颜色,如页面的背景和文字的颜色。 string.json:用于设置文字&#…...
oracle rac 19c修改不同网段public ip
客户需求将才搭建的oracle 19.19数据库从192.168.168.0网段调整到192.168.213网段 1.停止两个节点集群 停止之前最好ocrdump一下,防止有问题 crsctl stop crs 2.修改public ip地址和/etc/hosts 3. 启动crs 这时集群可以启动,但是上面的一些资源启动会…...
【Django-DRF用法】多年积累md笔记,第(4)篇:Django-DRF反序列化详解
本文从分析现在流行的前后端分离Web应用模式说起,然后介绍如何设计REST API,通过使用Django来实现一个REST API为例,明确后端开发REST API要做的最核心工作,然后介绍Django REST framework能帮助我们简化开发REST API的工作。 全…...
OpenAI宣布暂停ChatGPT plus用户订阅,解决方案,无需等待立马升级
作为人工智能领域的一项重要革新,ChatGPT Plus的上线引起了众多用户的关注,其背后的OpenAI表现出傲娇的态度,被誉为下一个GTP 4.0。总的来说,ChatGPT Plus的火爆主要有两个原因。首先,其在人工智能对话技术领域的创新&…...
如何将 Docsify 项目部署到 CentOS 系统的 Nginx 中
文章目录 第一步:准备 CentOS 服务器第二步:安装 Node.js 和 Docsify第三步:初始化 Docsify 项目第四步:本地预览 Docsify 项目第五步:配置 Nginx 服务器第六步:重启 Nginx 服务器拓展:使用 HTT…...
小程序存在优惠卷遍历,但是歪了
进入小程序,因为是一个小商城,所以照例先查看收货地址是否存在越权,以及能否未授权访问,但是发现不存在这些问题,所以去查看优惠卷 进入领券中心,点击领取优惠券时抓包 发现数据包,存在敏感参数…...
HarmonyOS第一课-对比Kotlin,快速入门TypeScript
编程语言简介 基础类型 1. 布尔值 TypeScript 和 Kotlin: 两者都有 boolean 类型,用于表示 true 或 false。 ts示例: let isDone:boolean falsekotlin示例: val isDone: Boolean false2. 数字 TypeScript: 有 number 类型,…...
【自动驾驶】一些业内自动驾驶专业术语释义
Trajectory 轨迹信息,一般都会发布未来5-10秒的trajactory信息。 Trajectory flicker 轨迹抖动 Nudge 道内避障。在维持车道不变的情况下,横向偏离车道中心以绕开obstacle/agent。 Xlane Nudge 借道避障。借用对向车道或自行车道以绕开obstacle/a…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
