首页 文章资讯内容详情

Redis入门实战(5)-lettuce操作redis

2026-06-01 3 花语

本文内容纲要:

-1、引入依赖 -2、基本操作 -3、高级操作

Lettuce是一个高性能基于Java编写的Redis驱动框架,底层集成了ProjectReactor提供天然的反应式编程,通信框架集成了Netty使用了非阻塞IO,5.x版本之后融合了JDK1.8的异步编程特性,在保证高性能的同时提供了十分丰富易用的API。本文主要介绍使用lettuce操作redis,使用到的软件版本:Java1.8.0_191、Redis5.0.8、lettuce5.3.1.RELEASE。

1、引入依赖

<dependency> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> <version>5.3.1.RELEASE</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.8.0</version> </dependency>

2、基本操作

packagecom.inspur.demo.general.redis; importio.lettuce.core.RedisClient; importio.lettuce.core.RedisURI; importio.lettuce.core.SetArgs; importio.lettuce.core.api.StatefulRedisConnection; importio.lettuce.core.api.async.RedisAsyncCommands; importio.lettuce.core.api.reactive.RedisReactiveCommands; importio.lettuce.core.api.sync.RedisCommands; importorg.junit.After; importorg.junit.Before; importorg.junit.Test; importreactor.core.publisher.Mono; importjava.time.Duration; importjava.time.temporal.ChronoUnit; importjava.util.concurrent.Future; /** *使用Lettuce操作redis */ publicclassLettuceBaseCase{ privatestaticRedisClientclient; privateStatefulRedisConnection<String,String>connection; @Before publicvoidbefore(){ RedisURIredisUri=RedisURI.builder() .withHost("10.49.196.10").withPort(6379).withPassword("123456") .withTimeout(Duration.of(10,ChronoUnit.SECONDS)) .build(); client=RedisClient.create(redisUri); connection=client.connect(); } @After publicvoidafter(){ connection.close(); client.shutdown(); } /** *同步操作 *api和jedis很类型 */ @Test publicvoidsync(){ RedisCommands<String,String>commands=connection.sync(); Stringresult=commands.set("name","mayun"); System.out.println(result); SetArgsargs=SetArgs.Builder.nx().ex(10); result=commands.set("age","30",args); System.out.println(result); } /** *异步操作 */ @Test publicvoidasync()throwsException{ RedisAsyncCommands<String,String>commands=connection.async(); Future<String>future=commands.set("name","mayun"); System.out.println(future.get()); SetArgsargs=SetArgs.Builder.nx().ex(10); future=commands.set("age","30",args); System.out.println(future.get()); } /** *响应式API */ @Test publicvoidreactive()throwsException{ RedisReactiveCommands<String,String>commands=connection.reactive(); Mono<String>result=commands.set("name","mayun"); System.out.println(result.block()); SetArgsargs=SetArgs.Builder.nx().ex(10); result=commands.set("age","30",args); result.subscribe(value->System.out.println(value)); //开启一个事务,先把counter设置为1,再将counter自增1 commands.multi().doOnSuccess(r->{ commands.set("count","1").doOnNext(System.out::println).subscribe(); commands.incr("count").doOnNext(c->System.out.println(c)).subscribe(); }).flatMap(s->commands.exec()) .doOnNext(transactionResult->System.out.println(transactionResult.wasDiscarded())).subscribe(); Thread.sleep(1000*5); } }

3、高级操作

packagecom.inspur.demo.general.redis; importio.lettuce.core.ClientOptions; importio.lettuce.core.ReadFrom; importio.lettuce.core.RedisClient; importio.lettuce.core.RedisURI; importio.lettuce.core.api.StatefulRedisConnection; importio.lettuce.core.api.sync.RedisCommands; importio.lettuce.core.cluster.ClusterClientOptions; importio.lettuce.core.cluster.RedisClusterClient; importio.lettuce.core.cluster.api.StatefulRedisClusterConnection; importio.lettuce.core.cluster.api.sync.Executions; importio.lettuce.core.cluster.api.sync.NodeSelection; importio.lettuce.core.cluster.api.sync.NodeSelectionCommands; importio.lettuce.core.cluster.api.sync.RedisAdvancedClusterCommands; importio.lettuce.core.codec.StringCodec; importio.lettuce.core.masterreplica.MasterReplica; importio.lettuce.core.masterreplica.StatefulRedisMasterReplicaConnection; importio.lettuce.core.resource.ClientResources; importio.lettuce.core.resource.DefaultClientResources; importio.lettuce.core.support.ConnectionPoolSupport; importorg.apache.commons.pool2.impl.GenericObjectPool; importorg.apache.commons.pool2.impl.GenericObjectPoolConfig; importorg.junit.Test; importjava.time.Duration; importjava.time.temporal.ChronoUnit; importjava.util.*; /** *高级操作 */ publicclassLettuceAdvanceCase{ /** *主从模式操作 */ @Test publicvoidmasterSlave(){ //这里只需要配置一个节点的连接信息,不一定需要是主节点的信息,从节点也可以;可以自动发现主从节点 RedisURIuri=RedisURI.builder().withHost("10.49.196.20").withPort(6379).withPassword("123456").build(); RedisClientclient=RedisClient.create(uri); StatefulRedisMasterReplicaConnection<String,String>connection=MasterReplica.connect(client,StringCodec.UTF8,uri); //从节点读书数据 connection.setReadFrom(ReadFrom.REPLICA); RedisCommands<String,String>commands=connection.sync(); commands.set("name","刘备"); System.out.println(commands.get("name")); connection.close(); client.shutdown(); } /** *主从模式操作2 */ @Test publicvoidmasterSlave2(){ List<RedisURI>uris=newArrayList(); uris.add(RedisURI.builder().withHost("10.49.196.20").withPort(6379).withPassword("123456").build()); uris.add(RedisURI.builder().withHost("10.49.196.21").withPort(6379).withPassword("123456").build()); uris.add(RedisURI.builder().withHost("10.49.196.22").withPort(6379).withPassword("123456").build()); RedisClientclient=RedisClient.create(); StatefulRedisMasterReplicaConnection<String,String>connection=MasterReplica.connect(client,StringCodec.UTF8,uris); //从节点读书数据 connection.setReadFrom(ReadFrom.REPLICA); RedisCommands<String,String>commands=connection.sync(); commands.set("name","张飞"); System.out.println(commands.get("name")); connection.close(); client.shutdown(); } /** *哨兵模式操作 */ @Test publicvoidsentinel(){ List<RedisURI>uris=newArrayList(); uris.add(RedisURI.builder().withSentinel("10.49.196.20",26379).withSentinelMasterId("mymaster").withPassword("123456").build()); uris.add(RedisURI.builder().withSentinel("10.49.196.21",26379).withSentinelMasterId("mymaster").withPassword("123456").build()); uris.add(RedisURI.builder().withSentinel("10.49.196.22",26379).withSentinelMasterId("mymaster").withPassword("123456").build()); RedisClientclient=RedisClient.create(); StatefulRedisMasterReplicaConnection<String,String>connection=MasterReplica.connect(client,StringCodec.UTF8,uris); //从节点读书数据 connection.setReadFrom(ReadFrom.REPLICA); RedisCommands<String,String>commands=connection.sync(); commands.set("name","赵云"); System.out.println(commands.get("name")); connection.close(); client.shutdown(); } /** *集群操作 */ @Test publicvoidcluster(){ Set<RedisURI>uris=newHashSet<>(); uris.add(RedisURI.builder().withHost("10.49.196.20").withPort(7000).withPassword("123456").build()); uris.add(RedisURI.builder().withHost("10.49.196.20").withPort(7001).withPassword("123456").build()); uris.add(RedisURI.builder().withHost("10.49.196.21").withPort(7000).withPassword("123456").build()); uris.add(RedisURI.builder().withHost("10.49.196.21").withPort(7001).withPassword("123456").build()); uris.add(RedisURI.builder().withHost("10.49.196.22").withPort(7000).withPassword("123456").build()); uris.add(RedisURI.builder().withHost("10.49.196.22").withPort(7001).withPassword("123456").build()); RedisClusterClientclient=RedisClusterClient.create(uris); StatefulRedisClusterConnection<String,String>connection=client.connect(); RedisAdvancedClusterCommands<String,String>commands=connection.sync(); commands.set("name","关羽"); System.out.println(commands.get("name")); //选择从节点,只读 NodeSelection<String,String>replicas=commands.replicas(); NodeSelectionCommands<String,String>nodeSelectionCommands=replicas.commands(); Executions<List<String>>keys=nodeSelectionCommands.keys("*"); keys.forEach(key->System.out.println(key)); connection.close(); client.shutdown(); } /** *配置客户端资源(ClientResources)及客户端参数(ClientOptions) */ @Test publicvoidresourceAndOption(){ ClientResourcesresources=DefaultClientResources.builder() .ioThreadPoolSize(4)//I/O线程数 .computationThreadPoolSize(4)//任务线程数 .build(); RedisURIredisUri=RedisURI.builder() .withHost("10.49.196.10").withPort(6379).withPassword("123456") .withTimeout(Duration.of(10,ChronoUnit.SECONDS)) .build(); ClientOptionsoptions=ClientOptions.builder() .autoReconnect(true)//是否自动重连 .pingBeforeActivateConnection(true)//连接激活之前是否执行PING命令 .build(); RedisClientclient=RedisClient.create(resources,redisUri); client.setOptions(options); StatefulRedisConnection<String,String>connection=client.connect(); RedisCommands<String,String>commands=connection.sync(); System.out.println(commands.get("name")); connection.close(); client.shutdown(); resources.shutdown(); } /** *配置客户端资源(ClientResources)及客户端参数(ClientOptions) *集群 */ @Test publicvoidresourceAndOption2(){ ClientResourcesresources=DefaultClientResources.builder() .ioThreadPoolSize(4)//I/O线程数 .computationThreadPoolSize(4)//任务线程数 .build(); //集群地址,配置其中一个即可,不需要配置全 RedisURIredisUri=RedisURI.builder() .withHost("10.49.196.20").withPort(7000).withPassword("123456") .withTimeout(Duration.of(10,ChronoUnit.SECONDS)) .build(); ClusterClientOptionsoptions=ClusterClientOptions.builder() .autoReconnect(true)//是否自动重连 .pingBeforeActivateConnection(true)//连接激活之前是否执行PING命令 .validateClusterNodeMembership(true)//是否校验集群节点的成员关系 .build(); RedisClusterClientclient=RedisClusterClient.create(resources,redisUri); client.setOptions(options); StatefulRedisClusterConnection<String,String>connection=client.connect(); RedisAdvancedClusterCommands<String,String>commands=connection.sync(); System.out.println(commands.get("name")); connection.close(); client.shutdown(); resources.shutdown(); } /** *连接池 */ @Test publicvoidpool()throwsException{ RedisURIredisUri=RedisURI.builder() .withHost("10.49.196.10").withPort(6379).withPassword("123456") .withTimeout(Duration.of(10,ChronoUnit.SECONDS)) .build(); RedisClientclient=RedisClient.create(redisUri); GenericObjectPoolConfigpoolConfig=newGenericObjectPoolConfig(); GenericObjectPool<StatefulRedisConnection<String,String>>pool=ConnectionPoolSupport.createGenericObjectPool(client::connect,poolConfig); StatefulRedisConnection<String,String>connection=pool.borrowObject(); RedisCommands<String,String>commands=connection.sync(); System.out.println(commands.get("name")); connection.close(); pool.close(); client.shutdown(); } }

本文内容总结:1、引入依赖,2、基本操作,3、高级操作,

原文链接:https://www.cnblogs.com/wuyongyin/p/13206947.html