Redis exec命令失效的主要原因包括事务未正确MULTI开始、WATCH监控键值变化导致乐观锁失败、连接超时或网络问题、事务中命令语法错误、Lua脚本冲突或pipeline混用不当。排查步骤:1.检查MULTI是否执行;2.验证WATCH键值是否被修改;3.确认连接池配置和超时设置;4.redis-cli进入事务模式测试multi/exec;5.查看redis日志slowlog和errorlog;6.使用INFO commandstats监控命令执行统计。
CSDN博客
在使用Redis事务时,如果没有先执行MULTI命令,EXEC就会返回nil,表示事务未开始。常见错误是忘记MULTI,或者在MULTI后直接DISCARD了事务。另外,WATCH命令监控的key如果在EXEC前被其他客户端修改,EXEC也会失败返回nil,这是Redis乐观锁机制。
StackOverflow讨论
Redis事务的EXEC命令失效通常是因为在MULTI和EXEC之间有语法错误的命令,导致整个事务回滚。检查日志可以看到'EXEC without MULTI'或'Transaction discarded because of previous command error'。解决方案是用EVAL脚本代替事务,或确保每个命令正确。
Redis官方文档片段
A transaction is created using the MULTI command. Commands are queued until EXEC or DISCARD is issued. If WATCH is used, EXEC aborts if watched keys are modified. Reasons for EXEC failure: no MULTI called, WATCH keys changed, command errors in queue.
掘金文章
缓存数据库故障排查技巧:1.用redis-cli --latency检查延迟;2.SLOWLOG GET查看慢查询;3.MONITOR命令实时监控命令;4.内存使用INFO memory,OOME常见于maxmemory配置不当;5.连接数超限用INFO clients检查;6.AOF/RDB持久化故障导致数据丢失,用CONFIG GET save查看配置。
博客园经验分享
Redis常见故障:连接拒绝是端口防火墙问题或protected-mode开启;内存不足触发eviction;主从复制延迟用INFO replication检查offset;cluster节点故障用cluster nodes查看状态。排查工具:redis-cli info、redis-check-aof、sentinel monitor。
知乎回答
EXEC失效探因:pipeline模式下不能用事务;Lua脚本EVAL不能嵌套事务;客户端库如Jedis事务提交时连接被复用导致丢失。技巧:用@transactional注解检查,或日志打印事务队列内容。
FAQ
Q: Redis事务为什么EXEC返回nil?
A: 通常是WATCH键被改或未MULTI开始。
Q: 如何排查Redis慢查询?
A: 执行SLOWLOG GET 10查看最近慢命令。
Q: 缓存穿透怎么处理?
A: 用布隆过滤器或空值缓存。
Q: 主从同步失败原因?
A: 检查repl-diskless-sync和offset不匹配。