在Java中,使用Redis通常需要一个客户端。目前可用的客户端包括Redisson、Jedis和Lettuce。这里,我们将使用Lettuce创建一个简单的Java项目来利用Redis的功能。Lettuce是一个可扩展的、线程安全的Redis客户端,支持同步、异步和响应式使用。多个线程可以共享一个连接,只要它们避免阻塞和事务操作(如BLPOP和MULTI/EXEC)。Lettuce是基于netty构建的,支持高级Redis特性,如哨兵、集群、管道、自动重连和Redis数据模型。最新的Lettuce版本支持最新的Redis功能。您可以查阅Lettuce 5.1.3的API文档和Lettuce的基本使用教程。为了在项目中使用Redis,我们使用IntelliJ IDE创建名为"xiangyu"的Spring Boot项目,并导入Lettuce依赖。在build.gradle文件中,添加Lettuce依赖以导入所需jar包。在项目中创建主程序RedisMain,运行程序后,将输出有关Redis连接状态的信息。使用RedisURI指定连接信息,包含主机名、端口号、认证和数据库详细信息。对于简单场景,可以使用"redis://localhost"。Redis连接是持久的且线程安全的。如果连接断开,系统会自动重新连接直到调用close()函数为止。未完成的命令将在重连成功后执行。所有连接默认继承自RedisClient,具有60秒的超时时间。每个连接可以设置特定的超时时间。在Redis操作时,接收到的异常被封装为RedisException,该异常是RuntimeException的子类。异步操作允许更高效地利用系统资源。Lettuce使用netty构建异步客户端。每个命令执行后,返回一个RedisFuture对象。CompleteableFuture或RedisFuture用于指向结果,直到计算完成。异步API示例展示了如何使用future处理阻塞调用,以及如何通过thenAcceptAsync()或thenRunAsync()创建新线程来处理结果。使用future可以形成链式调用,实现更高效的数据处理流程。在处理错误时,可以选择提供默认值、使用备份future或重试future。通过设置默认timeout为20秒,可以优化Redis连接性能。异步操作返回的future对象可以进一步处理,如通过onNext()、onError()和onCompleted()函数处理。订阅future消息,可实现多线程并行数据处理。下面的示例展示了如何接收和打印消息。使用lambda表达式简化future操作,通过take()限制处理的item数量。调用last()函数可以将异步操作转换为同步操作。可以通过多种方式创建publishers,如just()、take()和collectList()。下面的示例展示了如何使用reactive API处理publisher发布的消息。Lettuce支持对publisher发布的消息进行transform,如使用flatMap()函数。通过reduce()函数,可以对消息进行聚集。使用groupBy()函数实现消息分组。处理key无value的情况,可以使用特定的函数。处理错误时,可以选择提供默认值、使用备份publisher或重试future。Redis事务通过WATCH、UNWATCH、EXEC、MULTI和DISCARD控制。在事务执行期间,所有命令不会立即返回响应,直到EXEC命令执行后才获取响应。异步命令中的事务操作同样遵循此规则。异步命令执行的事务操作使用reactive API,实现更高效的数据处理。Redis命令接口提供了动态、类型安全的Redis命令调用方式。该接口主要用来发现所有扩展该接口的命令。声明命令方法时,通常需要四步完成:确定方法名称、使用@Command注解指定方法对应的命令、显式指定参数名称和位置,以及使用@Key和@Value注解来指定参数中的键和值。执行模型方面,Lettuce使用事件驱动的命令执行模型,命令方法可以采用同步、异步或响应式执行方式。同步(阻塞)执行默认使用连接级别的超时时间,也可通过参数显式指定超时时间。若为null,则使用默认超时时间。异步(future)执行时,命令方法将返回值封装进Future、CompletableFuture、CompletionStage或RedisFuture,用于异步执行命令。响应式执行时,将命令方法的返回值封装在reactive类型,如Mono、Flux、Single、Observable、Single、Maybe、Flowable。批量执行时,支持将多个命令进行批量执行,适用于无返回值的同步方法或返回RedisFuture的异步方法。批量执行条件包括到达批量命令数量或调用flush函数。Redis支持在4.2版本后启用复制功能,以提高可靠性和读取吞吐量。Redis Master/Replica可以在单独执行或结合Redis Sentinel时使用复制。Redis Sentinel可以提供自动故障转移和主节点升级功能,这些功能在Lettuce 3.1版本中被支持。静态Master/Replica情况下,拓扑发现不应启动。在这种情况下,如AWS ElastiCache,Lettuce允许预定义节点拓扑,并指定一个或多个Redis地址作为列表。Redis Sentinel交互可以通过Lettuce提供的API RedisClient.connectSentinel()来建立与Redis Sentinel节点的连接。Redis Sentinel可以监控Redis实例,当主Redis实例挂机时,启动故障转移过程,选择一个副本Redis实例升级为主。Redis Cluster基于分片概念,配置可能在运行时改变。节点可以添加,特定槽的主节点可以变化。连接Redis Cluster时,可以创建多个seed节点,并且周期性地更新集群拓扑视图。通过设置ReadFrom配置项,Lettuce可以指导如何在多节点连接环境中路由读操作到副本节点。默认情况下,Lettuce将读操作转发到主节点,确保数据强一致性。可以通过将不需要实时数据的读操作转发到副本节点来减少延迟并提高读取吞吐量。Lettuce允许在连接级别设置ReadFrom配置,适用于该连接下的所有读操作。使用ReadFrom配置可以分别在Redis Sentinel和Redis Standalone创建连接。ReadFrom配置项包括多个可选项,具体取决于您的需求。创建客户端资源时,有两种方式:在创建RedisClient和RedisClusterClient时提供ClientResources,或者在运行时动态创建资源。在创建资源后,它们将被客户端单独拥有并在客户端关闭时回收。下面的示例展示了如何在Redis Sentinel和Redis Standalone中分别创建连接,同时利用ReadFrom配置进行优化。