Spring Data Redis实战指南:从核心原理到生产级应用
1. 项目概述为什么我们需要Spring Data Redis如果你正在用Java做后端开发并且项目里用到了Redis那你大概率绕不开Spring Data Redis这个框架。我刚开始接触它的时候也犯过嘀咕Redis客户端那么多Jedis、Lettuce用起来也挺直接为什么还要再学一个Spring Data Redis这不是增加学习成本吗但真正在几个中大型项目里用下来我才发现它的价值。它解决的远不止是“连接Redis”这么简单的问题。想象一下你的项目里可能有几十处甚至上百处需要操作Redis的地方缓存用户会话、存储热点数据、实现分布式锁、做消息队列、维护排行榜……如果每个地方你都自己去创建连接、管理序列化、处理异常、确保连接关闭代码会变得异常臃肿且难以维护。更头疼的是当你需要从Jedis切换到性能更好的Lettuce或者公司要求统一使用某种序列化协议时那改动量简直是灾难性的。Spring Data Redis的出现就是为了把开发者从这些重复、底层的劳动中解放出来。它本质上是一个在Spring生态体系下用于简化Redis访问的高级抽象层。它提供了一套统一、模板化的操作接口让你可以用几乎相同的方式去操作String、List、Set、ZSet、Hash这些数据结构而不用关心底层用的是哪个客户端驱动也不用手动处理复杂的序列化与反序列化。它把“与Redis交互”这件事变成了像使用Spring的JdbcTemplate操作数据库一样自然和简单。对于大多数业务场景你只需要关注“存什么”和“取什么”而“怎么存”、“怎么连”这些技术细节框架已经帮你封装好了。这对于提升开发效率、保证代码质量、统一技术栈有着巨大的意义。2. 核心设计理念与架构拆解要用好一个框架不能只停留在会调API的层面理解它的设计思想才能避免踩坑。Spring Data Redis的核心设计遵循了Spring Data项目的一贯哲学Repository抽象和模板模式。2.1 统一的操作模板RedisTemplate与StringRedisTemplate这是你最先接触也最常用的两个类。它们是你的“瑞士军刀”。RedisTemplate这是一个泛型类可以操作任意类型的对象。它的强大之处在于其高度可配置的序列化器Serializer。默认情况下它使用JdkSerializationRedisSerializer这意味着你的对象需要实现Serializable接口存到Redis里的value会是二进制的、不可读的格式。这适用于复杂的Java对象但如果你用redis-cli去看会是一串乱码。StringRedisTemplate这是RedisTemplateString, String的子类是专门为操作字符串类型数据而设计的。它默认的序列化器是StringRedisSerializer键和值都会被当作字符串处理。这意味着存进去的是什么字符串在Redis里看到的就是什么非常直观。它也是处理JSON字符串的绝佳搭档。注意在实际项目中我强烈建议你为不同的数据类型配置专门的RedisTemplate实例。比如一个Template专门用Jackson2JsonRedisSerializer来序列化你的User对象为JSON另一个Template用StringRedisSerializer来处理简单的字符串缓存。混用同一个Template会导致序列化混乱是常见的错误来源。2.2 丰富的序列化策略序列化是RedisTemplate的灵魂也是性能和安全的关键。Spring Data Redis内置了多种序列化器JdkSerializationRedisSerializer默认。使用Java原生序列化。优点能序列化任何Serializable对象。致命缺点序列化后的二进制数据体积大、不可读、且严重依赖Java类路径不同JVM版本或类路径变化可能导致反序列化失败。生产环境慎用。StringRedisSerializer简单字符串序列化。轻量、高效、可读。是键Key序列化的首选也常用于简单的字符串值。Jackson2JsonRedisSerializer/GenericJackson2JsonRedisSerializer使用Jackson库将对象序列化为JSON字符串。这是目前最主流、最推荐的方式。它数据可读、体积小、跨语言友好。后者Generic不需要在反序列化时指定具体的Class类型更为灵活但会额外存储类名信息。OxmSerializer用于XML序列化使用场景较少。配置序列化器是项目初始化的关键一步。一个常见的、健壮的配置示例如下Configuration public class RedisConfig { Bean public RedisTemplateString, Object redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplateString, Object template new RedisTemplate(); template.setConnectionFactory(connectionFactory); // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值 Jackson2JsonRedisSerializerObject jacksonSerializer new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.activateDefaultTyping(om.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL); jacksonSerializer.setObjectMapper(om); // 设置Key和HashKey采用String序列化 template.setKeySerializer(RedisSerializer.string()); template.setHashKeySerializer(RedisSerializer.string()); // 设置Value和HashValue采用Jackson2JsonRedisSerializer template.setValueSerializer(jacksonSerializer); template.setHashValueSerializer(jacksonSerializer); template.afterPropertiesSet(); return template; } Bean public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) { return new StringRedisTemplate(connectionFactory); } }2.3 连接工厂与客户端驱动Spring Data Redis本身不直接连接Redis它通过RedisConnectionFactory接口来获取底层连接。目前主流的实现有两个LettuceConnectionFactory基于Netty的异步、高性能客户端。支持响应式编程连接是线程安全的可以在多个线程间共享避免了连接池的额外开销。在Spring Boot 2.x 及以上版本它已是默认客户端。对于绝大多数应用使用Lettuce就足够了性能好资源占用低。JedisConnectionFactory老牌的、直连式的客户端。每个连接不是线程安全的通常需要配合连接池如commons-pool2使用。在某些极端简单的场景或历史项目中还能见到。在Spring Boot项目中你只需要在pom.xml中引入spring-boot-starter-data-redis它默认就会使用Lettuce。如果你想切换回Jedis需要排除Lettuce依赖并显式引入Jedis。3. 核心API详解与实战操作理解了架构我们来看看具体怎么用。Spring Data Redis的API设计非常直观主要围绕opsForXXX()系列方法展开。3.1 五种数据结构的操作注入配置好的RedisTemplate或StringRedisTemplate后你就可以开始操作了。Autowired private RedisTemplateString, Object redisTemplate; Autowired private StringRedisTemplate stringRedisTemplate; // 获取各种数据结构的操作接口 ValueOperationsString, Object valueOps redisTemplate.opsForValue(); ListOperationsString, Object listOps redisTemplate.opsForList(); SetOperationsString, Object setOps redisTemplate.opsForSet(); ZSetOperationsString, Object zSetOps redisTemplate.opsForZSet(); HashOperationsString, String, Object hashOps redisTemplate.opsForHash();1. 字符串String操作这是最常用的常用于缓存。// 设置缓存并设置10分钟过期 valueOps.set(user:1001, userObject, 10, TimeUnit.MINUTES); // 获取缓存 User user (User) valueOps.get(user:1001); // 如果不存在则设置常用于分布式锁的简单实现 Boolean setIfAbsent valueOps.setIfAbsent(lock:order, locked, 30, TimeUnit.SECONDS); // 原子递增用于计数器 Long increment valueOps.increment(article:1001:view);2. 哈希Hash操作适合存储对象可以将一个对象的多个字段存储在一个Redis键下比将整个对象序列化成JSON字符串再存储在部分更新时更高效。// 存储一个用户对象的所有字段 hashOps.putAll(user:1002, userMap); // userMap是一个MapString, Object // 获取单个字段 String name (String) hashOps.get(user:1002, name); // 仅更新某个字段不影响其他 hashOps.put(user:1002, email, newemail.com);3. 列表List、集合Set、有序集合ZSet这些结构在特定场景下非常有用比如消息队列List、好友共同关注Set交集、排行榜ZSet。// List - 模拟消息队列 listOps.leftPush(task_queue, task1); String task (String) listOps.rightPop(task_queue); // ZSet - 维护一个文章热度排行榜 zSetOps.add(article:hot_rank, article:1001, 150.0); zSetOps.incrementScore(article:hot_rank, article:1001, 10.0); // 增加热度 SetObject top10 zSetOps.reverseRange(article:hot_rank, 0, 9); // 获取前103.2 事务与管道支持Redis本身支持事务MULTI/EXEC和管道Pipeline。Spring Data Redis也提供了相应的抽象。事务通过SessionCallback或RedisTemplate.execute()方法实现。需要注意的是Spring的事务和Redis的事务是两回事。这里的Redis事务只是保证一批命令顺序、原子地执行但中间命令出错不会回滚这与数据库事务不同。ListObject results redisTemplate.execute(new SessionCallbackListObject() { Override public ListObject execute(RedisOperations operations) throws DataAccessException { operations.multi(); // 开启事务 operations.opsForValue().set(key1, value1); operations.opsForValue().increment(counter); // ... 其他操作 return operations.exec(); // 执行事务返回结果列表 } });管道用于批量执行命令减少网络往返RTT时间大幅提升性能特别适合批量插入数据。ListObject results redisTemplate.executePipelined(new SessionCallbackObject() { Override public Object execute(RedisOperations operations) throws DataAccessException { for (int i 0; i 10000; i) { operations.opsForValue().set(pipeline:key: i, value: i); } return null; // 管道中返回值被忽略结果从executePipelined返回 } });3.3 发布订阅Pub/SubSpring Data Redis提供了消息监听容器可以方便地实现发布订阅模式。// 配置监听容器 Configuration public class RedisPubSubConfig { Bean public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { RedisMessageListenerContainer container new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.addMessageListener(listenerAdapter, new ChannelTopic(news.channel)); // 订阅频道 return container; } Bean public MessageListenerAdapter listenerAdapter(Receiver receiver) { // 指定接收消息的方法为 receiveMessage return new MessageListenerAdapter(receiver, receiveMessage); } } // 消息接收者 Component public class Receiver { public void receiveMessage(String message, String channel) { System.out.println(收到频道 [ channel ] 的消息: message); } } // 发布消息 Component public class Publisher { Autowired private StringRedisTemplate redisTemplate; public void sendMessage(String channel, String message) { redisTemplate.convertAndSend(channel, message); } }4. 高级特性与生产级实践当你的应用从Demo走向生产环境以下几个高级特性和实践就变得至关重要。4.1 缓存抽象CacheableSpring Data Redis可以与Spring Cache抽象无缝集成。通过Cacheable、CachePut、CacheEvict等注解你可以声明式地管理缓存而无需手动调用RedisTemplate。首先在配置类上启用缓存并指定缓存管理器。Configuration EnableCaching public class CacheConfig extends CachingConfigurerSupport { Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisCacheConfiguration config RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofMinutes(10)) // 默认过期时间10分钟 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jacksonSerializer())); // 使用Jackson return RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); } // ... 省略jacksonSerializer Bean定义 }然后在Service方法上使用注解。Service public class UserService { Cacheable(value users, key #id) // 缓存名为users键为id public User getUserById(Long id) { // 模拟耗时数据库查询 return userRepository.findById(id).orElse(null); } CachePut(value users, key #user.id) // 更新缓存 public User updateUser(User user) { return userRepository.save(user); } CacheEvict(value users, key #id) // 删除缓存 public void deleteUser(Long id) { userRepository.deleteById(id); } }这种方式极大地简化了缓存代码让业务逻辑更清晰。缓存失效、更新等策略通过注解属性如condition、unless可以灵活控制。4.2 分布式锁的实现虽然Redis的SETNX命令是实现分布式锁的基础但在生产环境中直接使用会遇到锁超时、误删、不可重入等问题。Spring Data Redis没有提供开箱即用的分布式锁但我们可以基于它实现一个更健壮的锁。一个相对完善的分布式锁需要考虑原子性加锁使用setIfAbsent即SETNX并设置过期时间必须是一条命令Redis 2.6.12后支持SET key value NX PX timeout。锁标识value必须是一个唯一标识如UUID确保只能由加锁的客户端解锁防止误删。锁续期如果业务执行时间可能超过锁的过期时间需要有一个“看门狗”机制来定期续期。可重入性可选同一线程可多次获取锁。这里给出一个简化版的实现思路未包含续期Component public class RedisDistributedLock { Autowired private StringRedisTemplate redisTemplate; private static final String LOCK_PREFIX lock:; private static final long DEFAULT_EXPIRE 30000L; // 30秒 public boolean tryLock(String lockKey, String requestId, long expireMillis) { if (expireMillis 0) { expireMillis DEFAULT_EXPIRE; } // 关键使用SET命令的NX和PX选项保证原子性 Boolean success redisTemplate.opsForValue().setIfAbsent( LOCK_PREFIX lockKey, requestId, Duration.ofMillis(expireMillis) ); return Boolean.TRUE.equals(success); } public boolean unlock(String lockKey, String requestId) { String lockKeyFull LOCK_PREFIX lockKey; // 使用Lua脚本保证“判断锁归属”和“删除锁”的原子性 String script if redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end; Long result redisTemplate.execute( new DefaultRedisScript(script, Long.class), Collections.singletonList(lockKeyFull), requestId ); return result ! null result 0; } }实操心得对于生产环境我强烈建议直接使用经过广泛验证的库比如Redisson。它基于Netty和Redis实现了Java驻内存数据网格其提供的RLock对象实现了完整的分布式可重入锁自动处理了锁续期、等待、公平锁等复杂逻辑远比我们自己实现的轮子要可靠。4.3 连接池与超时配置即使是使用Lettuce在高并发下合理的连接池配置也是必要的Lettuce本身基于共享连接但也可以配置连接池。在application.yml中配置spring: redis: host: localhost port: 6379 password: lettuce: pool: max-active: 8 # 连接池最大连接数使用负值表示没有限制 max-idle: 8 # 连接池中的最大空闲连接 min-idle: 0 # 连接池中的最小空闲连接 max-wait: -1ms # 连接池最大阻塞等待时间使用负值表示没有限制 timeout: 2000ms # 连接超时时间这些参数需要根据你的实际业务流量和Redis服务器性能进行调整。max-active不宜设置过大否则会压垮Redis服务器。5. 常见问题排查与性能优化在实际开发中你会遇到各种各样的问题。这里记录几个我踩过的坑和解决方案。5.1 序列化错误Cannot deserialize 乱码问题这是新手最高频的问题。症状存进去一个对象取出来时报Cannot deserialize异常或者在Redis客户端看到\xac\xed\x00\x05t\x00\x05hello这样的乱码。根因存和取使用的RedisTemplate序列化器不一致。解决方案统一序列化方案如前文配置所示在项目初期就明确并统一序列化器。强烈推荐Key用StringRedisSerializerValue用Jackson2JsonRedisSerializer。检查Template注入确保你Autowired的是正确的RedisTemplateBean。如果你配置了多个使用Qualifier指定。清理旧数据如果Redis中已有旧格式如JDK序列化的数据而你现在想改用JSON序列化要么写迁移脚本要么直接清空旧数据如果允许。5.2 连接超时与连接池耗尽症状RedisCommandTimeoutException,Cannot get Jedis connection。排查检查网络与Redis服务redis-cli -h your_host -p your_port ping看是否通。检查配置确认spring.redis.timeout配置合理如2秒连接池参数是否过小。检查连接泄漏你是否在代码中手动获取了RedisConnection而没有关闭使用RedisTemplate通常不会发生但如果你直接用了RedisConnectionFactory务必用try-with-resources。监控慢查询使用Redis的SLOWLOG命令查看是否有执行过慢的命令阻塞了连接。可能是你的某个keys *操作或者处理大Hash、大List的命令导致的。5.3 内存增长过快与Key设计Redis是内存数据库不合理的Key设计会导致内存爆炸。问题使用user:1001:name,user:1001:age,user:1001:email... 存储一个用户信息产生了大量小Key内存利用率低每个Key都有元数据开销。优化改用Hash结构一个Keyuser:1001存储所有字段。Key命名规范建议使用冒号分隔形成一种层级结构如业务:子业务:唯一标识例如order:unpaid:20240501,cache:product:detail:12345。这既清晰也方便后续按模式扫描或清理。设置过期时间对于缓存数据务必设置过期时间TTL。可以使用redisTemplate.expire(key, timeout, unit)或在Cacheable中配置。5.4 缓存穿透、击穿、雪崩这是分布式缓存的经典问题Spring Data Redis作为客户端需要配合一定的编码策略来防御。缓存穿透查询一个数据库中一定不存在的数据。解决方案对不存在的Key也缓存一个空值如null并设置较短过期时间使用布隆过滤器提前拦截。缓存击穿某个热点Key过期瞬间大量请求直接打到数据库。解决方案使用互斥锁如前面提到的分布式锁只让一个请求去查库重建缓存其他请求等待。缓存雪崩大量Key在同一时间过期导致所有请求涌向数据库。解决方案给缓存过期时间加上一个随机值分散过期时间。在Spring Cache中可以结合Cacheable的sync属性仅限本地锁分布式环境需用分布式锁和自定义CacheManager来部分解决这些问题。5.5 监控与运维建议启用Redis监控使用INFO命令或通过Redis的监控工具如RedisInsight、Another Redis Desktop Manager监控内存使用、命中率、连接数、命令耗时等关键指标。日志记录为RedisTemplate设置合理的日志级别DEBUG或TRACE在排查序列化、连接问题时非常有用。考虑使用Redisson如果你的项目重度依赖Redis的分布式数据结构、锁、队列等高级功能引入Redisson作为客户端会比直接使用Spring Data Redis的底层操作更强大、更省心。版本管理注意Spring Boot、Spring Data Redis和底层Lettuce/Jedis客户端的版本兼容性。遵循Spring Boot官方提供的依赖管理BOM可以避免大部分兼容性问题。从我的经验来看Spring Data Redis是一个“上手容易精通需花心思”的框架。把它用对、用好能让你在享受Redis高性能的同时保持代码的整洁和可维护性。核心在于理解其抽象层次做好序列化配置并针对生产环境的特点高并发、高可用、可观测进行调优和防护。避免把它当成一个黑盒多了解其背后的原理和最佳实践才能在复杂的系统里游刃有余。

相关新闻

解决Playwright CI测试失败:Headless模式与本地环境差异排查指南

解决Playwright CI测试失败:Headless模式与本地环境差异排查指南

1. 项目概述:当自动化测试在CI中“失明” 最近在为一个Web应用项目搭建端到端(E2E)自动化测试流水线时,我遇到了一个典型的、却又令人头疼的问题:所有在本地开发环境(MacOS/Windows)运行得稳稳当…

2026/10/8 2:18:54 阅读更多 →
GBFR-Logs:你的Granblue Fantasy: Relink战斗数据专家

GBFR-Logs:你的Granblue Fantasy: Relink战斗数据专家

GBFR-Logs:你的Granblue Fantasy: Relink战斗数据专家 【免费下载链接】gbfr-logs GBFR Logs lets you track damage statistics with a nice overlay DPS meter for Granblue Fantasy: Relink. 项目地址: https://gitcode.com/gh_mirrors/gb/gbfr-logs 你是…

2026/10/13 15:52:47 阅读更多 →
Python字符串操作全解析:从基础概念到正则表达式实战应用

Python字符串操作全解析:从基础概念到正则表达式实战应用

在日常开发中,字符串处理是Python编程最基础也是最频繁的操作之一。无论是数据清洗、日志解析还是接口交互,都离不开字符串的各种操作。很多初学者虽然能写出基本代码,但在实际项目中遇到复杂字符串处理时,往往因为对Python字符串…

2026/10/12 18:33:40 阅读更多 →

最新新闻

Java基础探秘:JSON解析与反射机制如何协同工作

Java基础探秘:JSON解析与反射机制如何协同工作

最近在写一个接口的时候,我盯着IDE里那几十行setter调用,脑子里突然冒出一个问题:前端传过来一段JSON字符串,我一行代码就把它变成了业务对象,中间到底是谁在帮我完成键名和字段的匹配?顺着这个疑问查下去&…

2026/10/14 6:41:29 阅读更多 →
QGIS 加载天地图出现灰色影像:层级参数 l 与 z 的坑,附四种返回码对照

QGIS 加载天地图出现灰色影像:层级参数 l 与 z 的坑,附四种返回码对照

场景QGIS 里挂天地图底图,图层加成功了,瓦片也在刷,画面却是一片灰,每个格子上写着"此级别下,该区域无影像"。打开浏览器 F12 一看,状态码 200,图片也确实回来了。这时候大多数人会往…

2026/10/14 6:41:29 阅读更多 →
Agent通信协议选型指南:JSON-RPC、MCP、A2A与ACP的分层实践

Agent通信协议选型指南:JSON-RPC、MCP、A2A与ACP的分层实践

1. 为什么 Agent 通信协议突然“百花齐放”过去一年里,只要你在做 AI Agent 相关的开发,几乎绕不开一个困惑:同样是让两个智能体互相说话,怎么一会儿是 JSON-RPC,一会儿是 MCP,转头又冒出 A2A、ACP&#xf…

2026/10/14 6:41:29 阅读更多 →
Chat2DB 实战:AI 生成 SQL 的数据库管理工具与避坑指南

Chat2DB 实战:AI 生成 SQL 的数据库管理工具与避坑指南

简介:Chat2DB项目代码包是一份集成人工智能能力的开源数据库管理工具示例,面向需要降低数据库操作门槛的开发者、数据分析师以及对自然语言生成SQL感兴趣的技术人员。整个资源共包含3个文件,涵盖inscode入口文件、html介绍文档以及gitignore配…

2026/10/14 6:41:29 阅读更多 →
PS5串流实战:AnyPS5配置与网络调优全攻略

PS5串流实战:AnyPS5配置与网络调优全攻略

把一台PS5玩出三台机器的效果,是不少玩家都在琢磨的事。AnyPS5这个项目,说白了就是干这件事:让PS5不再被客厅电视绑住,而是把画面和操作实时串流到你手边的任何一块屏幕上——笔记本、平板、手机、甚至办公电脑。我在这个方向上前…

2026/10/14 6:41:29 阅读更多 →
C#调用WebService获取PDF转图片:选型与踩坑实战

C#调用WebService获取PDF转图片:选型与踩坑实战

做C#开发这几年,遇到“调用WebService获取PDF文件再转换为图片”这种需求不算少。可能是一个审批系统需要预览合同,也可能是一个报表平台需要把服务端生成的文件转成缩略图展示。总之核心工作就两件事:把远程文件拿下来,再在本地转…

2026/10/14 6:40:29 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →