运维与集成

返回 Redis

分布式避坑清单

类别建议
复制从库读旧关键读主;监控 lag
哨兵脑裂双写min-replicas;自动发现主
集群热 key拆分、本地缓存
集群大 key拆分、UNLINK、禁 KEYS
过期误释放看门狗 + 短临界区
缓存穿透/击穿/雪崩缓存与一致性
事务跨 slot哈希标签
运维误删ACL、禁用危险命令
内存无 maxmemory必须限制 + 淘汰
网络重试风暴退避、熔断

与 CAP

部署倾向
单机CP 倾向,持久化决定 A
主从异步AP,有复制延迟
Sentinel failover可能丢最后写入
Cluster分区时部分 slot 不可用

缓存层通常 最终一致;资金/库存靠 DB + 锁 + 幂等。


性能与运维

连接池

spring.data.redis.lettuce.pool:
  max-active: 16
  max-idle: 8
  min-idle: 2
  max-wait: 1000ms

避免连接过多;Pipeline 减 RTT。

慢查询与大 key

SLOWLOG GET 10
redis-cli --bigkeys
redis-cli --hotkeys
MEMORY USAGE key

禁用 KEYS *;用 SCAN

序列化

String key + JSON value;避免 Java 默认序列化。

ACL(6.0+)

ACL SETUSER app on >password ~cache:* +@read +@write -@dangerous

Spring Boot 集成

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson-spring-boot-starter</artifactId>
</dependency>
spring:
  data:
    redis:
      host: localhost
      port: 6379
      lettuce:
        pool:
          max-active: 16
      cluster:
        nodes: host1:7000,host2:7001
        max-redirects: 3
// Cache-Aside
public User getUser(Long id) {
    String key = "user:" + id;
    User cached = (User) redisTemplate.opsForValue().get(key);
    if (cached != null) return cached;
    User dbUser = userMapper.selectById(id);
    if (dbUser != null) {
        redisTemplate.opsForValue().set(key, dbUser, Duration.ofMinutes(30));
    } else {
        redisTemplate.opsForValue().set(key, "", Duration.ofMinutes(5));
    }
    return dbUser;
}

详解:Redis 集成缓存


相关