Redis 基础详解:从入门到精通
在当今互联网应用开发领域,数据存储与处理的性能和效率至关重要。Redis(Remote Dictionary Server)作为一款开源的、基于内存的键值存储系统,凭借其出色的性能和丰富的功能,被广泛应用于数据库、缓存、消息中间件等场景。本文将全面深入地讲解 Redis 的核心知识,助力开发者快速掌握 Redis 并应用于实际项目。
一、Redis 简介
Redis 由 Salvatore Sanfilippo 开发,目前由 Redis Labs 维护。它以内存作为数据的主要存储介质,使得数据的读写操作极为迅速,特别适合对性能要求极高的场景。
Redis 的主要特点
- 内存存储:数据主要存储在内存中,提供极高的读写性能,能在极短时间内完成数据的读取和写入,相比传统磁盘存储数据库,大大提升了响应速度。
- 持久化支持:支持 RDB(Redis Database)和 AOF(Append Only File)两种持久化方式,确保数据在断电或服务重启后不会丢失,在数据安全性和性能之间取得平衡 。
- 丰富的数据结构:不仅支持常见的字符串类型,还提供哈希、列表、集合、有序集合等多种数据结构,可满足不同业务场景下的数据存储和处理需求。
- 原子操作:所有操作都是原子性的,保证了数据操作的完整性和一致性,即使多个客户端同时对同一数据进行操作,也不会出现数据混乱的情况。
- 发布 / 订阅:支持消息的发布 / 订阅模式,能够实现高效的消息传递,适用于构建实时消息系统。
- 事务支持:支持简单的事务功能,确保多个命令要么全部执行成功,要么全部不执行,避免部分命令执行导致的数据不一致问题。
- 高可用:通过主从复制和 Redis Sentinel 机制实现高可用,保障服务的连续性,当主节点出现故障时,能够自动切换到从节点,继续提供服务。
- 分布式:Redis Cluster 提供分布式解决方案,可实现数据的分片存储和处理,能够轻松应对大规模数据和高并发访问的场景。
二、Redis 安装与配置
1. Linux 下安装 Redis
# 下载最新稳定版,这里以6.2.6版本为例,实际可到官网获取最新版本
wget http://download.redis.io/releases/redis-6.2.6.tar.gz
tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6
make
在执行make
命令时,可能会出现缺少依赖的情况。常见的依赖包括 gcc、tcl 等,需要提前安装,可使用yum install gcc tcl
(CentOS 系统)或apt-get install gcc tcl
(Ubuntu 系统)命令进行安装。
2. 启动 Redis 服务器
src/redis-server
默认情况下,Redis 会读取当前目录下的redis.conf
配置文件启动。如果需要使用自定义的配置文件,可以通过src/redis-server /path/to/redis.conf
指定配置文件路径。
3. 使用 Redis 客户端连接
src/redis-cli
连接成功后,即可在命令行中输入 Redis 命令与服务器进行交互。如果 Redis 服务器设置了密码,可使用src/redis-cli -a your_password
命令进行连接。
三、Redis 基本数据结构与操作
1. 字符串 (String)
字符串是 Redis 最基础的数据类型,可存储文本、数字或二进制数据,适用于存储简单的键值对,如用户 ID 对应的用户名、配置项等。
# 设置键值
SET name "Redis"
# 获取值
GET name
# 设置过期时间(秒),这里设置age键30秒后过期
SETEX age 30 "25"
# 递增,常用于计数器场景,如点赞数、浏览量统计
INCR counter
# 递减
DECR counter
对于数值类型的字符串,除了INCR
和DECR
,还支持INCRBY
和DECRBY
命令,可指定递增或递减的步长,如INCRBY counter 5
将counter
的值增加 5。
2. 哈希 (Hash)
哈希适合存储对象,将对象的多个属性以字段和值的形式存储,常用于存储用户信息、商品详情等场景。
# 设置哈希字段
HSET user:1000 username antirez password P1pp0 age 34
# 获取所有字段
HGETALL user:1000
# 获取单个字段
HGET user:1000 username
# 设置多个字段
HMSET user:1001 username mike password 123 age 28
在处理大量哈希数据时,HSCAN
命令可以用于迭代获取哈希字段,避免一次性获取大量数据导致的性能问题。
3. 列表 (List)
列表是简单的字符串列表,按照插入顺序排序,可用于实现消息队列、任务队列,或者存储用户的浏览历史等。
# 从左侧插入
LPUSH mylist "world"
LPUSH mylist "hello"
# 从右侧插入
RPUSH mylist "!"
# 获取列表范围,0表示起始索引,-1表示结束索引
LRANGE mylist 0 -1
# 弹出元素,LPOP从左侧弹出,RPOP从右侧弹出
LPOP mylist
RPOP mylist
BLPOP
和BRPOP
命令可以实现阻塞式弹出,当列表为空时,客户端会阻塞等待,直到列表中有新元素加入,这一特性常用于实现可靠的消息队列。
4. 集合 (Set)
集合是字符串的无序集合,不允许重复元素,适用于去重、交集、并集、差集等操作,比如统计网站的独立访客、获取两个用户的共同关注等。
# 添加元素
SADD myset "Hello"
SADD myset "World"
# 获取所有元素
SMEMBERS myset
# 检查元素是否存在
SISMEMBER myset "Hello"
# 移除元素
SREM myset "World"
通过SINTER
(交集)、SUNION
(并集)、SDIFF
(差集)等命令,可以对多个集合进行高效的集合运算。
5. 有序集合 (Sorted Set)
有序集合类似于集合,但每个元素都关联一个分数,用于排序,常用于排行榜、计分系统等场景。
# 添加元素,分数在前,元素在后
ZADD myzset 1 "one"
ZADD myzset 2 "two" 3 "three"
# 获取元素范围,并显示分数
ZRANGE myzset 0 -1 WITHSCORES
# 按分数范围获取
ZRANGEBYSCORE myzset 1 2
ZREVRANGE
命令可以按照分数从高到低的顺序获取元素,适用于倒序排行榜的展示。
四、Redis 持久化机制
1. RDB(Redis Database)
RDB 是 Redis 默认的持久化方式,它会在指定时间间隔内将内存中的数据快照写入磁盘。
配置示例:
save 900 1 # 900秒(15分钟)内有1个更改
save 300 10 # 300秒(5分钟)内有10个更改
save 60 10000 # 60秒内有10000个更改
优点:
- 适合大规模数据恢复,因为 RDB 文件是一个完整的数据快照,恢复时直接加载即可。
- 对性能影响小,只有在进行快照操作时会占用一定的系统资源,平时几乎不影响 Redis 的读写性能。
- 文件紧凑,便于备份和传输,可以方便地将 RDB 文件复制到其他服务器进行数据备份或迁移。
缺点:
- 可能丢失最后一次快照后的数据,如果在两次快照间隔期间 Redis 发生故障,这期间的数据将无法恢复。
- 大数据量时保存过程可能较长,因为需要将整个内存数据写入磁盘,可能会导致 Redis 在保存期间响应变慢。
2. AOF(Append Only File)
AOF 持久化记录服务器接收到的所有写操作命令,并在服务器启动时重新执行这些命令来恢复数据。
配置示例:
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec # 每秒同步
优点:
- 数据安全性更高,因为几乎可以实时记录所有写操作,即使 Redis 突然宕机,最多只会丢失 1 秒的数据(当
appendfsync
设置为everysec
时)。 - 通过 rewrite 机制压缩文件,Redis 会定期对 AOF 文件进行重写,去除冗余的命令,减少文件体积。
- 可读性强,便于分析,AOF 文件本质上是一个记录命令的文本文件,可以直接查看其中的操作,方便排查问题。
缺点:
- 文件体积通常比 RDB 大,因为它记录了每一个写操作命令,随着时间推移,文件会不断增大。
- 恢复速度比 RDB 慢,因为需要重新执行所有写操作命令来恢复数据,数据量越大,恢复时间越长。
- 对性能影响相对较大,特别是在
appendfsync
设置为always
时,每次写操作都要同步到磁盘,会降低 Redis 的写入性能。
五、Redis 事务
Redis 事务可以一次执行多个命令,并且保证:
- 事务中的所有命令都会序列化并按顺序执行。
- 执行过程中不会被其他客户端发送的命令打断。
- 没有隔离级别的概念,即事务执行过程中不会出现脏读、不可重复读等问题,但也无法保证数据的并发一致性。
基本命令:
- MULTI:标记事务开始。
- EXEC:执行所有事务块内的命令。
- DISCARD:取消事务,放弃执行事务块内的所有命令。
- WATCH:监视一个或多个 key,如果在事务执行前这些 key 被其他客户端修改,事务将被中断。
示例:
MULTI
SET book-name "Redis in Action"
SET book-author "Josiah L. Carlson"
SADD book-tags "NoSQL" "Redis" "Database"
EXEC
在使用事务时,需要注意,如果事务块中的某个命令在执行时出现错误,后续命令仍然会继续执行。Redis 不会像关系型数据库那样进行回滚,除非使用WATCH
命令监视的 key 发生变化导致事务中断。
六、Redis 发布 / 订阅
Redis 发布 / 订阅 (pub/sub) 实现了消息系统,发送者 (pub) 发送消息,订阅者 (sub) 接收消息,适用于实时消息推送、系统通知等场景。
基本命令:
- SUBSCRIBE:订阅一个或多个频道。
- PUBLISH:向频道发布消息。
- UNSUBSCRIBE:退订频道。
- PSUBSCRIBE:订阅匹配模式的频道,支持通配符,如
PSUBSCRIBE news.*
可以订阅所有以news.
开头的频道。
示例:
# 客户端1订阅
SUBSCRIBE news# 客户端2发布
PUBLISH news "Hello Redis!"# 客户端1将收到消息
需要注意的是,Redis 的发布 / 订阅是基于内存的,消息不会持久化,如果在发布消息时没有客户端订阅该频道,消息将被丢弃。同时,当有大量订阅者时,发布消息可能会导致 Redis 性能下降,需要谨慎使用。
七、Redis Java 客户端
1. Jedis
Jedis 是 Redis 官方推荐的 Java 客户端,简单易用,适合快速开发和小型项目。
Maven 依赖:
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version>
</dependency>
示例代码:
import redis.clients.jedis.Jedis;public class JedisExample {public static void main(String[] args) {// 连接Redis,这里假设Redis运行在本地,端口为默认的6379Jedis jedis = new Jedis("localhost");// 字符串操作jedis.set("foo", "bar");System.out.println(jedis.get("foo"));// 列表操作jedis.lpush("list", "item1", "item2");System.out.println(jedis.lrange("list", 0, -1));// 关闭连接jedis.close();}
}
在实际应用中,为了提高性能和管理连接,可以使用连接池,如JedisPool
。通过连接池可以复用连接,避免频繁创建和销毁连接带来的性能开销。
2. Lettuce
Lettuce 是一个高性能的 Redis 客户端,支持异步和响应式编程,适用于高并发、高性能的场景,特别是在基于 Reactor 模式的项目中。
Maven 依赖:
<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>6.2.3.RELEASE</version>
</dependency>
示例代码:
import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.sync.RedisCommands;public class LettuceExample {public static void main(String[] args) {// 创建RedisClient,这里使用默认的连接字符串格式,也可指定密码等参数RedisClient client = RedisClient.create("redis://localhost");// 获取连接StatefulRedisConnection<String, String> connection = client.connect();RedisCommands<String, String> commands = connection.sync();// 执行命令commands.set("key", "value");System.out.println(commands.get("key"));// 关闭连接connection.close();client.shutdown();}
}
Lettuce 还提供了丰富的异步 API,通过RedisAsyncCommands
和RedisReactiveCommands
接口,可以实现非阻塞的异步操作,充分利用系统资源,提高应用的并发处理能力。
八、Redis 应用场景
- 缓存系统:作为缓存系统,Redis 可以存储热点数据,减轻数据库压力,提高系统响应速度。例如,将频繁访问的商品详情、新闻资讯等数据缓存到 Redis 中,减少对数据库的查询次数。
- 计数器:利用
INCR
/DECR
等命令实现点赞数、浏览量、评论数等统计功能,高效且原子性强。 - 排行榜:使用有序集合实现实时排行榜,如游戏排行榜、音乐排行榜等,通过分数进行排序,方便快捷地获取排名信息。
- 消息队列:利用列表的阻塞操作实现简单消息队列,如
BLPOP
和BRPOP
,可以实现生产者 - 消费者模型,用于异步任务处理、日志收集等场景。 - 会话缓存:存储用户会话信息,如登录状态、购物车数据等,提高用户体验和系统性能。
- 分布式锁:利用
SETNX
(Set If Not Exists)命令实现分布式锁,确保在分布式环境下多个进程或线程对共享资源的互斥访问,避免数据竞争和不一致问题。 - 社交网络:实现关注、粉丝、共同好友等功能,通过集合的交集、并集、差集运算,可以高效地处理社交关系数据。
- 实时系统:处理实时数据,如实时分析、实时监控,Redis 的高速读写性能能够满足实时数据处理的需求,例如实时统计网站的访问量、监控系统的指标数据等。
九、Redis 性能优化建议
- 合理使用数据结构:根据业务场景选择最适合的数据结构,例如,需要有序存储和排序时使用有序集合,需要去重和集合运算时使用集合,避免因数据结构选择不当导致性能低下。
- 批量操作:使用
MSET
、MGET
、Pipeline 等批量操作命令,减少网络开销。Pipeline 可以将多个命令打包发送到 Redis 服务器,一次性执行,大大提高执行效率。 - 避免大 Key:单个 Key 的 Value 不宜过大,过大的 Value 会占用过多内存,同时在读取和写入时会增加网络传输时间和处理时间。如果数据量较大,可以考虑将数据进行拆分存储。
- 设置合理的内存淘汰策略:根据业务需求配置
maxmemory-policy
,当 Redis 内存达到设定的最大值时,会按照指定的策略淘汰数据。常见的策略有volatile-lru
(在设置了过期时间的键中,使用最近最少使用算法淘汰数据)、allkeys-lru
(在所有键中使用最近最少使用算法淘汰数据)等。 - 使用连接池:避免频繁创建和销毁连接,使用连接池可以复用连接,减少连接创建和销毁的开销,提高系统性能。Jedis 和 Lettuce 都提供了连接池的实现。
- 合理设置持久化策略:平衡性能和数据安全性,根据业务对数据丢失的容忍程度选择合适的持久化方式和配置参数。如果对数据安全性要求较高,可以采用 AOF,并设置合适的
appendfsync
策略;如果更注重性能和恢复速度,可以采用 RDB。 - 使用 Lua 脚本:将多个 Redis 命令编写成 Lua 脚本,通过
EVAL
命令执行,减少网络往返次数,并且 Lua 脚本在 Redis 中执行是原子性的,保证了操作的一致性。 - 监控慢查询:定期检查并优化慢查询,通过
slowlog get
命令可以查看 Redis 的慢查询日志,分析执行时间较长的命令,找出性能瓶颈并进行优化。
十、Redis 高可用方案
1. 主从复制
通过主从复制实现数据冗余和读写分离。主节点负责处理所有写操作,并将数据变化同步给从节点,从节点则可以处理读请求 。主从架构能够提升系统的读性能和数据安全性,当主节点发生故障时,虽然无法自动切换,但可以通过手动操作将从节点提升为主节点继续提供服务。
配置方法:
在从节点配置文件redis.conf
中添加以下配置,假设主节点 IP 为192.168.1.100
,端口为默认的6379
:
replicaof 192.168.1.100 6379
同时,从节点还可以设置只读模式,避免误操作修改数据,在配置文件中添加:
readonly yes
工作原理:
从节点启动后,会向主节点发送SYNC
命令(在 Redis 2.8 之后使用PSYNC
命令)进行全量同步,主节点接收到命令后,会执行BGSAVE
生成 RDB 文件,并将文件发送给从节点,从节点接收并加载 RDB 文件完成数据初始化。之后,主节点会将新的写命令通过异步方式发送给从节点,实现数据的持续同步。
优缺点:
- 优点:架构简单,易于部署和维护;实现读写分离,分担主节点压力,提升系统整体读性能;数据冗余提高了数据安全性。
- 缺点:主节点故障时无法自动切换,需要人工介入;从节点复制数据存在一定延迟,在某些对数据一致性要求极高的场景下可能不适用。
2. Redis Sentinel
Redis Sentinel 提供自动故障转移和监控功能,它是一个分布式系统,可以监视一个或多个主从 Redis 服务器,并在主服务器故障时自动将一个从服务器升级为新的主服务器。
配置示例:
假设主节点名称为mymaster
,IP 为127.0.0.1
,端口为6379
,在每个 Sentinel 节点的配置文件sentinel.conf
中添加以下内容:
# 监视名为mymaster的主节点,最后的数字2表示判断主节点失效至少需要2个Sentinel节点同意
sentinel monitor mymaster 127.0.0.1 6379 2
# 超过5000毫秒未收到主节点响应,就判定主节点下线
sentinel down-after-milliseconds mymaster 5000
# 故障转移的超时时间,这里设置为60000毫秒
sentinel failover-timeout mymaster 60000
工作流程:
- Sentinel 节点会定期向主从节点和其他 Sentinel 节点发送心跳包,检查节点是否正常运行。
- 当某个 Sentinel 节点发现主节点无响应超过
down-after-milliseconds
设置的时间后,会先标记主节点为SDOWN
(主观下线)。 - 该 Sentinel 节点会与其他 Sentinel 节点进行通信,当有超过配置的
quorum
(这里是 2)个 Sentinel 节点都认为主节点下线时,会将主节点标记为ODOWN
(客观下线)。 - 进入故障转移阶段,Sentinel 节点会从从节点中选举一个新的主节点,选举算法基于 Raft 协议,被选举出的从节点会升级为主节点。
- 剩余的从节点会重新指向新的主节点,完成故障转移。
优缺点:
- 优点:实现了主节点故障的自动检测和自动故障转移,极大提高了系统的可用性;采用分布式架构,避免单点故障。
- 缺点:配置相对复杂;Sentinel 节点本身也需要进行高可用部署,否则 Sentinel 节点故障可能影响故障转移功能;故障转移过程中可能存在短暂的服务中断。
3. Redis Cluster
Redis Cluster 提供数据分片和高可用功能,它采用无中心节点的分布式架构,将数据分散存储在多个节点上,每个节点负责一部分数据,节点之间通过 Gossip 协议进行通信和信息交换。
集群创建命令:
假设使用 6 个节点构建集群,其中 3 个为主节点,3 个为从节点,执行以下命令创建集群(注意提前启动 6 个 Redis 实例并配置好相关参数):
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
--cluster-replicas 1
表示为每个主节点分配一个从节点。
工作原理:
Redis Cluster 将整个键空间划分为 16384 个哈希槽(Hash Slot),每个节点负责一部分哈希槽。当客户端发送命令时,会根据键计算出对应的哈希槽,然后将命令发送到负责该哈希槽的节点上执行。如果节点发生故障,Redis Cluster 会自动将故障节点负责的哈希槽迁移到其他正常节点上,并进行故障转移,保证服务的可用性。
优缺点:
- 优点:具备强大的水平扩展能力,可以轻松应对大规模数据和高并发访问;数据分片存储,提高了数据处理能力;自动故障转移和哈希槽迁移机制保证了高可用性。
- 缺点:客户端需要实现哈希槽路由算法,增加了开发复杂度;集群内部节点通信和数据迁移会占用一定的网络带宽;在集群规模较大时,管理和维护难度增加。
结语
Redis 作为高性能的内存数据库,在现代应用开发中扮演着重要角色。掌握 Redis 的基础知识和核心功能,能够帮助开发者构建更高效、更可靠的系统。本文系统介绍了 Redis 的基础知识,涵盖数据结构、持久化、事务、发布订阅等核心功能,以及 Java 客户端的使用、应用场景、性能优化建议和高可用方案。希望这篇指南能助力你快速入门 Redis,并在实际项目中灵活运用,充分发挥 Redis 的强大性能和优势。
相关文章:
Redis 基础详解:从入门到精通
在当今互联网应用开发领域,数据存储与处理的性能和效率至关重要。Redis(Remote Dictionary Server)作为一款开源的、基于内存的键值存储系统,凭借其出色的性能和丰富的功能,被广泛应用于数据库、缓存、消息中间件等场景…...
24、TypeScript:预言家之书——React 19 类型系统
一、预言家的本质 "TypeScript是魔法世界的预言家之书,用静态类型编织代码的命运轨迹!" 霍格沃茨符文研究院的巫师挥动魔杖,类型注解与泛型的星轨在空中交织成防护矩阵。 ——基于《国际魔法联合会》第12号类型协议,Ty…...
RabbitMQ--进阶篇
RabbitMQ 客户端整合Spring Boot 添加相关的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 编写配置文件,配置RabbitMQ的服务信息 spri…...
【GESP真题解析】第 19 集 GESP 二级 2025 年 3 月编程题 1:等差矩阵
大家好,我是莫小特。 这篇文章给大家分享 GESP 二级 2025 年 3 月编程题第 1 题:等差矩阵。 题目链接 洛谷链接:B4259 等差矩阵 一、完成输入 根据题意,一行,两个正整数 n,m。 n 和 m的数据范围…...
电池单元和电极性能
电芯设计中的挑战 对于电池制造商来说,提高电池能量和功率密度至关重要。在高功率密度和长循环寿命之间取得平衡是电池设计中的关键挑战,通常需要仔细优化材料、电极结构和热管理系统。另一个关键挑战是通过优化重量体积比来降低电池单元的总体成本。 工…...
MATLAB 矩阵与数组操作基础教程
文章目录 前言环境配置一、创建矩阵与数组(一)直接输入法(二)特殊矩阵生成函数(三)使用冒号表达式创建数组 二、矩阵与数组的基本操作(一)访问元素(二)修改元…...
理解 Token 索引 vs 字符位置
以下是对“理解 Token 索引与字符位置的区别”的内容整理,条理清晰,结构完整,保持技术细节,方便阅读,无多余解释: 🔍 理解 Token 索引 vs 字符位置 文本分块方法中返回的索引是 token 索引&…...
【RAG】11种Chunking Strategies分块策略介绍和选择
【今日鸡汤】学习之路上,勤奋是比 “聪明” 远远更珍贵的品质。 参考原文地址:https://masteringllm.medium.com/11-chunking-strategies-for-rag-simplified-visualized-df0dbec8e373 在构建强大的检索增强生成(RAG)系统时&…...
中继器:网络中的“血包”与“加时器”
在探讨网络技术时,我们往往会遇到各种专业术语和设备,中继器便是其中之一。然而,对于非技术人员或初学者来说,这些概念可能显得抽象且难以理解。今天,我将通过一个生动的比喻——将中继器比作网络中的“血包”与“加时…...
证明当||x||=1时,Ax=0的最小二乘解是的最小特征值对应的特征向量
问题:证明当||x||1时,Ax0的最小二乘解是的最小特征值对应的特征向量。 证明: 上个命题等同于:的最小特征值所对应的特征向量可使得||Ax||最小。以下分别对x为的特征向量和不为的特征向量这两种情况进行证明。 情况1: 若x为的特征…...
AI大模型学习十八、利用Dify+deepseekR1 +本地部署Stable Diffusion搭建 AI 图片生成应用
一、说明 最近在学习Dify工作流的一些玩法,下面将介绍一下Dify Stable Diffusion实现文生图工作流的应用方法 Dify与Stable Diffusion的协同价值 Dify作为低代码AI开发平台的优势:可视化编排、API快速集成 Stable Diffusion的核心能力:高效…...
linux基础操作4------(权限管理)
一.前言 今天我们来讲讲linux的权限管理,比如文件的权限,如果大家看过前面说的app逆向的frida,我们在手机里要给frida,我们都要设置一下chomd 777 frida ,这样就给了可执行权限,这就是这一章要讲的&#x…...
Linux数据库篇、第零章_MySQL30周年庆典活动
MySQL考试报名网站 Oracle Training and Certification | Oracle 中国 活动时间 2025年 MySQL的30周年庆典将于2025年举行。MySQL于1995年首次发布,因此其30周年纪念日是2025年。为了庆祝这一里程碑,MySQL将提供免费的课程和认证考试,活动…...
HVV面试题汇总合集
应急响应的命令 Linux ps -aux 查看进程 netstat -antlp 查看端口 top查看 cpu使用情况 Windows tasklist 查看进程 netstat -an 查看端口struts2原理特征 原理: 045:默认的content-type解析器会把用户传来的数据直接当成代码执行,造成rce 特征:ognl表达式&…...
Mac下Robotframework + Python3环境搭建
1.安装python3 1.0安装XCODE 1.打开浏览器,登陆苹果开发者网站:https://developer.apple.com/download/more/ 2.登陆你的apple账号,授权访问。 3.查看mac系统版本 需要下载与系统版本对应的Xcode 4.在搜索框中输入: 如果Mac 系统…...
stm32实战项目:无刷驱动
目录 系统时钟配置 PWM模块初始化 ADC模块配置 霍尔接口配置 速度环定时器 换相逻辑实现 主控制循环 系统时钟配置 启用72MHz主频:RCC_Configuration()设置PLL外设时钟使能:TIM1/ADC/GPIO时钟 #include "stm32f10x.h"void RCC_Configu…...
MNIST 手写数字分类
转自我的个人博客: https://shar-pen.github.io/2025/05/04/torch-distributed-series/1.MNIST/ 基础的单卡训练 本笔记本演示了训练一个卷积神经网络(CNN)来对 MNIST 数据集中的手写数字进行分类的过程。工作流程包括: 数据准备ÿ…...
【RuntimeError: Directory ‘static/‘ does not exist 】
背景 File “/root/miniforge3/lib/python3.10/site-packages/starlette/staticfiles.py”, line 56, in init raise RuntimeError(f"Directory ‘{directory}’ does not exist") RuntimeError: Directory ‘static/’ does not exist 运行读取pdf时候,…...
SQL:SELF JOIN(自连接)与CROSS JOIN(交叉连接)
目录 SELF JOIN(自连接) CROSS JOIN(交叉连接 / 笛卡尔积) 示例: SELF JOIN CROSS JOIN 如果没有 DATEDIFF() 函数怎么办? 🔍 SELF JOIN vs CROSS JOIN 对比总结 SELF JOIN(自…...
Linux网络基础 -- 局域网,广域网,网络协议,网络传输的基本流程,端口号,网络字节序
目录 1. 计算机网络背景 1.1 局域网 1.1.2 局域网的组成 1.2 广域网 1.1.2 广域网的组成 2. 初始网络协议 2.1 网络协议的定义和作用 2.2 网络协议的分层结构 2.2.1 OSI七层模型 2.2.2 TCP/IP 五层(四层)模型 3. 再识网络协议 3.1 为什么要有…...
当 Manus AI 遇上 OpenAI Operator,谁能更胜一筹?
自主智能体通过实现任务自动化,改变了我们与技术交互的方式,让我们的生活变得更加便捷。去年,OpenAI 为人工智能聊天机器人引入了定时任务和操作智能体,赋予了其代理功能,而 Anthropic 则在 Claude 上实现了类似的功能…...
iOS实名认证模块的具体实现过程(swift)
实名认证是当前APP的一个基础功能了,今天我集成了实名认证模块在iOS应用中的具体实现步骤,结合技术细节与最佳实践: 一、手机号验证 1. 发送短信验证码 技术实现:// 使用Alamofire调用第三方短信API AF.request("https://s…...
UE5定序器中摇臂挂载摄像机 让摄像机始终朝向目标
1. 搭建摄像机摇臂并加入 Sequencer 在关卡中: Cinematics → Add Level Sequence,新建并打开一个 Level Sequence。 在视口里 右键 → Cinematic → Cine Camera Actor Rig → Crane,放一个 CameraRig_Crane。 默认 Crane 自带一个 CineCa…...
Redis BigKey 问题是什么
BigKey 问题是什么 BigKey 的具体表现是 redis 中的 key 对应的 value 很大,占用的 redis 空间比较大,本质上是大 value 问题。 BigKey怎么找 redis-cli --bigkeysscanBig Key 产生的原因 1.redis数据结构使用不恰当 2.未及时清理垃圾数据 3.对业务预…...
硬件中断请求号和lspci命令查看到的device id有关系吗?
这是我忽然想到的一个人问题 硬件中断请求号(IRQ)与lspci命令查看到的设备ID(Device ID)没有直接对应关系,但两者在系统硬件管理中通过以下方式间接关联: 一、硬件层面的独立标识 Device ID的本质…...
Qt 中 QWidget涉及的常用核心属性介绍
欢迎来到干货小仓库 一匹真正的好马,即使在鞭子的影子下,也能飞奔 1.enabled API说明isEnabled()获取到控件的可用状态setEnabled()设置控件是否可使用.true:可用,false:禁用 禁用:指该控件不能接收任何用…...
编程日志5.3
串的习题 1.Problem - 2030 #include<iostream> using namespace std; int main() { char s[500]; int n; cin >> n; getchar();//去掉空格部分 while (n--) { gets(s);//老式写法 vs显示错误题目解答正确 int cnt 0; …...
sql的性能分析
慢查询日志:通过慢查询日志需要优化的sql语句。 慢查询日志记录了所有执行时间超过指定参数的所有sql语句。 开启慢日志查询开关:show_query_log1 设置慢查询日志的时间:long_query_time?。 show variables like ‘slow_query_log’&…...
JAVA 锁—— synchronized
32 位机器上java对象头中,markWord 示意图如上所示,64 位机器扩展前面标识位数,如 hashcode(25 -> 31),线程ID(23 -> 54) 如果启用了偏向锁: synchronized添加偏向锁:只有1个线程加锁的情况下&#…...
游戏引擎学习第274天:基于弹簧的动态动画
回顾前一天内容,并为今天的工作设定目标 我们昨天展示了一些内容,现在先回顾一下昨天的进展。我们目前正在处理的是角色跳跃的动画——特别是身体部分的跳跃。 现在角色的动画状态如下: 正在实现角色的移动和跳跃。跳跃中已经加入了一些预备…...
【英语笔记(二)】句子成分、基本句型;简单描述十大词类与从句的分类、助动词和非谓语动词的使用
1. 介词 at, in, on 的用法区别 1.1 表示时间的区别 1. 表示时间的某一点、某一时刻或年龄等用 at。如: I get up at six in the morning. 我早上六点钟起床。He got married at the age of 25. 他 25 岁结婚。 2. 泛指一般意义的上午、下午或晚上以及月或年等较…...
TAPIP3D:持久3D几何中跟踪任意点
简述 在视频中跟踪一个点(比如一个物体的某个特定位置)听起来简单,但实际上很复杂,尤其是在3D空间中。传统方法通常在2D图像上跟踪像素,但这忽略了物体的3D几何信息和摄像机的运动,导致跟踪不稳定…...
RabbitMQ的工作队列模式和路由模式有什么区别?
RabbitMQ 的工作队列模式(Work Queues)和路由模式(Routing)是两种不同的消息传递模式,主要区别在于消息的分发逻辑和使用场景。以下是它们的核心差异: 1. 工作队列模式(Work Queues)…...
armv7 backtrace
ref: ARM Cortex-M3/M4/M7 Hardfault异常分析_arm hardfault-CSDN博客...
Python并发编程:开启性能优化的大门(7/10)
1.引言 在当今数字化时代,Python 已成为编程领域中一颗璀璨的明星,占据着编程语言排行榜的榜首。无论是数据科学、人工智能,还是 Web 开发、自动化脚本编写,Python 都以其简洁的语法、丰富的库和强大的功能,赢得了广大…...
泰勒展开式
常用的 泰勒展开式(Taylor series expansion)是指把一个函数在某点的邻域内展开成幂级数的形式。以函数 f ( x ) f(x) f(x) 在点 a a a 处展开为例,其泰勒展开式为: f ( x ) f ( a ) f ′ ( a ) ( x − a ) f ′ ′ ( a ) 2 …...
深入理解 Polly:.NET Core 中的健壮错误处理策略
在现代软件开发中,错误处理是构建高可用、健壮系统的关键之一。尤其是当应用依赖外部服务(如 API、数据库或其他网络资源)时,临时的服务中断、超时或其他不可预见的错误都会影响应用的稳定性。为了提升系统的容错能力,…...
【Bootstrap V4系列】学习入门教程之 组件-巨幕(Jumbotron)和列表组(List group)
Bootstrap V4系列 学习入门教程之 组件-巨幕(Jumbotron)和列表组(List group) 一、巨幕(Jumbotron)1.1 带有圆角1.2 全宽且无圆角 二、列表组(List group)2.1 Basic example2.2 Acti…...
02.three官方示例+编辑器+AI快速学习webgl_animation_skinning_blending
本实例主要讲解内容 这个示例展示了Three.js中骨骼动画混合(Skeletal Animation Blending)的实现方法,通过加载一个士兵模型,演示了如何在不同动画状态(如站立、行走、跑步)之间进行平滑过渡。核心技术包括动画混合器(AnimationM…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1商用服务开通教程以及模型体验
在当今数字化浪潮迅猛推进的时代,云计算与人工智能技术的深度融合正不断催生出众多创新应用与服务,为企业和个人用户带来了前所未有的便利与发展机遇。本文将重点聚焦于在华为云这一行业领先的云计算平台上,对 DeepSeek-V3/R1 商用服务展开的…...
大语言模型通过MCP控制STM32-支持Ollama、DeepSeek、openai等
MCP控制STM32 MCP部分 1.下载源码 git clone https://github.com/ana52070/MCP_Control_STM32.git cd MCP_Control_STM32 cd mcp-led_oled2. 创建并激活虚拟环境 为了避免不同项目之间的依赖冲突,建议使用虚拟环境。根据你的操作系统和 Python 版本,…...
Linux-Ubuntu安装Stable Diffusion Forge
SD Forge在Win上配置起来相对简单且教程丰富,而在Linux平台的配置则稍有门槛且教程较少。本文提供一个基于Ubuntu24.04发行版(对其他Linux以及SD分支亦有参考价值)的Stable Diffusion ForgeUI安装配置教程,希望有所帮助 本教程以N…...
LoRA(Low-Rank Adaptation)原理详解
LoRA(Low-Rank Adaptation)原理详解 LoRA(低秩适应)是一种参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)技术,旨在以极低的参数量实现大模型在特定任务上的高效适配。其核心思想基于低秩分解假设,即模型在适应新任务时,参数更新矩阵具有低秩特性,可用少量参…...
分享一个可以用GPT打标的傻瓜式SD图片打标工具——辣椒炒肉图片打标助手
一、打标效果展示 请参考下图,了解最终的打标效果: 打标速度提升百分之300; 打标成本: gpt4o每百张图约5毛rmb; gpt4o-mini价格更低; 更有claude,grok,gemini,豆包等…...
实战项目2(03)
目录 任务场景一【重点】 【sw1配置】 【sw2配置】 任务场景二【重点】 【sw1配置】 【sw2配置】 【sw3配置】 任务场景一【重点】 掌握基于SVI实现跨VLAN通信——某公司网络为了减少广播包对网络的影响,网络管理员对网络进行了VLAN划分,完成VLA…...
PyCharm软件下载和配置Python解释器
以下是详细的PyCharm下载及解释器环境配置步骤: 有什么问题可以留评论(看见会回复的) 一、PyCharm下载 1. 访问官网 进入JetBrains官网:https://www.jetbrains.com/pycharm/ 2. 选择版本 Community版(免费&…...
《从零构建一个简易的IOC容器,理解Spring的核心思想》
大家好呀!今天我们要一起探索Java开发中最神奇的魔法之一 —— Spring框架的IOC容器!🧙♂️ 我会用最最最简单的方式,让你彻底明白这个看似高深的概念。准备好了吗?Let’s go! 🚀 一、什么是IOC容器&…...
差分与位移算子
差分与位移算子是数值分析和离散数学中处理序列或离散函数的重要工具。它们通过算子代数简化差分的计算和分析,以下是关键概念和关系的总结: 1. 位移算子(Shift Operator) 定义: 位移算子 ( E ) 将函数 ( f(x) ) 沿自变…...
Robot之VideoMimic:《Visual Imitation Enables Contextual Humanoid Control》翻译与解读
Robot之VideoMimic:《Visual Imitation Enables Contextual Humanoid Control》翻译与解读 导读:这篇论文介绍了VIDEOMIMIC,一个基于视觉模仿的真实到模拟到真实流水线,用于训练人形机器人执行上下文相关的全身动作。该方法通过分…...
【Java学习日记34】:this关键字和成员变量
为什么不需要加 this? 作用域规则: Java编译器在查找变量时遵循“就近原则”。 先在当前方法内查找局部变量或参数。 若找不到,则去类的成员变量中查找。 getName() 的上下文: 该方法没有参数或局部变量名为 name,因…...