windows下安装redis应优先使用wsl2运行原生linux版;若需windows原生环境,推荐redis-windows社区分支而非微软旧版;java项目中spring boot 2.0+默认使用lettuce,因其线程安全、支持异步与连接复用,而jedis需手动管理连接池;配置时注意协议头(redis://)、密码url编码、bind地址及端口占用;连通性测试须结合redis-cli验证,并排除spring缓存代理、序列化器不一致等问题。

Windows下安装Redis服务端:别直接下官方版
Windows原生不支持Redis,官网早就不提供Windows版下载了。现在能用的只有微软维护过的旧版(已停更)或第三方编译版,但最稳妥的是用 WSL2 跑原生Linux版Redis——性能、兼容性、后续升级都更可靠。如果硬要Windows原生环境,推荐用 redis-windows 社区维护分支(GitHub可搜),不是微软那个2016年的老版本。
常见错误现象:redis-server.exe 启动后闪退、redis-cli.exe 连不上、报错 Failed to connect to 127.0.0.1:6379——基本都是服务没真正跑起来,或者防火墙/端口被占。
- 下载解压后,先用管理员权限运行
redis-server.exe redis.windows.conf,别双击exe - 确认配置里
bind 127.0.0.1没被注释,且没改成0.0.0.0(本地开发够用,暴露外网有风险) - 检查
port 6379是否被其他程序占用(比如另一个Redis实例、Skype、某些IDE的调试端口) - 启动后用任务管理器看有没有
redis-server.exe进程,没有就说明配置出错或端口冲突
Java项目里连Redis:Jedis和Lettuce怎么选
Spring Boot 2.0+ 默认用 Lettuce,不是 Jedis。两者底层差异大:Jedis 是直连、线程不安全,每个线程得自己拿连接;Lettuce 基于Netty,支持异步、响应式、连接池自动复用,单例即可全局使用。
容易踩的坑:Jedis 在多线程下不加连接池会直接报 java.net.SocketException: Connection reset;而 Lettuce 如果没配 ClientResources 或连接超时太短,会在高并发时频繁重建连接,打满CPU。
立即学习“Java免费学习笔记(深入)”;
- Spring Boot项目优先用
spring-boot-starter-data-redis,它默认集成Lettuce - 手动配连接池?
Lettuce不需要像Jedis那样显式配JedisPool,但建议调lettuce.pool.max-active和lettuce.pool.max-idle - 测试连通性别只写个
redisTemplate.opsForValue().set("test", "ok")就完事——得加上异常捕获,看是否真抛RedisConnectionFailureException - 本地开发用
redis://127.0.0.1:6379,别写redis://localhost:6379(DNS解析慢,偶尔卡住)
配置文件里Redis地址写错的典型表现
application.yml 或 application.properties 中Redis配置写错,不会编译报错,但运行时所有Redis操作都静默失败或超时。最常错的是协议头、端口、密码三处。
常见错误现象:Cannot get Jedis connection、io.lettuce.core.RedisConnectionException、Spring Boot启动不报错但缓存完全不生效。
- 协议必须是
redis://(无密码)或redis://:password@127.0.0.1:6379(有密码),不能写成http://或漏掉:// - 密码含特殊字符(如
@、/)必须URL编码,比如密码是p@ss/word,得写成redis://:p%40ss%2Fword@127.0.0.1:6379 - Windows下如果Redis启用了密码,但配置里没写,会卡在认证阶段,表现为操作超时而非明确报错
- 用
redis-cli -h 127.0.0.1 -p 6379 -a yourpass ping先验证命令行能通,再查Java配置
本地Redis连上了但缓存不生效?检查这三点
连上不等于能用。Spring Cache、RedisTemplate、@Cacheable 这些机制依赖正确配置和上下文,很多问题出在“以为连上了,其实根本没走Redis”。
典型表现:代码里写了 @Cacheable,但断点发现方法每次都被执行;或者 redisTemplate.opsForValue().get("x") 返回null,但 redis-cli 里明明有值。
- 确认类上加了
@EnableCaching,且该类是Spring管理的Bean(非new出来的对象) - 检查缓存key生成逻辑:
@Cacheable默认用参数做key,如果参数是自定义对象且没重写hashCode()/equals(),会导致key不一致,缓存失效 - Redis里存的是序列化后的字节流,默认用
JdkSerializationRedisSerializer,如果你用StringRedisTemplate存字符串,却用RedisTemplate取,就会反序列化失败返回null
redis-cli 和最简Java代码(不用Spring)逐层验证,比改十遍配置更快。










