Redisson 是一个基于 Redis 的 Java 客户端,提供了分布式锁、分布式集合、分布式对象等丰富的分布式功能,极大简化了 Redis 在分布式系统中的应用。以下是 Redisson 的详细使用教程:

一、环境准备

1. 引入依赖

在 Maven 项目的 pom.xml 中添加 Redisson 依赖:

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.23.3</version> <!-- 建议使用最新稳定版 -->
</dependency>
2. 配置 Redisson 客户端

Redisson 支持多种配置方式(YAML、JSON、Java 代码),以下是最常用的 Java 代码配置:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

public class RedissonConfig {
    public static RedissonClient getRedissonClient() {
        // 创建配置对象
        Config config = new Config();
        
        // 单节点模式(生产环境建议用集群/主从模式)
        config.useSingleServer()
              .setAddress("redis://127.0.0.1:6379") // Redis 地址
              .setPassword("123456") // 若有密码
              .setDatabase(0) // 数据库编号(默认 0)
              .setConnectionPoolSize(50); // 连接池大小
        
        // 集群模式示例(按需选择)
        // config.useClusterServers()
        //       .addNodeAddress("redis://127.0.0.1:7001", "redis://127.0.0.1:7002");
        
        // 创建并返回 Redisson 客户端
        return Redisson.create(config);
    }
}

二、核心功能使用示例

1. 分布式锁(最常用功能)

Redisson 的分布式锁基于 Redis 实现,支持自动续约、可重入、公平锁等特性。

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;

public class DistributedLockExample {
    public static void main(String[] args) {
        // 获取 Redisson 客户端
        RedissonClient redisson = RedissonConfig.getRedissonClient();
        
        // 获取锁对象(锁的 key 为 "order_lock")
        RLock lock = redisson.getLock("order_lock");
        
        try {
            // 尝试获取锁:最多等待 10 秒,10 秒内未获取则失败;锁自动释放时间为 30 秒
            boolean isLocked = lock.tryLock(10, 30, java.util.concurrent.TimeUnit.SECONDS);
            if (isLocked) {
                // 获得锁后执行临界区代码(如创建订单、扣减库存)
                System.out.println("获取锁成功,执行业务逻辑...");
                Thread.sleep(5000); // 模拟业务操作
            } else {
                System.out.println("获取锁失败,可能有其他线程占用");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            // 确保锁释放(只有持有锁的线程才能释放)
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
                System.out.println("释放锁成功");
            }
        }
        
        // 关闭客户端(实际应用中通常全局单例,无需频繁关闭)
        redisson.shutdown();
    }
}

特性说明:

  • 可重入性:同一线程可多次获取同一把锁,不会死锁。
  • 自动续约:若业务执行时间超过锁的过期时间,Redisson 会自动延长锁的有效期(看门狗机制)。
  • 公平锁:通过 redisson.getFairLock("key") 获取公平锁,按请求顺序获取锁,避免饥饿。
2. 分布式对象(如字符串、映射)

Redisson 提供了与 Java 集合类相似的分布式对象接口,操作简单。

import org.redisson.api.RMap;
import org.redisson.api.RString;
import org.redisson.api.RedissonClient;

public class DistributedObjectExample {
    public static void main(String[] args) {
        RedissonClient redisson = RedissonConfig.getRedissonClient();
        
        // 1. 分布式字符串(类似 Redis 的 String)
        RString str = redisson.getString("user_name");
        str.set("zhangsan");
        System.out.println("获取字符串值:" + str.get());
        
        // 2. 分布式映射(类似 Redis 的 Hash)
        RMap<String, Object> userMap = redisson.getMap("user:1001");
        userMap.put("name", "张三");
        userMap.put("age", 25);
        userMap.put("gender", "男");
        System.out.println("获取用户姓名:" + userMap.get("name"));
        System.out.println("用户所有属性:" + userMap.readAllMap());
        
        redisson.shutdown();
    }
}
3. 分布式集合(如列表、集合、有序集合)
import org.redisson.api.RList;
import org.redisson.api.RSet;
import org.redisson.api.RedissonClient;

public class DistributedCollectionExample {
    public static void main(String[] args) {
        RedissonClient redisson = RedissonConfig.getRedissonClient();
        
        // 1. 分布式列表(类似 Redis 的 List)
        RList<String> list = redisson.getList("product_ids");
        list.add("p1001");
        list.add("p1002");
        list.add("p1003");
        System.out.println("列表元素:" + list);
        System.out.println("获取索引 1 的元素:" + list.get(1));
        
        // 2. 分布式集合(类似 Redis 的 Set,去重)
        RSet<String> set = redisson.getSet("tag_set");
        set.add("java");
        set.add("redis");
        set.add("java"); // 重复元素不会被添加
        System.out.println("集合元素:" + set);
        
        redisson.shutdown();
    }
}
4. 分布式计数器
import org.redisson.api.RAtomicLong;
import org.redisson.api.RedissonClient;

public class CounterExample {
    public static void main(String[] args) {
        RedissonClient redisson = RedissonConfig.getRedissonClient();
        
        // 分布式原子长整型(计数器)
        RAtomicLong counter = redisson.getAtomicLong("order_count");
        
        // 初始值设为 0
        counter.set(0);
        
        // 自增 1(返回自增后的值)
        long count1 = counter.incrementAndGet();
        System.out.println("自增后:" + count1); // 输出 1
        
        // 自增 5
        long count2 = counter.addAndGet(5);
        System.out.println("再增 5 后:" + count2); // 输出 6
        
        redisson.shutdown();
    }
}
5. 布隆过滤器(解决缓存穿透)
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;

public class BloomFilterExample {
    public static void main(String[] args) {
        RedissonClient redisson = RedissonConfig.getRedissonClient();
        
        // 创建布隆过滤器(预计元素量 100000,误判率 0.01)
        RBloomFilter<String> bloomFilter = redisson.getBloomFilter("user_id_filter");
        bloomFilter.tryInit(100000, 0.01);
        
        // 添加有效用户 ID
        bloomFilter.add("1001");
        bloomFilter.add("1002");
        bloomFilter.add("1003");
        
        // 测试判断
        System.out.println("1001 是否存在?" + bloomFilter.contains("1001")); // true
        System.out.println("2000 是否存在?" + bloomFilter.contains("2000")); // false(大概率)
        
        redisson.shutdown();
    }
}

三、高级特性

1. 读写锁(ReadWriteLock)

适合 “读多写少” 场景,允许多个读操作同时进行,写操作独占锁:

import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;

public class ReadWriteLockExample {
    public static void main(String[] args) {
        RedissonClient redisson = RedissonConfig.getRedissonClient();
        RReadWriteLock rwLock = redisson.getReadWriteLock("data_rw_lock");
        
        // 读锁(多个线程可同时获取)
        rwLock.readLock().lock();
        // 执行读操作...
        rwLock.readLock().unlock();
        
        // 写锁(独占,其他读/写锁需等待)
        rwLock.writeLock().lock();
        // 执行写操作...
        rwLock.writeLock().unlock();
        
        redisson.shutdown();
    }
}
2. 信号量(Semaphore)

用于控制并发访问的资源数量:

import org.redisson.api.RSemaphore;
import org.redisson.api.RedissonClient;

public class SemaphoreExample {
    public static void main(String[] args) throws InterruptedException {
        RedissonClient redisson = RedissonConfig.getRedissonClient();
        RSemaphore semaphore = redisson.getSemaphore("resource_semaphore");
        
        // 设置资源数量为 3(最多 3 个线程同时访问)
        semaphore.trySetPermits(3);
        
        // 获取资源(若资源不足则阻塞)
        semaphore.acquire();
        // 执行操作...
        // 释放资源
        semaphore.release();
        
        redisson.shutdown();
    }
}

四、注意事项

  1. 客户端单例:RedissonClient 是线程安全的,建议全局只创建一个实例,避免频繁创建销毁。
  2. 异常处理:锁操作需在 finally 中释放,避免死锁。
  3. Redis 版本兼容:Redisson 3.x 需 Redis 2.8 及以上版本,建议使用 Redis 5.0+ 以获得更好性能。
  4. 集群配置:生产环境优先使用 Redis 集群 + Redisson 集群模式,保证高可用。
  5. 性能调优:根据业务场景调整连接池大小、锁超时时间等参数,避免资源浪费或性能瓶颈。

总结

Redisson 封装了 Redis 的底层操作,提供了贴近 Java 原生 API 的分布式工具,尤其在分布式锁、分布式集合等场景中表现优异。通过本教程的示例,可快速上手 Redisson 的核心功能,实际应用中需结合业务需求选择合适的组件和配置。

更多推荐