
数据库后端缓存【免费下载链接】lettuce-coreRedis Java client项目地址https://gitcode.com/gh_mirrors/le/lettuce-core点击查看免费下载Lettuce 是一个可扩展、线程安全的 Java Redis 客户端同时支持同步synchronous、异步asynchronous与响应式reactive三种执行模型底层基于 Netty 构建并原生支持 Sentinel、Cluster、Pipelining、自动重连及 Redis 数据模型等高级特性。阅读本文后你将能够完成 Lettuce 的依赖引入、连接创建与基础命令调用掌握同步/异步/响应式三种 API 的核心用法与差异并了解 Pub/Sub、RedisURI 连接配置以及如何从源码构建测试该项目。项目概览一个连接三种执行模型Lettuce 的核心设计理念是可扩展且线程安全。官方文档与 RedisClient 类源码 均明确指出多个线程可以共享同一条连接前提是这些线程避免阻塞型操作如BLPOP和事务型操作如MULTI/EXEC。从 pom.xml 可以看到本项目当前版本为7.9.0-SNAPSHOT底层依赖 Netty4.2.17.Final与 Reactor3.8.7这也是其能够同时提供阻塞式调用和响应式流Reactive Streams支持的基础。Lettuce 支持的核心能力包括同步、异步、响应式三种 API同一连接上通过sync()、async()、reactive()三个访问器切换执行模型互不冲突高可用方案Redis Sentinel、Redis Cluster连接安全与形态SSL / TLS、Unix Domain Socket流式 APIStreaming API以回调方式逐条消费大数据量结果编解码器Codecs自定义 key/value 的 UTF-8、二进制、JSON 等序列化表示动态命令接口Command Interfaces以类型安全的方式声明式调用 Redis 命令原生传输Native TransportsEpoll、Kqueue 等Redis 模块支持RediSearch、RedisJSON、Redis Vector Sets、Bloom Filter、TDigest、TopK、Cuckoo Filter 等兼容性兼容 Java 8以隐式自动模块方式提供无 module descriptor。引入依赖Maven 坐标与快照仓库Lettuce 的正式版本发布在 Maven Central 仓库。以 Maven 为例在pom.xml中添加如下依赖dependency groupIdio.lettuce/groupId artifactIdlettuce-core/artifactId versionx.y.z/version /dependency其中x.y.z替换为实际使用的发布版本号例如当前源码对应的主线版本为7.9.0-SNAPSHOT。如果你希望使用下一个大版本的每日构建快照可以使用 Sonatype 快照仓库并声明BUILD-SNAPSHOT版本dependency groupIdio.lettuce/groupId artifactIdlettuce-core/artifactId versionx.y.z.BUILD-SNAPSHOT/version /dependency repositories repository idsonatype-snapshots/id nameSonatype Snapshot Repository/name urlhttps://oss.sonatype.org/content/repositories/snapshots//url snapshots enabledtrue/enabled /snapshots /repository /repositories注意快照版本不稳定仅建议在尝鲜新特性或参与上游开发时使用生产环境请锁定 Maven Central 上的正式发布版本。基础用法同步 API 与连接生命周期Lettuce 的最基本用法只需要三步创建客户端、建立连接、获取命令 API 并执行命令。官方 README 给出了最精简的示例RedisClient client RedisClient.create(redis://localhost); StatefulRedisConnectionString, String connection client.connect(); RedisStringCommands sync connection.sync(); String value sync.get(key);更完整的写法含泛型与资源释放可以参照仓库中的官方示例 ConnectToRedis.java// Syntax: redis://[password]host[:port][/databaseNumber] // Syntax: redis://[username:password]host[:port][/databaseNumber] RedisClient redisClient RedisClient.create(redis://passwordlocalhost:6379/0); StatefulRedisConnectionString, String connection redisClient.connect(); // 通过 sync() 获取同步命令 API RedisStringCommandsString, String sync connection.sync(); String value sync.get(key); connection.close(); redisClient.shutdown();命令命名约定Lettuce 中每个 Redis 命令都由一个或多个方法实现方法名与 Redis 命令的小写名称完全一致。对于带多个修饰符、会改变结果类型的复杂命令其修饰符以驼峰形式拼接到命令名中例如zrangebyscore按分数区间返回成员zrangebyscoreWithScores同样命令但附带分数返回。也就是说方法名本身既是命令名也是结果形态的说明书。连接是昂贵的资源RedisClient 的类注释 特别提醒RedisClient是一种昂贵资源它持有 Netty 的EventLoopGroup内部使用多个线程。因此尽量复用同一个RedisClient实例或者在多个 client 实例之间共享一个ClientResources实例连接StatefulRedisConnection是线程安全的可被多线程共享详见 StatefulRedisConnection 接口。自动重连机制StatefulRedisConnection内部有一个ConnectionWatchdog监控每条连接在close()被调用之前会自动重连所有尚未完成的命令在重连成功后会重新发送。这正是 Lettuce 在故障场景下保持高可用的底层保障。异步 APIRedisFuture 与 LettuceFutures异步 API 通过connection.async()获得每个命令立即返回一个RedisFutureT继承自 JDK 的CompletionStage可以组合、编排而不会阻塞调用线程StatefulRedisConnectionString, String connection client.connect(); RedisStringAsyncCommandsString, String async connection.async(); RedisFutureString set async.set(key, value); RedisFutureString get async.get(key); // 等待多个 future 全部完成 LettuceFutures.awaitAll(set, get) true set.get() OK get.get() valueLettuceFutures 工具类LettuceFutures是异步编程的配套工具源码位于 LettuceFutures.java提供两个关键方法awaitAll(Duration timeout, Future?... futures)/awaitAll(long timeout, TimeUnit unit, Future?... futures)等待所有 future 在超时前完成若全部按时完成返回true否则返回false。超时时不会取消命令。awaitOrCancel(RedisFutureT cmd, long timeout, TimeUnit unit)等待单个命令完成超时则取消命令。仓库测试代码中也实际使用了该工具例如 RediSearchIntegrationTests.java 中的批量等待assertThat(LettuceFutures.awaitAll(Duration.ofSeconds(60), futures.toArray(new RedisFuture[0]))).isTrue();与Future.get()直接阻塞不同异步 API 的价值在于可以在等待 I/O 的同时做其他工作或将多个命令的结果通过thenApply、thenCombine等CompletionStage操作组合起来。详细的异步编程指南见 异步 API 文档。响应式 APIMono 与 Flux响应式 API 通过connection.reactive()获得基于 Reactor 的MonoT单个结果与FluxT流式多个结果StatefulRedisConnectionString, String connection client.connect(); RedisStringReactiveCommandsString, String reactive connection.reactive(); MonoString set reactive.set(key, value); MonoString get reactive.get(key); set.subscribe(); get.block() value响应式模型的核心特征是背压backpressure与订阅即执行MonoString set的创建并不立即发送命令只有subscribe()后命令才会真正执行。在真实应用中更推荐使用map、flatMap、zip等操作符组合多个命令并将最终结果交给上层订阅者消费。需要留意的是从 StatefulRedisConnection 的源码注释可知reactive()访问器自 7.8 起已被标记为Deprecated计划在未来大版本中由commands(CommandsFactory)配合RedisReactiveCommands#factory()取代在 Lettuce 7.x 中它仍可正常使用。响应式编程的完整讲解见 响应式 API 文档。Pub/Sub 发布订阅Lettuce 通过独立的 Pub/Sub 连接提供发布订阅能力。与普通连接不同Pub/Sub 连接需要先注册监听器Listener再订阅频道消息到达时由监听器回调RedisPubSubCommandsString, String connection client.connectPubSub().sync(); connection.getStatefulConnection().addListener(new RedisPubSubListenerString, String() { // 实现 message / subscribed / unsubscribed 等回调 }); connection.subscribe(channel);监听器回调接口RedisPubSubListener 定义了以下核心回调message(K channel, V message)收到普通频道消息message(K pattern, K channel, V message)收到模式pattern匹配的消息subscribed(K channel, long count)/psubscribed(K pattern, long count)订阅成功count 为当前订阅总数unsubscribed(K channel, long count)/punsubscribed(K pattern, long count)退订成功ssubscribed/sunsubscribed自 6.4 起新增的 Shard Channel 订阅/退订回调默认委托给subscribed/unsubscribed。订阅命令RedisPubSubCommands 接口 提供的订阅命令与 Redis 一一对应方法对应 Redis 命令说明subscribe(K... channels)SUBSCRIBE订阅指定频道unsubscribe(K... channels)UNSUBSCRIBE退订指定频道psubscribe(K... patterns)PSUBSCRIBE订阅匹配模式的频道punsubscribe(K... patterns)PUNSUBSCRIBE退订匹配模式的频道ssubscribe(K... shardChannels)SSUBSCRIBE订阅 Shard 频道6.4sunsubscribe(K... shardChannels)SUNSUBSCRIBE退订 Shard 频道6.4连接配置RedisURI 的创建与语法无论是 Standalone、Sentinel 还是 Cluster连接细节的统一载体都是RedisURI源码见 RedisURI.java它可以在其中携带数据库编号、客户端名、密码和超时等配置。RedisURI有三种创建方式// 1. 使用 URI 字符串 RedisURI.create(redis://localhost/); // 2. 使用 Builder RedisURI.Builder.redis(localhost, 6379).withPassword(password).withDatabase(1).build(); // 3. 直接构造实例 RedisURI uri new RedisURI(localhost, 6379, Duration.ofSeconds(60)); // 或 RedisURI uri new RedisURI(); uri.setHost(localhost);URI 语法RedisURI支持 Standalone、SSL、Unix Domain Socket、Sentinel 等多种连接形态其 URI 语法由源码注释明确定义Redis Standaloneredis://[[username:]password]host[:port][/database] [?[timeouttimeout[d|h|m|s|ms|us|ns]][databasedatabase] [clientNameclientName][libraryNamelibraryName][libraryVersionlibraryVersion] [verifyPeerNONE|CA|FULL]]Redis StandaloneSSL使用rediss://前缀语法同上。Redis StandaloneUnix Domain Socketredis-socket://[[username:]password]path [?[timeout...][databasedatabase][clientNameclientName]...]Redis Sentinelredis-sentinel://[[username:]password]host1[:port1][,host2[:port2]][,hostN[:portN]][/database] [?[timeout...][sentinelMasterIdsentinelMasterId][databasedatabase]...]支持的 Scheme 一览Scheme用途redisRedis StandaloneredissRedis Standalone SSLredis-socketRedis Standalone Unix Domain Socketredis-sentinelRedis Sentinelrediss-sentinelRedis Sentinel SSL源码中同时保留了redisssl、redistls等别名 Scheme 常量。超时单位URI 中的timeout参数支持多种时间单位后缀d天、h小时、m分钟、s秒、ms毫秒、us微秒、ns纳秒。使用要点database 优先级查询参数?后中的database优先级高于路径中的/databaseSentinel 认证URI 中的密码只作用于数据节点Sentinel 节点的认证需要对每个哨兵节点单独配置用户名Redis 6 起才支持用户名库名与库版本在 Redis 7.2 上会自动设置libraryName/libraryVersion默认取 LettuceVersion 中的版本信息。高级能力速览Redis Cluster 与 Sentinel集群场景使用RedisClusterClient源码同样提供同步/异步/响应式 API。集群客户端按命令首个 key 计算槽位并路由到对应节点维护集群分区视图。仓库官方示例 ConnectToRedisCluster.java 展示了基本连接方式。需要说明的是集群连接上不建议使用MULTI/EXEC/DISCARD等无 key 的事务命令——它们无法被分配到特定节点。Sentinel / 主从高可用场景参见 ha-sharding.md。流式 APIStreaming API对于结果集巨大的命令如SCAN、HGETALL的大批量数据Lettuce 提供StreamingChannel回调接口使数据以流的方式逐条输出避免一次性在内存中堆积。详见 streaming-api.md。Codecs 编解码器通过client.connect(RedisCodec)可传入自定义编解码器控制 key/value 在 UTF-8、二进制、JSON 等表示形式之间的转换。内置StringCodec、ByteArrayCodec、CompressionCodec、CipherCodec等见 codec 包。Codecs 的接入方式详见 integration-extension.md。动态命令接口Command Interfaces除 190 条内置命令外Lettuce 还允许你通过声明接口来自定义类型安全的命令调用减少样板代码。核心是Commands标记接口例如public interface KeyCommands extends Commands { String get(String key); String set(String key, String value); String set(String key, byte[] value); }接口中方法名即命令名、参数即命令参数、返回类型即结果形态。完整的声明式调用机制见 redis-command-interfaces.md。原生传输与 Redis 模块Epoll / Kqueue 原生传输可在 Linux/macOS 上获得更好的性能见 native-transports.md模块支持RediSearchredis-search.md、RedisJSONredis-json.md、Vector Setsvector-sets.md等相应命令构建器位于 search、json、vector 包下。从源码构建与测试Lettuce 使用 Apache Maven 构建。其测试需要多个运行中的 Redis 实例实例的启停通过仓库根目录的 Makefile 统一编排底层基于 Docker Compose测试环境定义见src/test/resources/docker-env/。当前源码默认测试目标是 Redis8.10同时支持8.12、8.8、8.6、8.4、8.2、8.0、7.4、7.2等版本见 Makefile。构建流程如下git clone https://gitcode.com/gh_mirrors/le/lettuce-core cd lettuce-core make start # 启动测试用 Redis 环境 make test # 运行构建与测试等价于 mvn -DskipITsfalse clean compile verify常用命令make test运行完整构建与测试make start手动启动 Redis 测试环境make stop手动停止 Redis 测试环境make clean清理构建产物。如果你已经有本地 Redis也可以直接使用 Maven 运行单元测试集成测试默认通过skipITs跳过见 pom.xml。结语Lettuce 以一个线程安全连接承载三种执行模型为核心设计覆盖了从单机、主从、哨兵到集群的完整 Redis 部署形态并提供 Codec、流式 API、动态命令接口、模块命令等丰富的扩展机制。本文所述的入门路径——引入依赖、创建连接、选择sync()/async()/reactive()、按命令命名约定调用——即可支撑大部分日常开发场景。深入阅读可继续参考仓库中的 connecting-redis.md、async-api.md、reactive-api.md 与 faq.md 等文档。赞分享数据库后端缓存【免费下载链接】lettuce-coreRedis Java client项目地址https://gitcode.com/gh_mirrors/le/lettuce-core点击查看免费下载相关推荐Python异步Redis客户端终极指南快速上手与实战应用Python异步Redis客户端终极指南快速上手与实战应用 在现代Web开发中异步编程已经成为提升应用性能的关键技术。Python异步Redis客户端通过结后端Lettuce-core 响应式 API 终极指南构建高性能异步 Redis 应用 Lettuce core 响应式 API 终极指南构建高性能异步 Redis 应用 Lettuce 是一个高级的 Java Redis 客户端支持线程数据库后端缓存python-binance 快速上手Binance REST API v3 同步 / 异步客户端与 WebSocket 深度缓存实战python binance 快速上手Binance REST API v3 同步 / 异步客户端与 WebSocket 深度缓存实战 python bina金融科技上一篇Wand-Enhancer为WeMod用户提供的高级本地化体验增强实践下一篇3分钟解锁WeMod专业版Wand-Enhancer终极免费方案指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考