redis 系列(二)Redission使用

在Spring Boot中集成Redisson,可利用其提供的分布式数据结构和服务,以下是详细操作指南,涵盖依赖引入、配置、核心数据类型操作及分布式锁使用:

一、依赖引入

在Spring Boot项目的pom.xml文件中添加Redisson的依赖,推荐使用最新版本以获取最新功能和安全修复。示例如下:

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.30.0</version> <!-- 使用最新版本 -->
</dependency>

二、配置Redisson

1. 基础配置

application.ymlapplication.properties文件中配置Redis连接信息。如果使用默认配置,Redisson会自动读取Spring Boot的Redis配置。以下是一个简单的application.yml配置示例:

spring:
  redis:
    host: localhost
    port: 6379
    password: # 如果有密码则填写,无密码则省略
    database: 0 # 数据库索引,默认为0

2. 自定义配置

如果需要自定义Redisson配置(如连接池大小、超时时间等),可以创建一个配置类。以下是一个自定义配置类的示例:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RedissonConfig {

    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer()
                .setAddress("redis://localhost:6379")
                .setPassword("yourpassword") // 如果有密码则设置
                .setDatabase(0)
                .setConnectionPoolSize(64) // 最大连接数
                .setConnectionMinimumIdleSize(24) // 最小空闲连接数
                .setIdleConnectionTimeout(10000) // 空闲连接超时时间(毫秒)
                .setConnectTimeout(10000) // 连接超时时间(毫秒)
                .setTimeout(3000); // 命令执行超时时间(毫秒)
        return Redisson.create(config);
    }
}

三、核心数据类型操作

1. 字符串(String)

import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class StringService {

    @Autowired
    private RedissonClient redissonClient;

    public void setStringValue(String key, String value) {
        RBucket<String> bucket = redissonClient.getBucket(key);
        bucket.set(value);
    }

    public String getStringValue(String key) {
        RBucket<String> bucket = redissonClient.getBucket(key);
        return bucket.get();
    }
}

2. 集合(Set)

import org.redisson.api.RSet;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class SetService {

    @Autowired
    private RedissonClient redissonClient;

    public void addToSet(String key, String value) {
        RSet<String> set = redissonClient.getSet(key);
        set.add(value);
    }

    public boolean isInSet(String key, String value) {
        RSet<String> set = redissonClient.getSet(key);
        return set.contains(value);
    }
}

3. 列表(List)

import org.redisson.api.RList;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ListService {

    @Autowired
    private RedissonClient redissonClient;

    public void addToList(String key, String value) {
        RList<String> list = redissonClient.getList(key);
        list.add(value);
    }

    public String getFromList(String key, int index) {
        RList<String> list = redissonClient.getList(key);
        return list.get(index);
    }
}

4. 哈希(Hash)

import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class HashService {

    @Autowired
    private RedissonClient redissonClient;

    public void putToHash(String key, String field, String value) {
        RMap<String, String> map = redissonClient.getMap(key);
        map.put(field, value);
    }

    public String getFromHash(String key, String field) {
        RMap<String, String> map = redissonClient.getMap(key);
        return map.get(field);
    }
}

四、分布式锁使用

Redisson提供了分布式锁的功能,允许多个线程或多个应用程序在分布式环境中协调对共享资源的访问。以下是一个使用分布式锁的示例:

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;

@Service
public class LockService {

    @Autowired
    private RedissonClient redissonClient;

    public void performTaskWithLock(String lockKey) {
        RLock lock = redissonClient.getLock(lockKey);
        try {
            // 尝试获取锁,等待时间10秒,锁超时时间60秒
            boolean isLocked = lock.tryLock(10, 60, TimeUnit.SECONDS);
            if (isLocked) {
                try {
                    // 业务逻辑
                    System.out.println("锁定成功,执行任务");
                } finally {
                    lock.unlock();
                }
            } else {
                System.out.println("未能获取锁");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

五、注意事项

  1. 序列化问题:在使用Redisson时,需要注意对象的序列化问题。确保存储的对象实现了Serializable接口,或者使用Redisson提供的序列化编解码器(如JsonJacksonCodec)。
  2. 连接管理:合理配置连接池参数,以避免连接泄漏和性能问题。
  3. 异常处理:在使用分布式锁时,需要妥善处理异常,确保锁能够被正确释放。
  4. 版本兼容性:确保Redisson版本与Spring Boot版本兼容。
posted @ 2025-11-21 14:00  蓝迷梦  阅读(206)  评论(0)    收藏  举报