Redis作为内存数据库的标杆,在Java开发中的运用就像咖啡与咖啡伴侣的关系。本文将带您用最接地气的方式,通过Jedis客户端实现Redis五大核心数据结构的完整操作,并附赠踩坑经验大礼包。


一、准准备战斗装备

1.1 环境配置

选用Jedis 4.0+与Redis 6.2,Maven配置如下:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.3.0</version>
</dependency>

1.2 连接工厂

public class RedisWarrior {
    private static final JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
    
    public static Jedis getSword() {
        return jedisPool.getResource();
    }
}

注意每个操作后必须调用jedis.close()释放连接,就像用完马桶要冲水一样重要。


二、五大绝世武功拆解

2.1 字符串(String)—— 万般皆下品

经典场景:缓存系统、计数器、分布式锁

Jedis jedis = RedisWarrior.getSword();
try {
    // 储存用户会话(带过期时间)
    jedis.setex("user:1001:session", 3600, "a1b2c3d4");
    
    // 原子递增(计数器场景)
    Long productViews = jedis.incr("product:9527:views");
    
    // 批量操作(比单条执行快10倍)
    jedis.mset("config:color", "blue", "config:size", "large");
} finally {
    jedis.close();
}

2.2 哈希(Hash)—— 对象收纳大师

最适合场景:用户信息存储、商品属性管理

Map<String, String> userData = new HashMap<>();
userData.put("name", "李雷");
userData.put("vipLevel", "5");
userData.put("lastLogin", "2023-07-20");

jedis.hset("user:1001", userData);  // 整体写入
jedis.hincrBy("user:1001", "vipLevel", 1);  // 字段递增
String userName = jedis.hget("user:1001", "name");  // 精准获取

2.3 列表(List)—— 消息队列高手

典型应用:最新消息排行、异步队列处理

// 微博推送场景
jedis.lpush("user:1001:feed", "王红点赞了你的照片","系统消息:会员续费成功");
List<String> latestFeed = jedis.lrange("user:1001:feed", 0, 4);

// 阻塞队列实现
List<String> messages = jedis.blpop(30, "order:queue");

2.4 集合(Set)—— 唯快不破

杀手锏场景:共同好友计算、标签系统

// 用户标签系统
jedis.sadd("user:1001:tags", "科技", "数码", "极限运动");
jedis.sadd("user:1002:tags", "美食", "数码");

// 寻找共同兴趣
Set<String> commonTags = jedis.sinter("user:1001:tags", "user:1002:tags");

2.5 有序集合(ZSet)—— 精确制导

看家本领:排行榜系统、延迟队列

// 游戏排行榜
jedis.zadd("leaderboard", 3500, "PlayerA");
jedis.zadd("leaderboard", 4200, "PlayerB");
Set<String> topPlayers = jedis.zrevrange("leaderboard", 0, 9);

// 带分数范围查询
Set<Tuple> players = jedis.zrangeByScoreWithScores("leaderboard", 3000, 5000);

三、军师锦囊妙计

3.1 应用场景分析

  • 字符串:简单值存储(命中率98%的缓存场景)
  • 哈希:对象序列化存储(比JSON字符串更省内存)
  • 列表:实时性要求高的消息流(替代Kafka的轻量方案)
  • 集合:需要去重的数据集(比数据库DISTINCT快100倍)
  • 有序集合:需要排序的热点数据(比MySQL排序快1000倍)

3.2 技术优劣势对比

数据结构 优势场景 使用陷阱
字符串 简单KV存储 大Value影响性能
哈希 对象属性管理 单个Hash不宜超过5000字段
列表 时序性数据 长列表遍历性能差
集合 快速去重 无序特性限制使用
ZSet 范围查询 内存消耗较大

3.3 老兵经验

  1. 管道技术提升10倍吞吐量:
Pipeline pipeline = jedis.pipelined();
pipeline.set("cache1", "value1");
pipeline.incr("counter");
pipeline.sync();
  1. Lua脚本实现原子操作:
local stock = tonumber(redis.call('GET', KEYS[1]))
if stock > 0 then
    redis.call('DECR', KEYS[1])
    return 1
end
return 0
  1. 内存优化三原则
  • 字符串值不超过10KB
  • 集合元素控制在1万以内
  • 使用ziplist编码的哈希字段不超过512个

四、战后总结报告

通过本文实战可以看出,不同的Redis数据结构就像瑞士军刀的不同工具。字符串操作简单如匕首,哈希像多功能钳,列表似军刀主刃,集合犹如锋利的剪刀,ZSet则是精密的镊子。Jedis提供了直连和连接池两种模式,建议生产环境使用连接池配置,就像特种部队需要稳定的后勤补给。

关键点回顾:

  1. 哈希结构存储对象可节省30%内存
  2. 列表实现消息队列比数据库快100倍
  3. ZSet范围查询响应时间在10ms内
  4. 管道技术提升吞吐量的代价是原子性缺失