Redis 实操要点:Java 最新技术栈的实战解析

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
云原生网关 MSE Higress,422元/月
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: 本文介绍了基于Spring Boot 3、Redis 7和Lettuce客户端的Redis高级应用实践。内容包括:1)现代Java项目集成Redis的配置方法;2)使用Redisson实现分布式可重入锁与公平锁;3)缓存模式解决方案,包括布隆过滤器防穿透和随机过期时间防雪崩;4)Redis数据结构的高级应用,如HyperLogLog统计UV和GeoHash处理地理位置。文章提供了详细的代码示例,涵盖Redis在分布式系统中的核心应用场景,特别适合需要处理高并发、分布式锁等问题的开发场景。

以下是基于最新技术栈的Redis实操内容,结合Spring Boot 3、Redis 7及Lettuce客户端,覆盖分布式锁、缓存模式、集群配置等核心场景。

一、现代Java项目集成Redis

1. Spring Boot 3 + Redis 7 配置

pom.xml中添加依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- Redisson 分布式锁实现 -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.23.1</version>
</dependency>

application.yml配置:

spring:
  redis:
    host: localhost
    port: 6379
    password: your_password  # 生产环境建议使用安全凭证
    client-type: lettuce      # 默认使用Lettuce客户端
    timeout: 5000ms
    # 连接池配置
    lettuce:
      pool:
        max-active: 100
        max-wait: -1ms
        max-idle: 10
        min-idle: 0
    # Redis集群配置示例
    cluster:
      nodes:
        - 192.168.1.1:6379
        - 192.168.1.2:6379
        - 192.168.1.3:6379

二、分布式锁最佳实践(Redisson)

1. 可重入锁实现

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component
public class DistributedLockService {
   
    private final RedissonClient redissonClient;

    public DistributedLockService(RedissonClient redissonClient) {
   
        this.redissonClient = redissonClient;
    }

    // 阻塞锁示例
    public void doWithLock(String lockName, Runnable action) {
   
        RLock lock = redissonClient.getLock(lockName);
        try {
   
            // 尝试获取锁,等待10秒,自动释放时间30秒
            boolean isLocked = lock.tryLock(10, 30, TimeUnit.SECONDS);
            if (isLocked) {
   
                action.run();
            }
        } catch (InterruptedException e) {
   
            Thread.currentThread().interrupt();
        } finally {
   
            if (lock.isHeldByCurrentThread()) {
   
                lock.unlock();
            }
        }
    }

    // 公平锁示例
    public void doWithFairLock(String lockName, Runnable action) {
   
        RLock fairLock = redissonClient.getFairLock(lockName);
        try {
   
            fairLock.lock();
            action.run();
        } finally {
   
            if (fairLock.isHeldByCurrentThread()) {
   
                fairLock.unlock();
            }
        }
    }
}

2. 业务场景应用

@Service
public class OrderService {
   
    @Autowired
    private DistributedLockService lockService;

    public void createOrder(String orderId) {
   
        lockService.doWithLock("order:" + orderId, () -> {
   
            // 检查库存、生成订单等业务逻辑
            log.info("订单创建中: {}", orderId);
        });
    }
}

三、缓存模式实战

1. 缓存穿透防护(Bloom Filter)

import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

@Service
public class BloomFilterService {
   
    private final RBloomFilter<String> bloomFilter;

    public BloomFilterService(RedissonClient redissonClient) {
   
        // 初始化布隆过滤器,预计元素100万,误判率0.01%
        bloomFilter = redissonClient.getBloomFilter("userBloomFilter");
        bloomFilter.tryInit(1000000, 0.0001);
    }

    public void addToBloomFilter(String key) {
   
        bloomFilter.add(key);
    }

    public boolean mightContain(String key) {
   
        return bloomFilter.contains(key);
    }
}

2. 缓存雪崩预防

@Service
public class ProductService {
   
    @Autowired
    private RedisTemplate<String, Product> redisTemplate;
    @Value("${cache.expire.random.min:60}")
    private int minExpire;
    @Value("${cache.expire.random.max:120}")
    private int maxExpire;

    public Product getProduct(Long id) {
   
        String key = "product:" + id;
        Product product = redisTemplate.opsForValue().get(key);

        if (product == null) {
   
            // 从数据库加载
            product = loadFromDatabase(id);

            // 设置随机过期时间(60-120秒)
            long expire = minExpire + ThreadLocalRandom.current().nextLong(maxExpire - minExpire);
            redisTemplate.opsForValue().set(key, product, expire, TimeUnit.SECONDS);
        }
        return product;
    }
}

四、Redis数据结构高级应用

1. HyperLogLog统计UV

@Service
public class AnalyticsService {
   
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    public void logVisit(String userId, String pageId) {
   
        String key = "uv:" + pageId + ":daily";
        redisTemplate.opsForHyperLogLog().add(key, userId);
    }

    public long getDailyUV(String pageId) {
   
        String key = "uv:" + pageId + ":daily";
        return redisTemplate.opsForHyperLogLog().size(key);
    }
}

2. GeoHash地理位置查询

@Service
public class LocationService {
   
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    private static final String KEY = "shop_locations";

    public void addShopLocation(String shopId, double longitude, double latitude) {
   
        redisTemplate.opsForGeo().add(KEY, new Point(longitude, latitude), shopId);
    }

    public List<String> findNearbyShops(double longitude, double latitude, double radius, String unit) {
   
        Circle circle = new Circle(new Point(longitude, latitude), new Distance(radius, RedisGeoCommands.DistanceUnit.valueOf(unit)));
        GeoResults<RedisGeoCommands.GeoLocation<String>> results = 
            redisTemplate.opsForGeo().radius(KEY, circle);

        return results.getContent().stream()
                .map(result -> result.getContent().getName())
                .collect(Collectors.toList());
    }
}

五、Redis集群与哨兵模式配置

1. 集群模式配置

@Configuration
public class RedisClusterConfig {
   
    @Bean
    public RedisConnectionFactory redisConnectionFactory(RedisProperties properties) {
   
        RedisClusterConfiguration clusterConfig = new RedisClusterConfiguration(properties.getCluster().getNodes());
        clusterConfig.setPassword(RedisPassword.of(properties.getPassword()));

        // 开启SSL(生产环境建议配置)
        if (properties.isSsl()) {
   
            SslSocketFactory sslSocketFactory = (SslSocketFactory) SslSocketFactory.getDefault();
            LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
                    .useSsl().sslSocketFactory(sslSocketFactory).build();
            return new LettuceConnectionFactory(clusterConfig, clientConfig);
        }

        return new LettuceConnectionFactory(clusterConfig);
    }
}

2. 哨兵模式配置

spring:
  redis:
    sentinel:
      master: mymaster
      nodes:
        - 192.168.1.10:26379
        - 192.168.1.11:26379
        - 192.168.1.12:26379
    password: your_sentinel_password

六、性能监控与调优

1. 自定义Redis监控指标

@Configuration
public class RedisMetricsConfig {
   
    @Bean
    public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags(RedisProperties properties) {
   
        return registry -> registry.config().commonTags(
                "redis.host", properties.getHost(),
                "redis.port", String.valueOf(properties.getPort())
        );
    }

    @Bean
    public RedisHealthIndicator redisHealthIndicator(RedisConnectionFactory connectionFactory) {
   
        return new RedisHealthIndicator(connectionFactory);
    }
}

2. Redis慢查询日志分析

@Service
public class RedisSlowLogService {
   
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    public List<SlowLogEntry> getSlowLog(int count) {
   
        return redisTemplate.execute((RedisCallback<List<SlowLogEntry>>) connection -> {
   
            List<org.springframework.data.redis.connection.RedisServerCommands.SlowLogEntry> entries = 
                connection.serverCommands().slowLogGet(count);

            return entries.stream()
                    .map(entry -> new SlowLogEntry(
                            entry.getId(), 
                            entry.getExecutionTime(), 
                            entry.getTimestamp(), 
                            entry.getArgs()))
                    .collect(Collectors.toList());
        });
    }
}

// 自定义SlowLogEntry类
public class SlowLogEntry {
   
    private final long id;
    private final long executionTime;
    private final Date timestamp;
    private final List<byte[]> args;

    // 构造函数、Getter略
}

七、高可用架构实践

1. Redis Sentinel自动故障转移

@Service
public class SentinelMonitorService {
   
    @Autowired
    private RedissonClient redissonClient;

    public void checkSentinelStatus() {
   
        RNodesGroup nodesGroup = redissonClient.getNodesGroup();
        List<Node> nodes = nodesGroup.getNodes();

        nodes.forEach(node -> {
   
            System.out.println("节点状态: " + node.getAddr() + " - " + node.getStatus());
        });
    }
}

2. Redis Cluster分片策略

@Service
public class ShardingService {
   
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    // 使用哈希标签确保多个Key在同一节点
    public void batchOperations() {
   
        String key1 = "{user:1}:profile";
        String key2 = "{user:1}:orders";

        redisTemplate.opsForValue().set(key1, "profile_data");
        redisTemplate.opsForList().rightPush(key2, "order1", "order2");

        // 使用MGET保证原子性(同一节点)
        List<String> values = redisTemplate.opsForValue().multiGet(Arrays.asList(key1, key2));
    }
}

八、安全加固方案

1. Redis ACL配置

@Configuration
public class RedisSecurityConfig {
   
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
   
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
        config.setHostName("localhost");
        config.setPort(6379);

        // 使用ACL认证
        RedisPassword password = RedisPassword.of("user:password");
        config.setPassword(password);

        return new LettuceConnectionFactory(config);
    }
}

2. 数据加密传输

spring:
  redis:
    host: redis.example.com
    port: 6379
    ssl: true
    timeout: 5000
    password: ${
   REDIS_PASSWORD}
    lettuce:
      pool:
        max-active: 8

九、异步操作与响应式编程

1. Reactive Redis操作

@Service
public class ReactiveUserService {
   
    private final ReactiveRedisTemplate<String, User> reactiveRedisTemplate;

    public ReactiveUserService(ReactiveRedisTemplate<String, User> reactiveRedisTemplate) {
   
        this.reactiveRedisTemplate = reactiveRedisTemplate;
    }

    public Mono<User> getUser(String id) {
   
        return reactiveRedisTemplate.opsForValue().get("user:" + id);
    }

    public Mono<Void> saveUser(User user) {
   
        return reactiveRedisTemplate.opsForValue()
                .set("user:" + user.getId(), user)
                .then();
    }
}

十、性能压测与优化

1. Lettuce连接池优化

spring:
  redis:
    lettuce:
      pool:
        max-active: 200  # 最大连接数
        max-wait: -1ms   # 获取连接的最大等待时间
        max-idle: 50     # 最大空闲连接数
        min-idle: 10     # 最小空闲连接数
      shutdown-timeout: 100ms  # 关闭超时时间

2. Pipeline批量操作

@Service
public class BatchOperationService {
   
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    public void batchSet(Map<String, String> data) {
   
        redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
   
            data.forEach((key, value) -> {
   
                connection.set(key.getBytes(), value.getBytes());
            });
            return null;
        });
    }
}

总结

以上代码覆盖了Redis在现代Java项目中的核心应用场景,包括:

  1. 最新技术集成:Spring Boot 3、Redisson 3.23、Lettuce客户端
  2. 分布式锁最佳实践:可重入锁、公平锁、自动续期
  3. 缓存模式优化:布隆过滤器防穿透、随机过期防雪崩
  4. 高级数据结构应用:HyperLogLog统计、GeoHash地理位置查询
  5. 高可用架构:集群、哨兵模式配置与监控
  6. 性能与安全:连接池优化、SSL加密、ACL认证

这些示例代码可直接用于生产环境,建议根据实际业务需求进行参数调优和功能扩展。

--
Redis,

--


代码获取方式
https://pan.quark.cn/s/14fcf913bae6


相关文章
|
13天前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
132 3
|
16天前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
225 1
|
18天前
|
Java 关系型数据库 数据库
Java 项目实战教程从基础到进阶实战案例分析详解
本文介绍了多个Java项目实战案例,涵盖企业级管理系统、电商平台、在线书店及新手小项目,结合Spring Boot、Spring Cloud、MyBatis等主流技术,通过实际应用场景帮助开发者掌握Java项目开发的核心技能,适合从基础到进阶的学习与实践。
134 3
|
20天前
|
缓存 前端开发 Java
基于最新 Java 技术栈的在线任务管理系统开发实战详解
本项目基于最新Java技术栈开发在线任务管理系统,涵盖任务创建、分配、跟踪、统计等功能。采用Spring Boot 3.2.x、React 18、PostgreSQL 16等主流技术,详解项目架构设计、核心功能实现及部署流程,助力掌握现代Java全栈开发技能。
102 6
|
17天前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
195 1
|
25天前
|
消息中间件 Java 数据库
Java 基于 DDD 分层架构实战从基础到精通最新实操全流程指南
本文详解基于Java的领域驱动设计(DDD)分层架构实战,结合Spring Boot 3.x、Spring Data JPA 3.x等最新技术栈,通过电商订单系统案例展示如何构建清晰、可维护的微服务架构。内容涵盖项目结构设计、各层实现细节及关键技术点,助力开发者掌握DDD在复杂业务系统中的应用。
217 0
|
23天前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
110 4
|
29天前
|
人工智能 自然语言处理 分布式计算
AI 驱动传统 Java 应用集成的关键技术与实战应用指南
本文探讨了如何将AI技术与传统Java应用集成,助力企业实现数字化转型。内容涵盖DJL、Deeplearning4j等主流AI框架选择,技术融合方案,模型部署策略,以及智能客服、财务审核、设备诊断等实战应用案例,全面解析Java系统如何通过AI实现智能化升级与效率提升。
141 0
|
2月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
110 0