跳转至

lettuce 7.1.0.RELEASE

为什么要使用Lettuce

想象一下这个场景:深夜,你的服务器监控仪表盘突然飙红,每秒数万次的Redis操作让连接池不堪重负,线程在无尽的等待和超时中挣扎。隔壁团队的“性能狂人”又在鼓吹他基于最新异步框架手写的客户端,代码复杂得像一座迷宫,而你的“稳定至上”派系则死死守着那个老旧的、同步阻塞的驱动,虽然缓慢,但至少不会半夜宕机。

这,就是许多开发者在选择Redis Java客户端时面临的经典矛盾:在极致性能与可靠稳定之间,你是否必须二选一?

答案是否定的。这就是你该选择Lettuce的时刻。它并非又一个激进的实验品,也不是一个笨重的老古董。Lettuce是一位清醒的颠覆者,它用纯异步、非阻塞的Netty内核,为你带来风暴般的吞吐量,却将复杂的线程管理与连接池烦恼一并抹去。它支持从Redis 2.6到8.x的全栈协议,让你在拥抱Redis最新功能(如Redis Streams、集群、哨兵)时毫无后顾之忧。更重要的是,它的API既富有表达力又直观,将你从繁琐的底层通信中解放出来,专注于业务逻辑本身。

选择Lettuce,意味着你拒绝在性能与稳定之间妥协。你选择了一条更优雅的道路:在风暴中心,享受宁静。

Lettuce是什么

简而言之,Lettuce是一个**高级的、可扩展的Redis Java客户端**。

它构建于Netty之上,天生支持异步、非阻塞通信,同时提供了同步、异步和响应式(Reactive)API。它就像一把为Redis量身定制的瑞士军刀,支持集群、哨兵、管道、发布订阅、事务、数据序列化等所有核心与高级功能,让你能够以高效、可靠的方式与Redis进行交互。

入门示例

让我们置身于一个真实的场景:一个正在经历“秒杀”活动的电商平台。瞬时涌入的海量请求需要快速缓存商品库存,并确保扣减的准确性。

1. 添加依赖(以Maven为例)

<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>7.1.0.RELEASE</version>
</dependency>

2. 连接Redis并执行操作

import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.sync.RedisCommands;

public class SeckillService {
    public static void main(String[] args) {
        // 1. 创建RedisClient。这里连接单机Redis,也支持 RedisURI 构建集群或哨兵连接。
        RedisClient client = RedisClient.create("redis://localhost:6379/0");

        // 2. 获取一个线程安全的连接
        StatefulRedisConnection<String, String> connection = client.connect();

        // 3. 获取同步命令接口。你也可以获取 .async() 或 .reactive() 接口。
        RedisCommands<String, String> commands = connection.sync();

        // 模拟秒杀:设置商品库存,并使用原子操作扣减
        String productKey = "seckill:stock:product_1001";

        // 初始化库存
        commands.set(productKey, "1000");

        // 用户抢购时,使用 DECR 原子扣减库存
        Long remainingStock = commands.decr(productKey);

        if (remainingStock >= 0) {
            System.out.println("抢购成功!剩余库存:" + remainingStock);
            // ... 后续订单处理逻辑
        } else {
            // 库存已扣为负数,说明已售罄,需要回滚刚才的扣减
            commands.incr(productKey);
            System.out.println("抢购失败,商品已售罄。");
        }

        // 4. 关闭连接和客户端
        connection.close();
        client.shutdown();
    }
}
这个示例展示了Lettuce的核心使用模式:创建客户端 -> 获取连接 -> 执行命令。在秒杀的高并发压力下,Lettuce的异步非阻塞特性可以更高效地处理网络I/O,而其丰富的原子命令(如DECR)是保证数据一致性的关键。

Lettuce 7.1.0.RELEASE版本更新了什么

Lettuce 7.1.0 主要围绕支持即将发布的 Redis 8.4 新特性进行更新。它新增了对 XREADGROUP 命令中 CLAIM 参数的支持,便于更好地处理Pending状态的流消息。同时,引入了 MSETEX 命令,用于原子性地设置多个键值对并指定过期时间。此外,还通过扩展 DIGESTDELEXSET 命令,实现了字符串键的原子比较并设置(CAS)与比较并删除(CAD)操作。本次更新也正式将 Redis 8.4 加入测试矩阵并设为默认版本,并修复了若干Bug。

更新日志

Lettuce 团队很高兴地宣布 Lettuce 7.1.0 小版本发布!

此版本提供了对即将成为 Redis 8.4 版本一部分的新功能的支持,例如在 XREADGROUP 命令中使用 CLAIM 参数;使用 MSETEX 原子地设置多个字符串键并更新其过期时间,以及通过扩展 DIGESTDELEXSET 命令对字符串键进行原子的比较并设置(CAS)和比较并删除(CAD)操作。

Lettuce 7.1.0 支持从 Redis 2.6+ 到 Redis 8.x 的版本。在 Java 运行环境方面,Lettuce 至少需要 Java 8,并兼容 Java 24。该驱动已在 Redis 8.4、8.2、8.0、7.4 和 7.2 版本上通过测试。

完整的更新日志请见本文档末尾。

感谢所有使 Lettuce 7.1.0.RELEASE 成为可能的贡献者。

📗 链接 * 参考文档:https://lettuce.io/core/7.1.0.RELEASE/reference/ * Javadoc:https://lettuce.io/core/7.1.0.RELEASE/api/

⭐ 新功能

  • 添加对 XREADGROUP CLAIM 参数的支持
  • 添加对 CAS/CAD(比较并设置/比较并删除)的支持
  • 实现 msetex 命令

🐞 Bug 修复

  • 在解析 SearchReplies 时保留空值
  • 将官方 Redis 8.4 添加到测试矩阵并设其为默认版本
  • 修复 io_uring 类名
  • 减少设置跟踪标签所消耗的 CPU 周期

💡 其他

**❤️ 新贡献