Java与Redis的结合是现代高性能应用开发中的常见实践,Redis作为内存数据库,以其高性能、丰富的数据结构和持久化支持,成为Java应用中缓存、会话管理、消息队列等场景的首选,本文将详细介绍Java中操作Redis的常用命令及其实现方式,包括Jedis、Lettuce等客户端库的使用,并结合具体场景说明命令的应用。

在Java中操作Redis,首先需要引入Redis客户端库,常用的有Jedis和Lettuce,其中Jedis是较为传统的实现,基于BIO模型;Lettuce基于Netty,是NIO模型,支持异步和非阻塞操作,更适合高并发场景,以Maven项目为例,引入依赖如下:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.3.1</version> </dependency>
连接Redis服务器后,即可执行各类Redis命令,以下是按数据类型分类的常用命令及Java实现示例:
键(Key)操作
键是Redis中最基本的数据单元,常用命令包括设置键值、获取键值、删除键、检查键是否存在、设置过期时间等。
命令 | Java实现(Jedis) | 说明 |
---|---|---|
SET | jedis.set("key", "value") |
设置键值对 |
GET | jedis.get("key") |
获取键对应的值 |
DEL | jedis.del("key") |
删除键 |
EXISTS | jedis.exists("key") |
检查键是否存在 |
EXPIRE | jedis.expire("key", 60) |
设置键的过期时间(秒) |
TTL | jedis.ttl("key") |
获取键的剩余过期时间(秒) |
示例代码:

Jedis jedis = new Jedis("localhost", 6379); jedis.set("username", "java_redis"); String value = jedis.get("username"); System.out.println(value); // 输出: java_redis jedis.expire("username", 10); // 10秒后过期 Long ttl = jedis.ttl("username"); System.out.println(ttl); // 输出剩余时间 jedis.close();
字符串(String)操作
字符串是Redis最简单的数据类型,除了基本的GET/SET,还支持数值递增/递减、批量操作等。
命令 | Java实现 | 说明 |
---|---|---|
INCR | jedis.incr("count") |
将键值加1(值必须为数字) |
DECR | jedis.decr("count") |
将键值减1 |
INCRBY | jedis.incrBy("count", 5) |
将键值增加指定值 |
MSET | jedis.mset("key1", "v1", "key2", "v2") |
批量设置键值 |
MGET | jedis.mget("key1", "key2") |
批量获取键值 |
哈希(Hash)操作
哈希是键值对的集合,适合存储对象类型数据,如用户信息、商品属性等。
命令 | Java实现 | 说明 |
---|---|---|
HSET | jedis.hset("user:1", "name", "Alice") |
设置哈希字段值 |
HGET | jedis.hget("user:1", "name") |
获取哈希字段值 |
HGETALL | jedis.hgetAll("user:1") |
获取哈希所有字段和值 |
HDEL | jedis.hdel("user:1", "name") |
删除哈希字段 |
HEXISTS | jedis.hexists("user:1", "name") |
检查哈希字段是否存在 |
列表(List)操作
列表是字符串的有序集合,常用于实现消息队列、最新列表等场景。
命令 | Java实现 | 说明 |
---|---|---|
LPUSH | jedis.lpush("messages", "msg1", "msg2") |
从左侧插入元素 |
RPUSH | jedis.rpush("messages", "msg3") |
从右侧插入元素 |
LPOP | jedis.lpop("messages") |
从左侧弹出元素 |
RPOP | jedis.rpop("messages") |
从右侧弹出元素 |
LRANGE | jedis.lrange("messages", 0, -1) |
获取列表指定范围元素 |
集合(Set)操作
集合是无序的唯一元素集合,常用于去重、标签系统等。

命令 | Java实现 | 说明 |
---|---|---|
SADD | jedis.sadd("tags", "java", "redis") |
添加元素到集合 |
SMEMBERS | jedis.smembers("tags") |
获取集合所有元素 |
SREM | jedis.srem("tags", "java") |
从集合删除元素 |
SISMEMBER | jedis.sismember("tags", "redis") |
检查元素是否在集合中 |
有序集合(ZSet)操作
有序集合是带分数的唯一元素集合,常用于排行榜、范围查询等。
命令 | Java实现 | 说明 |
---|---|---|
ZADD | jedis.zadd("scores", 95, "Alice") |
添加元素及分数 |
ZRANGE | jedis.zrange("scores", 0, -1) |
按分数升序获取元素 |
ZREVRANGE | jedis.zrevrange("scores", 0, -1) |
按分数降序获取元素 |
ZSCORE | jedis.zscore("scores", "Alice") |
获取元素分数 |
Java高级操作:管道与事务
在批量操作时,使用管道(Pipeline)可以减少网络往返时间,提高性能;事务(Transaction)可以保证一组命令的原子性。
管道示例:
Jedis jedis = new Jedis("localhost", 6379); Pipeline pipeline = jedis.pipelined(); pipeline.set("key1", "v1"); pipeline.set("key2", "v2"); pipeline.get("key1"); pipeline.sync(); // 执行所有命令 jedis.close();
事务示例:
Transaction tx = jedis.multi(); tx.set("key1", "v1"); tx.set("key2", "v2"); List<Object> result = tx.exec(); // 执行事务
相关问答FAQs
Q1: 如何在Spring Boot中集成Redis?
A1: 在Spring Boot中,可以通过spring-boot-starter-data-redis
依赖集成Redis,首先添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
然后在配置文件application.yml
中配置Redis连接:
spring: redis: host: localhost port: 6379 password: # 如果有密码
最后通过@Autowired
注入RedisTemplate
或StringRedisTemplate
操作Redis:
@Autowired private StringRedisTemplate redisTemplate; redisTemplate.opsForValue().set("key", "value");
Q2: Redis如何处理缓存穿透、缓存击穿和缓存雪崩?
A2:
- 缓存穿透:查询不存在的数据导致请求直达数据库,解决方案:缓存空值(如设置
null
值并设置短期过期时间);使用布隆过滤器过滤无效请求。 - 缓存击穿:热点key过期时大量请求直达数据库,解决方案:互斥锁(如Redis的SETNX);热点key永不过期,通过后台线程更新。
- 缓存雪崩:大量key同时过期或Redis宕机导致数据库压力激增,解决方案:设置随机过期时间避免同时失效;集群部署Redis保证高可用;限流降级(如使用Hystrix或Sentinel)。