redis lettuce_Redis Client Lettuce 5 GA发布

redis lettuce

经过13个月的开发阶段和208张已解决的故障单,我很高兴宣布Lettuce 5.0全面上市。 这是一个主要发行版,带有一些重大更改,新的有趣功能以及Java 9兼容性。

从Maven Central获取发行版

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

或从GitHub下载发行包 。

生菜5引入了动态的Redis命令API。 此编程模型使您可以声明命令方法并根据需要调用命令并支持Redis模块,而无需等待Lettuce支持新命令。

如果本地依赖项可用,则莴苣在Linux各自的macOS系统上默认为本地传输(epoll,kqueue)。
生菜5带有重大变化; 它删除了过时的接口RedisConnection和RedisAsyncConnection以及它们分离的接口,从而支持StatefulRedisConnection和RedisCommands等。

重大更改:

  1. 我们将工件坐标从biz.paluch.redis:lettuce移到io.lettuce:lettuce-core
  2. 我们将包从biz.paluch.redis重新定位到io.lettuce.core。 通过将导入中的旧软件包名称替换为新软件包名称,可以轻松实现迁移路径。
  3. 该文档已从http://redis.paluch.biz移至https://lettuce.io 。
  4. 删除了番石榴。
  5. 我们删除了一些不推荐使用的方法,有关详细信息,请参见下文。

生菜只需要netty 4.1 (不再支持netty 4.0)和Project Reactor 3.1 ,这使我们有了下一个变化:

通过使用Project Reactor类型MonoFlux而不是RxJava 1和Observable ,React式API基于React式流。
如果您的代码中要求RxJava的SingleObservable ,则在rxjava-reactive-streams使用发布者适配器来适应MonoFlux

此版本引入了随常规工件一起提供的新参考指南。
参考指南绑定到特定版本,并且不会随着时间的推移而更改,例如Wiki。

  • 参考文档: https : //lettuce.io/core/release/reference/ 。
  • JavaDoc文档: https : //lettuce.io/core/release/api/ 。
<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>5.0.0.RELEASE</version>
</dependency>

您可以找到完整的更改日志,其中包含自第一个5.0里程碑版本以来的所有更改,
在GitHub上 。 当心BREAKING更改。

感谢所有使生菜5成为可能的贡献者。 感谢任何反馈或在GitHub上提出问题 。

动态Redis命令API

Redis命令接口抽象为类型安全的Redis命令调用提供了一种动态方式。 它允许您使用命令方法声明接口,以显着减少调用Redis命令所需的样板代码。

Redis是一个数据存储,支持190多个文档化命令和450多个命令排列。 对于客户端开发人员和Redis用户而言,命令的增长和对即将发布的模块的跟踪是一项挑战,因为单个Redis客户端中的每个模块都没有完整的命令覆盖范围。

用Lettuce调用自定义命令需要几行代码来定义命令结构传入参数并指定返回类型。

RedisCodec<String, String> codec = StringCodec.UTF8;
RedisCommands<String, String> commands = ...String response = redis.dispatch(CommandType.SET, new StatusOutput<>(codec),new CommandArgs<>(codec).addKey(key).addValue(value));

Lettuce Command Interface抽象中的中心接口是Commands

该界面主要用作标记界面,可帮助您发现扩展该界面的界面。 您可以声明自己的命令接口和参数序列,其中命令名从方法名派生或由@Command提供。 引入新命令不需要您等待新的Lettuce版本,但是它们可以通过自己的声明来调用命令。
根据使用情况,该接口还可以支持不同的键和值类型。

根据方法声明,命令是同步执行,异步执行还是使用React执行模型执行。

public interface MyRedisCommands extends Commands {String get(String key); // Synchronous Execution of GET@Command("GET")byte[] getAsBytes(String key); // Synchronous Execution of GET returning data as byte array@Command("SET") // synchronous execution applying a TimeoutString setSync(String key, String value, Timeout timeout);Future<String> set(String key, String value); // asynchronous SET execution@Command("SET")Mono<String> setReactive(String key, String value); // reactive SET execution using SetArgs@CommandNaming(split = DOT) // support for Redis Module command notation -> NR.RUNdouble nrRun(String key, int... indexes);
}RedisCommandFactory factory = new RedisCommandFactory(connection);MyRedisCommands commands = factory.getCommands(MyRedisCommands.class);String value = commands.get("key");

Redis命令界面给您带来了很多新的可能性。 其中之一是透明的React式采用。 Lettuce的React式API基于Reactive Streams,但是通过命令接口,您可以声明RxJava 1或RxJava 2返回类型,Lettuce将为您处理采用。 RxJava 1用户的迁移路径允许使用本机类型而无需
进一步转换。

另请参阅: https : //lettuce.io/core/5.0.0.RELEASE/reference/#redis-command-interfaces

命令界面批处理

命令接口支持命令批处理,以在批处理队列中收集多个命令,并通过一次写入传输将批处理刷新。 命令批处理以延迟的方式执行命令。 这意味着在调用时没有结果可用。 批处理只能用于没有返回值(void)的同步方法或返回RedisFuture的异步方法。

可以在两个级别上启用命令批处理:

  • 在类级别,通过使用@BatchSize注释命令界面。 所有方法都参与命令批处理。
  • 在方法级别,通过将CommandBatching添加到参数中。 方法有选择地参与命令批处理。
@BatchSize(50)
interface StringCommands extends Commands {void set(String key, String value);RedisFuture<String> get(String key);RedisFuture<String> get(String key, CommandBatching batching);
}StringCommands commands = …commands.set("key", "value"); // queued until 50 command invocations reached.// The 50th invocation flushes the queue.commands.get("key", CommandBatching.queue()); // invocation-level queueing control
commands.get("key", CommandBatching.flush()); // invocation-level queueing control,// flushes all queued commands

了解更多: https : //lettuce.io/core/5.0.0.RELEASE/reference/#command-interfaces.batch

迁移到React流

Lettuce 4.0引入了基于RxJava 1和Observable的React式API。 这是响应式Redis支持的开始。 生菜在各处都使用Observable ,因为其他React式(如SingleCompletable )仍处于测试阶段或正在开发中。

从那时起,React空间发生了很多变化。 RxJava 2是RxJava 1的后继产品,现已到期。 RxJava 2并不完全基于Java 6的响应流和基线,而其他合成库也可以从Java 8中受益。

这也意味着,没有null值,并且使用专用值类型来表示API上的值多重性( 0|10|1|N )。

在Lettuce 5.0中,React式API使用Project Reactor及其MonoFlux类型。

生菜4

Observable<Long> del(K... keys);Observable<K> keys(K pattern);Observable<V> mget(K... keys);

生菜5

Mono<Long> del(K... keys);Flux<K> keys(K pattern);Flux<KeyValue<K, V>> mget(K... keys);

从RxJava 1切换到Project Reactor的使用需要切换库。 大多数运营商使用相似甚至相同的名称。 如果需要坚持使用RxJava 1,请使用rxjava-reactive-streams采用React类型(RxJava 1 <-> Reactive Streams)。

迁移到React流需要值包装以指示不存在值。 在命令可以返回null值的情况下,您会发现与以前的API和同步/异步API相比有所不同。 Lettuce 5.0带有新的Value类型,这些类型是封装值(或不存在)的单子。

另请参阅: https : //lettuce.io/core/5.0.0.RELEASE/reference/#reactive-api

值,键值和其他值类型

React式故事促进了不可变类型的实现,因此此发行版增强了现有的值类型,并引入了新的类型以减少null使用并促进函数编程。

值类型是基于ValueKeyValue / ScoredValue延伸从那里。 值是封装值或没有值的包装器类型。 Value可以通过不同的方式创建:

Value<String> value = Value.from(Optional.of("hello"));Value<String> value = Value.fromNullable(null);Value<String> value = Value.just("hello");KeyValue<Long, String> value = KeyValue.from(1L, Optional.of("hello"));KeyValue<String, String> value = KeyValue.just("key", "hello");

它转换为OptionalStream以与其他功能用途集成,并允许值映射。

Value.just("hello").stream().filter(…).count();KeyValue.just("hello").optional().isPresent();Value.from(Optional.of("hello")).map(s -> s + "-world").getValue();ScoredValue.just(42, "hello").mapScore(number -> number.doubleValue() * 3.14d).getScore();

您还将发现,值类型的所有公共字段都用getter封装,并且这些字段不再可访问。

退避/延迟策略

感谢@jongyeol

当运行带有大量使用Redis的服务的基于云的服务时,一旦分区结束,网络分区会对Redis服务器连接产生重大影响。 网络分区会同时影响所有断开连接的应用程序,并且所有节点或多或少会同时开始重新连接。

分区结束后,大多数应用程序将同时重新连接。 随着重新连接时间的随机化,抖动回退策略可以充分利用这种影响。

生菜具有各种退避实现:

  • 均等抖动
  • 全抖动
  • 与装饰相关的抖动

这些在ClientResources中配置:

DefaultClientResources.builder().reconnectDelay(Delay.decorrelatedJitter()).build();DefaultClientResources.builder().reconnectDelay(Delay.equalJitter()).build();

另请参阅: https : //www.awsarchitectureblog.com/2015/03/backoff.html和
https://lettuce.io/core/5.0.0.RELEASE/reference/#clientresources.advanced-settings

Z…RANGE命令的新API

Sorted Sets范围命令附带有关方法重载的简化API。 ZRANGEBYSCOREZRANGEBYLEXZREMRANGEBYLEX等命令现在声明了接受RangeLimit对象而不是不断增长的参数列表的方法。 新的Range允许分数和值类型应用适当的二进制编码。

4.2及更早版本

commands.zcount(key, 1.0, 3.0)commands.zrangebyscore(key, "-inf", "+inf")commands.zrangebyscoreWithScores(key, "[1.0", "(4.0")commands.zrangebyscoreWithScores(key, "-inf", "+inf", 2, 2)

从5.0开始

commands.zcount(key, Range.create(1.0, 3.0));commands.zrangebyscore(key, Range.unbounded());commands.zrangebyscoreWithScores(key, Range.from(Boundary.including(1.0), Boundary.excluding(4.0));commands.zrangebyscoreWithScores(key, Range.unbounded(), Limit.create(2, 2));

再见了番石榴

Lettuce 5.0不再使用Google的Guava库。 Guava是Java 6兼容时代的好朋友, Future同步和回调很无聊。 随Java 8和CompletableFuture改变了。

HostAndPortLoadingCache等其他用途可以被内联或替换为Java 8的Collection框架。

删除不推荐使用的接口和方法

此版本删除了不推荐使用的接口RedisConnectionRedisAsyncConnection及其分离的接口,而支持StatefulRedisConnectionRedisCommands

使用该API时,您会发现细微的差别。 事务命令和数据库选择不再通过Redis Cluster API可用,因为旧API是从独立API派生的。 RedisCommandsRedisAsyncCommands不再是Closeable 。 请使用commands.getStatefulConnection().close()关闭连接。 此更改消除了关闭命令界面和关闭连接的歧义。

连接池更换

花了相当长的时间,但4.3不赞成使用Lettuce的现有连接池支持。 特别是RedisClient.pool(…)RedisClient.asyncPool(…) 。 这些方法在Lettuce 5.0中已删除。

连接池的支持非常有限,并且将需要额外的重载,从而使API混乱以暴露所有支持的连接的池。 此版本带来了一个可定制且不会污染API的替代品。 ConnectionPoolSupport提供了用于创建接受工厂方法和池配置的连接池的方法。

返回的连接对象是在调用close()时将连接返回到其池的代理。 StatefulConnection实施Closeable允许使用try-with-resources。

GenericObjectPool<StatefulRedisConnection<String, String>> pool = ConnectionPoolSupport.createGenericObjectPool(() -> client.connect(), new GenericObjectPoolConfig());try(StatefulRedisConnection<String, String> connection = pool.borrowObject()) {// Work
}pool.close();

Redis集群拓扑刷新共识

群集拓扑刷新在某些情况下(动态拓扑源)可能导致孤立。 如果从群集中删除了群集节点,而生菜决定接受该已删除节点的拓扑视图,则可能会发生这种情况。 生菜卡在该节点上,无法使用剩余的群集。

此版本引入了PartitionsConsensus策略,以便在获取多个视图时确定最合适的拓扑视图。 可以通过重写RedisClusterClient.determinePartitions(Partitions, Map<RedisURI, Partitions>)定义策略。

生菜默认选择具有大多数先前已知群集节点的拓扑视图。 这有助于生菜坚持由最多节点组成的群集。

另请参阅: https : //github.com/lettuce-io/lettuce-core/issues/355

Redis集群中的异步连接

RedisClusterClient现在可以异步连接,而不会中间阻塞到群集节点。 连接进度在之间共享
多个线程首次请求群集节点连接。 以前,连接是顺序同步的。 每次连接尝试都会阻止其他线程的后续尝试。 如果群集节点连接发生超时,则线程将受到等待时间增加的惩罚。 如果说有10个线程等待连接,则最后一个线程必须等待多达10倍的连接超时。

异步连接一旦在内部使用Future即可启动连接,因此多个并发连接尝试会共享结果Future 。 错误现在可以更快地失败,并且群集节点的使用完全异步,无需同步,也没有陷入线程死锁的危险。

Redis Cluster Pub / Sub关于节点选择

RedisClusterClient.connectPubSub()现在返回一个StatefulRedisClusterPubSubConnection ,该StatefulRedisClusterPubSubConnection允许RedisClusterPubSubListener的注册以及在特定集群节点上的预订。

特定于群集节点的预订允许使用键空间通知。 密钥空间通知与用户空间Pub / Sub不同,因为密钥空间通知不会广播到整个集群,而是仅在发生通知的节点上发布。 一个常见的用例是密钥在集群中过期。

StatefulRedisClusterPubSubConnection connection = client.connectPubSub();connection.addListener(…);connection.setNodeMessagePropagation(true);RedisClusterPubSubCommands<String, String> sync = connection.sync();
sync.slaves().commands().psubscribe("__key*__:expire");

本地运输

如果操作系统合格且依赖项可用,则Lettuce现在默认情况下使用本机传输。 Lettuce从4.0版本开始支持epoll(在基于Linux的系统上),从此版本开始支持kqueue(基于BSD的系统,如macOS)。

可以通过设置io.lettuce.core.epoll=false来禁用Epoll的使用和系统属性。 以类似的方式,可以禁用kqueue
io.lettuce.core.kqueue=false

Epoll依赖性:

<dependency><groupId>io.netty</groupId><artifactId>netty-transport-native-epoll</artifactId><version>${netty-version}</version><classifier>linux-x86_64</classifier>
</dependency>

Kqueue依赖项:

<dependency><groupId>io.netty</groupId><artifactId>netty-transport-native-kqueue</artifactId><version>${netty-version}</version><classifier>osx-x86_64</classifier>
</dependency>

翻译自: https://www.javacodegeeks.com/2017/09/redis-client-lettuce-5-ga-released.html

redis lettuce

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言限制字符数,C语言中“不受限制”的字符串函数总结.pdf

C语语言言中中“不不受受限限制制”的的字字符符串串函函数数总总结结“不不受受限限制制的的“字字符符串串函函数数按 《C和指针》中所说&#xff0c;那些常用的字符串函数都是“不是限制的”&#xff0c;就是说 们只能通过寻找字符串末尾的NULL来判断字符串的长度。strlenst…

测试类/测试包/演示类/演示包的命名规范/命名规则

文章目录1.测试类的命名规范2.测试程序的包命名规范3.测试方法命名规范4.演示类/范例类的命名规范1.测试类的命名规范 测试类命名规则&#xff1a;Test 要测试的类名称 测试类命名规则&#xff1a;功能名称或者类名 Test ✓ 2.测试程序的包命名规范 测试程序包的命名规则是…

mybatis转义反斜杠_MyBatis Plus like模糊查询特殊字符_、\、%

在MyBatis Plus中&#xff0c;使用like查询特殊字符_&#xff0c;\&#xff0c;%时会出现以下情况&#xff1a;1、查询下划线_&#xff0c;sql语句会变为"%_%"&#xff0c;会导致返回所有结果。在MySQL中下划线“_”表示匹配单个字符&#xff0c;所以结合后“%_%”就…

移动端apm关键指标_3个经常被忽视的APM关键功能

移动端apm关键指标APM核心功能已不再足够。 市场领先的应用程序超越了所有人&#xff0c;树立了其他人必须匹配的新标准。 每当任何针对消费者或企业的Web应用程序达到新的性能高峰时&#xff0c;都会为用户期望值设定基准。 这可能不公平或不合理&#xff0c;但这就是市场运作…

Java包命名规则/包命名规范

文章目录个人项目的包命名规则团队项目的包命名规则包前缀说明包名通常是一个单词&#xff0c;且单词通常是名词&#xff0c;字母全部小写&#xff0c;如果多个单词使用下划线连接。 个人项目的包命名规则 individual&#xff08;个体&#xff09;&#xff1a;指个体项目&…

程序设计基础(c语言)复习大纲,《程序设计基础-C》复习大纲.doc

《程序设计基础-C》复习大纲.doc《程序设计基础-C》复习大纲第一部分 期末考核说明一、期末考试要求考核学生是否掌握C语言的基本概念&#xff0c;能否较熟练运用Visual C工具进行程序设计。具体考核要求分为以下几个层次&#xff1a;掌握C的基本语法结构&#xff1b;掌握基本的…

单容水箱液位pid控制实验报告_单容水箱液位PID控制系统

图7-1、单容水箱液位控制系统的方块图图7-1为单容水箱液位控制系统。这是一个单回路反馈控制系统&#xff0c;它的控制任务是使水箱液位等于给定值所要求的高度&#xff1b;并减小或消除来自系统内部或外部扰动的影响。单回路控制系统由于结构简单、投资省、操作方便、且能满足…

oauth 使用令牌_使用OAuth2令牌的安全REST服务

oauth 使用令牌1.简介 在本教程中&#xff0c;我们将介绍如何将Spring Security与OAuth结合使用以保护REST服务。 在演示应用程序中&#xff0c;可以使用路径模式&#xff08; / api / ** &#xff09;访问服务器上受保护的REST资源&#xff0c;以便基于该路径的请求URL映射到不…

如何解析属性文件(properties)获取键值对的值?

文章目录创建属性文件解析属性文件获取数据使用类加载器使用 File 对象创建属性文件 新建 db-oracle.properties , 存放项目必须使用到的参数&#xff1a; driver oracle.jdbc.driver.OracleDriver url jdbc:oracle:thin:192.168.0.23:1521:htlwk username openlab passwo…

微信小程序 高德地图知道两点求道路_微信小程序——计算2点之间的距离

关于计算2点之间的距离都依赖了腾讯地图&#xff0c;所以请先在下面具体讲计算2点之间距离的方法。方法一&#xff1a;getPosition: function() {var that this;wx.getLocation({success:function(res) {that.setData({fromLng: res.longitude,fromLat: res.latitude})}})},2.…

c语言char指针用法,整理C语言中各种类型指针的特性与用法

2016指针为什么要区分类型&#xff1a;在同一种编译器环境下,一个指针变量所占用的内存空间是固定的。比如,在16位编译器环境 下,任何一个指针变量都只占用8个字节,并不会随所指向变量的类型而改变。虽然所有的指针都只占8个字节,但不同类型的变量却占不同的字节数。一个int占用…

java message_Java Message System简介

java messageJava消息系统 在本文中&#xff0c;我将讨论面向消息的中间件 &#xff08;MOM&#xff09;以及JMS如何在Enterprise Java中实现它。 此外&#xff0c;我还将讨论适合JMS使用的典型用例以及用于讨论消息传递解决方案的不同术语&#xff0c;例如Publisher / Sender …

c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码

/**程序名称&#xff1a;贪吃蛇v2.1*程序描述&#xff1a;一个简易的贪吃蛇小游戏*版本信息&#xff1a;v2.1*v1.1版本更新&#xff1a;1&#xff1a;加入菜单选择项*v1.2版本更新&#xff1a;1&#xff1a;修复菜单选择bug*v1.3班本更新&#xff1a;1&#xff1a;加入难度选择…

IntelliJ IDEA for Mac 如何设置 tab 键为 4 个空格?

使用快捷键 Command , 打开偏好设置窗口如下所示&#xff1a; 设置好以后&#xff0c;可以按 Option Command L 整理格式&#xff0c;然后选中缩进的部分&#xff0c;如果能选中缩进的部分&#xff0c;证明是空格&#xff1a; 如果不想整理格式&#xff0c;还可以用 edit…

gc垃圾收集器 与gc算法_GC解释:收集器概述

gc垃圾收集器 与gc算法当前版本的HotSpot JVM包括三种类型的垃圾收集器&#xff1a; –串行收集器 –并行收集器 –多数同时收集者 它们都是世代的&#xff0c;这意味着它们利用了堆的划分方式 。 垃圾收集器负责三个主要操作&#xff1a; –查找不再使用的对象 –释放这…

安兔兔跑分可信吗_安兔兔安卓手机跑分性能榜公布:第一名实至名归?

3月5日消息&#xff0c;安兔兔官方放出了2019年2月份国内安卓手机的性能跑分排行榜。从榜单中我们可以看到排名前三的分别是&#xff1a;小米9、联想Z5 Pro GT 855版、红魔Mars电竞手机。不出所料&#xff0c;前三名都是高通平台的旗舰Soc&#xff0c;骁龙855和骁龙845。骁龙85…

c语言sort函数排序二维数组,c++ - 如何使用stl sort函数根据第二列对二维数组进行排序? - 堆栈内存溢出...

stl排序要求迭代器的rvalue作为参数传递。 如果你想使用sort函数&#xff0c;你必须在c 11中编译并使用数组stl来存储数组。 代码如下#include "bits/stdc.h"using namespace std;bool compare( array a, array b){return a[0]}int main(){int i,j;array, 5> ar1…

IntelliJ IDEA for Mac 类和方法注释模板设置

文章目录类注释模板设置使用 File and Code Templates方法 1&#xff1a;直接在编辑区编写模板代码方法 2&#xff1a;使用 parse 指令来引用注释模板使用 Live Templates方法注释模板设置注意事项解决注释模板无法获取参数名和返回值类型的问题类注释模板设置 使用 File and …

java streams_使用JShell的Java 9 Streams API

java streams这篇文章着眼于使用JShell的Java 9 Streams API。 Streams API的更改以Java 8中Streams的成功为基础&#xff0c;并引入了许多实用程序方法– takeWhile&#xff0c;dropWhile和iterate。 这篇文章延续了My Top Java 9功能&#xff0c;并使用Jshell探索了这些方法。…

c语言中dfs用pos做参数,LeetCode算法练习——深度优先搜索 DFS(2)

更多干货就在我的个人博客 BlackBlog.tech 欢迎关注&#xff01;也可以关注我的csdn博客&#xff1a;黑哥的博客谢谢大家&#xff01;我们继续LeetCode之旅.做了一段时间的LeetCode&#xff0c;感觉还是不错的。算法很基础&#xff0c;没有特别难的(至少我看在做的)&#xff0c…