一、Redis缓存更新策略

在分布式系统中,缓存更新是保证数据一致性的核心问题之一。常见的缓存更新策略包括Cache-AsideWrite-ThroughWrite-BehindRefresh-Ahead。我们以Cache-Aside为例,结合Java技术栈详细说明。

1. Cache-Aside(旁路缓存)

Cache-Aside是最常用的策略,由应用程序主动管理缓存和数据库的同步。

// Java示例:Cache-Aside策略实现
public class UserService {
    private RedisTemplate<String, Object> redisTemplate;
    private UserRepository userRepository;

    // 查询用户信息
    public User getUserById(Long id) {
        String cacheKey = "user:" + id;
        // 1. 先查缓存
        User user = (User) redisTemplate.opsForValue().get(cacheKey);
        if (user != null) {
            return user; // 缓存命中
        }
        // 2. 缓存未命中,查数据库
        user = userRepository.findById(id).orElse(null);
        if (user != null) {
            // 3. 写入缓存
            redisTemplate.opsForValue().set(cacheKey, user, 30, TimeUnit.MINUTES);
        }
        return user;
    }

    // 更新用户信息
    public void updateUser(User user) {
        // 1. 更新数据库
        userRepository.save(user);
        // 2. 删除缓存
        redisTemplate.delete("user:" + user.getId());
    }
}

注释说明:

  • 查询时先查缓存,未命中再查数据库并回填缓存。
  • 更新时先更新数据库,再删除缓存(避免脏数据)。

优缺点:

  • 优点:实现简单,适用于读多写少场景。
  • 缺点:存在缓存穿透(恶意请求不存在的Key)和缓存击穿(热点Key失效)风险。

2. Write-Through(写穿透)

Write-Through策略在更新数据库时同步更新缓存,通常由缓存组件自动完成。

// Java示例:Write-Through策略(伪代码)
public class WriteThroughCache {
    public void save(User user) {
        // 1. 同步更新数据库和缓存
        database.save(user);
        cache.put("user:" + user.getId(), user);
    }
}

适用场景:

  • 对一致性要求高的场景,如金融系统。
  • 缺点:写入性能较低,每次更新都需操作缓存和数据库。

二、数据同步方案

在分布式环境下,Redis集群的数据同步至关重要。常见方案包括主从复制哨兵模式Redis Cluster

1. 主从复制

主节点(Master)负责写,从节点(Slave)负责读和数据同步。

# Redis配置示例:设置主从复制
# 在从节点执行
SLAVEOF 192.168.1.100 6379  # 指定主节点IP和端口

注意事项:

  • 主从同步是异步的,可能存在延迟。
  • 主节点宕机需手动切换从节点为主节点。

2. Redis Cluster

Redis Cluster通过分片(Sharding)实现数据分布式存储,支持自动故障转移。

// Java示例:连接Redis Cluster
@Bean
public RedisConnectionFactory redisConnectionFactory() {
    RedisClusterConfiguration config = new RedisClusterConfiguration();
    config.addClusterNode(new RedisNode("192.168.1.100", 7000));
    config.addClusterNode(new RedisNode("192.168.1.101", 7001));
    return new JedisConnectionFactory(config);
}

优缺点:

  • 优点:高可用、自动分片。
  • 缺点:跨分片事务不支持,需客户端处理分片逻辑。

三、集群扩容方案

随着业务增长,Redis集群可能需要扩容。常见方案包括垂直扩容水平扩容

1. 垂直扩容

通过升级单机硬件(如内存、CPU)提升性能。

适用场景:

  • 数据量较小但访问量高。
  • 缺点:单机硬件有上限,无法无限扩展。

2. 水平扩容

通过增加节点分散数据存储和计算压力。

# Redis Cluster添加新节点
redis-cli --cluster add-node 192.168.1.102:7002 192.168.1.100:7000

注意事项:

  • 需重新分配槽位(Slot),可能引发数据迁移。
  • 迁移期间性能可能下降。

四、应用场景与总结

1. 应用场景

  • 电商系统:商品详情页缓存(Cache-Aside)。
  • 社交网络:热点数据存储(Redis Cluster)。

2. 技术优缺点总结

  • 缓存更新策略:Cache-Aside简单但需处理穿透问题;Write-Through一致性好但性能低。
  • 数据同步:主从复制适合读多写少;Redis Cluster适合大规模分布式场景。
  • 集群扩容:垂直扩容成本高,水平扩容更灵活。

3. 注意事项

  • 避免缓存雪崩(随机过期时间)。
  • 监控主从同步延迟。

通过合理选择策略和方案,可以显著提升Redis在分布式系统中的性能和一致性。