Java连接Redis操作SortedSet及端口占用问题解决

2026-07-26 12:59:00 26 次阅读

在基于Java的高并发系统开发中,引入Redis已经成为常见方案,尤其是在缓存、排行榜和延时队列等场景中表现突出。Java应用通常通过Jedis或Lettuce客户端与Redis进行交互,其中SortedSet(有序集合,也称ZSet)是最常用的数据结构之一,用于实现排行榜、优先级队列等功能。

在Java中连接Redis时,首先需要确认客户端依赖。以Lettuce为例,在Spring Boot项目中引入依赖后,通过配置Redis连接工厂即可完成基础连接。

Java
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory("127.0.0.1", 6379);
}

连接成功后,开发者即可使用RedisTemplate操作数据结构,其中SortedSet的核心命令包括ZADD、ZRANGE、ZREM等。

Redis SortedSet的核心应用场景

SortedSet的本质是“带权重的集合”,每个元素都会绑定一个score,Redis会根据score进行自动排序。这种特性使其在以下场景中非常高效:

  1. 实时排行榜系统(如游戏积分榜)

  2. 热门文章排序(点击量、点赞数)

  3. 延迟任务队列(通过score表示时间戳)

  4. 优先级调度系统

在Java中使用RedisTemplate操作SortedSet如下:

Java
@Autowired
private RedisTemplate<String, Object> redisTemplate;

public void addScore(String key, String member, double score) {
redisTemplate.opsForZSet().add(key, member, score);
}

public Set<Object> getTop(String key, int start, int end) {
return redisTemplate.opsForZSet().reverseRange(key, start, end);
}

通过reverseRange可以实现从高分到低分的排序查询,非常适合排行榜展示。

SortedSet常用命令解析

在底层Redis中,SortedSet的常用命令如下:

  • ZADD:添加元素并设置score

  • ZINCRBY:增加某个成员的分值

  • ZRANGE:按分值从小到大获取区间数据

  • ZREVRANGE:按分值从大到小获取数据

  • ZREM:删除成员

这些命令在Java中都可以通过RedisTemplate或直接使用Jedis API调用。


Java连接Redis时的端口占用问题

在实际部署或本地开发中,经常会遇到Redis默认端口6379被占用的情况,这会导致Java连接失败,常见报错包括:

  • Address already in use

  • Connection refused

  • Could not connect to Redis at 127.0.0.1:6379

造成该问题的原因通常是:

  1. 已经有Redis实例在运行

  2. 其他中间件占用了6379端口

  3. 多个项目重复启动Redis服务

排查端口占用

在Linux或Mac环境下,可以使用以下命令查看端口占用情况:

Bash
lsof -i :6379

或:

Bash
netstat -tunlp | grep 6379

在Windows环境下,可以使用:

Bash
netstat -ano | findstr 6379

找到对应PID后,可以选择终止进程:

Bash
kill -9 PID

修改Redis默认端口解决冲突

如果不想关闭占用进程,可以直接修改Redis配置文件:

conf
port 6380

同时在Java连接配置中同步修改端口:

Java
new LettuceConnectionFactory("127.0.0.1", 6380);

修改完成后重启Redis服务即可生效。


Spring Boot中Redis连接优化建议

在高并发场景下,仅仅能连接Redis是不够的,还需要优化连接池配置,避免连接耗尽:

YAML
spring:
redis:
host: 127.0.0.1
port: 6379
lettuce:
pool:
max-active: 20
max-idle: 10
min-idle: 5
max-wait: 3000ms

合理配置连接池可以显著提升系统稳定性,避免在高并发情况下出现连接阻塞。


SortedSet实战:排行榜设计思路

在实际业务中,SortedSet不仅仅是数据结构,更是一种轻量级排序引擎。例如游戏排行榜设计:

  • key:game:rank

  • member:userId

  • score:用户积分

每次用户得分变化时:

Java
redisTemplate.opsForZSet().incrementScore("game:rank", "user123", 10);

获取排行榜前10名:

Java
Set<Object> top10 = redisTemplate.opsForZSet().reverseRange("game:rank", 0, 9);

这种方式相比数据库排序查询性能更高,延迟更低。


在Java系统中合理使用Redis的SortedSet结构,并结合正确的端口管理方式,可以显著提升系统的并发能力与稳定性,同时避免开发和部署阶段常见的连接问题。