Redis阻塞的主要成因包括大key、慢查询、过期键删除策略不当和内存不足等。首先,使用redis-cli --bigkeys命令扫描大key并拆分它们;优化慢查询通过slowlog log命令监控并调整命令;设置maxmemory-policy为allkeys-lru策略;增加服务器内存并配置合理的maxmemory;调整hz参数提升键空间清理效率。这些优化能让数据流动更顺畅。
大key导致阻塞
大key是Redis阻塞的常见元凶,比如一个hash包含数百万字段,或者list有上亿元素。读取大key时会阻塞主线程,导致整个实例响应迟钝。解决办法:定期用scan命令遍历keyspace,找到大key后拆分成多个小key,或者用hash的hscan/lscan等渐进式命令。
慢命令优化
keys *、smembers等命令在大数据集上很慢,会阻塞服务器。配置slowlog-log-slower-than 10000记录慢查询,然后用scan代替keys,用hscan代替hgetall。监控slowlog get查看并优化这些命令。
内存和过期策略
内存不足时,Redis会触发阻塞以执行内存回收。设置maxmemory并选择合适的eviction策略如volatile-lru。lazyfree-lazy-evict开启惰性删除,避免阻塞式删除过期键。
客户端连接过多
连接数爆炸会导致事件循环阻塞。设置maxclients限制连接数,使用连接池管理客户端连接,超时连接及时关闭。timeout 0改为合理值如300秒。
持久化阻塞
AOF重写或RDB快照时会fork子进程,消耗CPU导致阻塞。配置no-appendfsync-on-rewrite禁用重写时的fsync,使用bgrewriteaof背景重写。
Pipeline和多线程
使用Pipeline批量发送命令减少RTT延迟。新版Redis 6.0引入I/O线程,提升多核性能,配置io-threads 4利用多线程处理网络IO。
FAQ
Q: 如何快速找到大key?
A: 用redis-cli --bigkeys -i 0.01扫描。
Q: 慢查询怎么监控?
A: slowlog get 100查看最近慢查询。
Q: 内存满时Redis怎么处理?
A: 根据maxmemory-policy策略驱逐键。
Q: 主从复制会阻塞吗?
A: 大量数据全量同步时可能阻塞,优化repl-diskless-sync yes。