百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redisson使用注意

mhr18 2025-08-03 06:09 4 浏览 0 评论

使用 **Redisson** 作为 Redis 客户端时,需要注意以下几点,以确保代码的稳定性、性能和可维护性:

---

## 1. **线程安全与连接池配置**

Redisson 的 `RedissonClient` 是线程安全的,可以在多个线程中共享使用。

### 建议配置连接池:

```yaml

# redisson-config.yml

singleServerConfig:

address: "redis://127.0.0.1:6379"

password: null

database: 0

connectionPoolSize: 64 # 连接池大小

connectionMinimumIdleSize: 24

idleConnectionTimeout: 10000

connectTimeout: 10000

timeout: 3000

retryAttempts: 3

retryInterval: 1500

```

### 使用方式:

```java

@Configuration

public class RedissonConfig {

@Bean

public RedissonClient redissonClient() {

Config config = Config.fromYAML(getClass().getResourceAsStream("/redisson-config.yml"));

return Redisson.create(config);

}

}

```

---

## 2. **资源释放与生命周期管理**

- `RedissonClient` 实例在整个应用生命周期中只需创建一次,**不要频繁创建和关闭**。

- 应用关闭时应优雅关闭 Redisson 客户端:

```java

@PreDestroy

public void destroy() {

if (redissonClient != null) {

redissonClient.shutdown();

}

}

```

---

## 3. **使用 RBucket 获取和设置数据**

### 示例:

```java

@Autowired

private RedissonClient redissonClient;

public String get(String key) {

RBucket<String> bucket = redissonClient.getBucket(key);

return bucket.get();

}

public void set(String key, String value) {

RBucket<String> bucket = redissonClient.getBucket(key);

bucket.set(value);

}

```

---

## 4. **使用 RMap 缓存对象结构数据**

如果你要存储 JSON 对象,可以使用 `RMap`:

```java

public void saveUserInfo(String key, UserInfoVo userInfo) {

RMap<String, Object> map = redissonClient.getMap(key);

map.putAll(userInfoToMap(userInfo));

map.expire(30, TimeUnit.MINUTES); // 设置过期时间

}

private Map<String, Object> userInfoToMap(UserInfoVo vo) {

Map<String, Object> result = new HashMap<>();

result.put("userId", vo.getUserId());

result.put("username", vo.getUsername());

result.put("orgId", vo.getOrgId());

result.put("roleId", vo.getRoleId());

return result;

}

```

---

## 5. **分布式锁的使用**

Redisson 提供了强大的分布式锁实现:

```java

RLock lock = redissonClient.getLock("lockKey");

try {

if (lock.tryLock()) {

// 执行业务逻辑

}

} finally {

lock.unlock();

}

```

---

## 6. **JSON 序列化/反序列化**

Redisson 默认使用 `Jackson`,但你也可以自定义序列化方式。

### 示例:使用 Jackson 解析 JSON

```java

ObjectMapper objectMapper = new ObjectMapper();

public <T> T getJson(String key, Class<T> clazz) throws JsonProcessingException {

String json = get(key);

return json == null ? null : objectMapper.readValue(json, clazz);

}

public <T> void setJson(String key, T value) throws JsonProcessingException {

String json = objectMapper.writeValueAsString(value);

set(key, json);

}

```

---

## 7. **异常处理**

Redisson 操作可能抛出异常(如 Redis 连接失败),应合理捕获并处理:

```java

try {

String value = get("user:1001");

} catch (Exception e) {

// 记录日志、重试或返回默认值

log.error("Redisson 获取数据失败", e);

}

```

---

## 8. **性能优化建议**

- **避免频繁访问 Redis**:可以结合本地缓存(如 Caffeine)做二级缓存。

- **使用异步方法**:Redisson 支持异步操作(如 `getAsync`, `putAsync`),适用于高并发场景。

- **设置合理的 TTL**:避免 Redis 内存无限增长。

---

## 9. **集群和哨兵支持**

Redisson 支持 Redis 集群、哨兵模式等高级用法:

```yaml

clusterServersConfig:

nodes:

- "redis://192.168.1.1:6379"

- "redis://192.168.1.2:6379"

password: null

```

---

## 10. **日志与监控**

- 开启 Redisson 的日志输出,方便排查问题。

- 可集成 Prometheus + Grafana 监控 Redisson 客户端状态(连接数、等待线程数等)。

---

## 总结:使用 Redisson 的最佳实践

| 项目 | 建议 |

|------|------|

| 客户端管理 | 单例模式,整个应用共享一个 `RedissonClient` |

| 线程安全 | 不需要额外同步,RedissonClient 是线程安全的 |

| 资源释放 | 应用关闭时调用 [shutdown()](file://D:\develop\prod\Dealer-base-service\dealer-modules\dealer-manager\src\main\java\com\yili\dealer\utils\ThreadPoolUtil.java#L61-L65) |

| 分布式锁 | 使用 `RLock` 实现 |

| 数据结构 | 优先使用 `RBucket`, `RMap`, `RList` 等封装 |

| 序列化 | 使用 Jackson,避免使用默认的 JDK 序列化 |

| 异常处理 | 捕获 Redis 异常并做降级处理 |

| 性能优化 | 设置连接池、合理使用 TTL 和本地缓存 |

| 集群支持 | 使用 `clusterServersConfig` 配置 Redis 集群 |

| 日志监控 | 集成日志系统和监控平台 |

---

如果你希望我帮你:

- 封装通用的 Redisson 工具类

- 实现基于 Redisson 的用户登录状态管理

- 实现 Redisson 分布式锁的封装

- 实现 Redisson + Spring Boot 的自动配置

欢迎继续提问!

相关推荐

Java面试题及答案总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Redis、Linux、SpringBoot、Spring、MySQ...

Java面试题及答案最全总结(2025春招版)

大家好,我是Java面试分享最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Spring...

Java面试题及答案最全总结(2025版持续更新)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

蚂蚁金服面试题(附答案)建议收藏:经典面试题解析

前言最近编程讨论群有位小伙伴去蚂蚁金服面试了,以下是面试的真题,跟大家一起来讨论怎么回答。点击上方“捡田螺的小男孩”,选择“设为星标”,干货不断满满1.用到分布式事务嘛?为什么用这种方案,有其他方案...

测试工程师面试必问的十道题目!全答上来的直接免试

最近参加运维工程师岗位的面试,笔者把自己遇到的和网友分享的一些常见的面试问答收集整理出来了,希望能对自己和对正在准备面试的同学提供一些参考。一、Mongodb熟悉吗,一般部署几台?部署过,没有深入研究...

10次面试9次被刷?吃透这500道大厂Java高频面试题后,怒斩offer

很多Java工程师的技术不错,但是一面试就头疼,10次面试9次都是被刷,过的那次还是去了家不知名的小公司。问题就在于:面试有技巧,而你不会把自己的能力表达给面试官。应届生:你该如何准备简历,面试项目和...

java高频面试题整理

【高频常见问题】1、事务的特性原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。一致性或可串性:事务的执行使得数据库从一种正确状态转换成另一种正确状态隔离性:在事务正确提交之前,不允许把该...

2025 年最全 Java 面试题,京东后端面试面经合集,答案整理

最近京东搞了个TGT计划,针对顶尖青年技术天才,直接宣布不设薪资上限。TGT计划面向范围包括2023年10月1日到2026年9月30日毕业的海内外本硕博毕业生。时间范围还...

idGenerator测评

工作中遇到需要生成随机数的需求,看了一个个人开发的基于雪花算法的工具,今天进行了一下测评(测试)。idGenerator项目地址见:https://github.com/yitter/IdGenera...

2024年开发者必备:MacBook Pro M1 Max深度体验与高效工作流

工作机器我使用的是一台16英寸的MacBookProM1Max。这台电脑的表现堪称惊人!它是我用过的最好的MacBook,短期内我不打算更换它。性能依然出色,即使在执行任务时也几乎听不到风扇的...

StackOverflow 2022 年度调查报告

一个月前,StackOverflow开启了2022年度开发者调查,历时一个半月,在6月22日,StackOverflow正式发布了2022年度开发者调查报告。本次报告StackO...

这可能是最全面的SpringDataMongoDB开发笔记

MongoDB数据库,在最近使用越来越广泛,在这里和Java的开发者一起分享一下在Java中使用Mongodb的相关笔记。希望大家喜欢。关于MongoDB查询指令,请看我的上一篇文章。SpringD...

Mac M2 本地部署ragflow

修改配置文件Dockerfile文件ARGNEED_MIRROR=1//开启国内镜像代理docker/.envREDIS_PORT=6380//本地redis端口冲突RAGFLOW_IMA...

别再傻傻分不清!localhost、127.0.0.1、本机IP,原来大有讲究!

调试接口死活连不上?部署服务队友访问不了?八成是localhost、127.0.0.1、本机IP用混了!这三个看似都指向“自己”的东西,差之毫厘谬以千里。搞不清它们,轻则调试抓狂,重则服务裸奔。loc...

我把 Mac mini 托管到机房了:一套打败云服务器的终极方案

我把我积灰的Macmini托管到机房了,有图有真相。没想到吧?一台在家吃灰的苹果电脑,帮我省了大钱!对,就是控制了自己的服务器,省了租用云服务器的钱,重要数据还全捏在自己手里,这感觉真爽。你可...

取消回复欢迎 发表评论: