Lettuce是一个可伸缩的线程安全的Redis客户端,支持同步、异步和响应式模式。多个线程可以共享一个连接实例,而不必担心多线程并发问题。它基于Netty框架构建,支持Redis的高级功能,如Sentinel,集群,流水线,自动重新连接和Redis数据模型。
Jedis在实现上是直连Redis-Server,多线程环境下非线程安全,需要通过连接池来使用Jedis。
Maven需要添加以下依赖包:
<dependency> <groupId>biz.paluch.redis</groupId> <artifactId>lettuce</artifactId> <version>4.4.6.Final</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.4.3</version> </dependency>
单机版下使用Lettuce:
public class CommonTest { private static RedisClient client; private static GenericObjectPool<StatefulRedisConnection<String, String>> pool; public static void main(String[] args) { open(); //JDK1.7之后有了try-with-resource处理机制。该机制用于自动释放外部资源。 //被自动释放的资源需要实现Closeable或者AutoCloseable接口,这样JVM才可以自动调用close()方法去自动关闭资源。 //写法为try(){}catch(){},将要关闭的外部资源在try()中创建,catch()捕获处理异常。 try(StatefulRedisConnection<String, String> connect = pool.borrowObject()){ testCommon(connect); testList(connect); } catch (Exception e) { e.printStackTrace(); } finally { close(); } } private static void testCommon(StatefulRedisConnection<String, String> connect) throws InterruptedException, ExecutionException { //sync RedisCommands<String, String> syncCommand = connect.sync(); //过期 syncCommand.expire("uid", 60 * 10); //多少秒后过期 syncCommand.expireat("uid", new Date()); //具体日期到达后过期 //删除key syncCommand.del("auth", "uid", "pwd"); //key是否存在 System.out.println(syncCommand.exists("uid")); syncCommand.set("auth", "1"); //批量set syncCommand.multi(); syncCommand.set("uid", "cjm"); syncCommand.set("pwd", "123"); syncCommand.exec(); String result = syncCommand.get("uid"); System.out.println(result); //async RedisAsyncCommands<String, String> asyncCommand = connect.async(); RedisFuture<Boolean> future = asyncCommand.setnx("uid", "cjm2"); //setnx: key不存在才set future.thenAccept(v -> System.out.println(v)); //获取监控信息 System.out.println(syncCommand.info()); } private static void testList(StatefulRedisConnection<String, String> connect){ RedisCommands<String, String> command = connect.sync(); command.del("colors"); String[] array = {"black", "white", "red", "blue", "yellow"}; //最后一个元素的索引为0 command.lpush("colors", array); //批量插入元素 command.lset("colors", 0, "yellow2"); //设置索引为0的元素 System.out.println(command.llen("colors")); //长度 System.out.println(command.lindex("colors", 1)); //取索引为1的元素 System.out.println(command.lpop("colors")); //取第一个元素,并从List中删除 System.out.println(command.lastsave().toString()); //最后保存日期 System.out.println(command.lrange("colors", 2, 2)); //取索引范围的元素 //以流的方式处理 Long count = command.lrange(new ValueStreamingChannel<String>() { @Override public void onValue(String value) { System.out.println(value); } }, "colors", 2, 3); System.out.println("count=" + count); } private static void open(){ client = RedisClient.create(RedisURI.create("redis://192.168.134.134:7001")); client.setDefaultTimeout(3000, TimeUnit.MILLISECONDS); //创建连接池 pool = ConnectionPoolSupport .createGenericObjectPool(() -> client.connect(), new GenericObjectPoolConfig()); } private static void close(){ pool.close(); client.shutdown(); } }
集群环境下使用Lettuce:
public class ClusterTest { private static RedisClusterClient client; private static GenericObjectPool<StatefulRedisClusterConnection<String, String>> pool; public static void main(String[] args) { open(); try(StatefulRedisClusterConnection<String, String> connect = pool.borrowObject()){ //获得池对象 RedisAdvancedClusterCommands<String, String> syncCommand = connect.sync(); syncCommand.set("uid", "cjm"); String result = syncCommand.get("uid"); System.out.println(result); //归还池的对象 pool.returnObject(connect); }catch(Exception ex){ ex.printStackTrace(); }finally{ close(); } } private static void open(){ ArrayList<RedisURI> list = new ArrayList<>(); list.add(RedisURI.create("redis://192.168.134.134:7001")); list.add(RedisURI.create("redis://192.168.134.134:7002")); list.add(RedisURI.create("redis://192.168.134.134:7003")); client = RedisClusterClient.create(list); pool = ConnectionPoolSupport .createGenericObjectPool(() -> client.connect(), new GenericObjectPoolConfig()); } private static void close(){ pool.close(); client.shutdown(); } }
相关推荐
Lettuce是一个可伸缩线程安全的Redis客户端。多个线程可以共享同一个RedisConnection。它利用优秀netty NIO框架来高效地管理多个连接。 示例代码: RedisClient client = new RedisClient("localhost") ...
编写本文时所使用的版本为超长警告:这篇文章断断续续花了两周完成,超过4万字Lettuce简介Lettuce 是一个高性能基于 Java 编写的 Redis 驱动
lettuce - 高级Java Redis客户端,用于线程安全同步,异步和reactive用法。 支持群集,Sentinel,管道和编解码器。
java redis源码 anatomy-lettuce 庖丁解架构之 Redis Java 客户端 Lettuce 架构解剖和源码精读相关代码
莴苣是一个可扩展的线程安全redis客户端,用于同步,
【redis官方推荐】Redisson 是使用熟悉的Java数据结构来发挥Redis的威力,基于lettuce Redis客户端和Netty 4 ,兼容 Redis 2.6 and JDK 1.6 ,使用Apache License 2.0授权协议,阅读 wiki 来获取更多使用信息...
该项目的主要目标是在`SpringBoot`应用中集成`Lettuce`作为Redis客户端,实现对Redis的高效访问和操作。同时,通过自定义配置和注入不同的`RedisTemplate`实例,可以轻松实现多库切换,满足不同场景下的需求。 2. **...
Lettuce是可伸缩的线程安全Redis客户端,用于同步,异步和React式使用。 如果多个线程避免阻塞和事务操作(例如BLPOP和MULTI / EXEC则可以共享一个连接。 生菜是用建造的。 支持高级Redis功能,例如Sentinel,群集...
Lettuce 是一个可扩展的线程安全 Redis 客户端,适用于同步、异步和反应式使用。如果多个线程避免阻塞和事务性操作(例如BLPOP和 MULTI/ ) ,则它们可以共享一个连接EXEC。Lettuce是用netty构建的。支持高级 Redis ...
- 提供了对不同Redis客户端的整合(Lettuce和Jedis) - 提供了RedisTemplate统一API来操作Redis - 支持Redis的发布订阅模型 - 支持Redis哨兵和Redis集群 - 支持基于Lettuce的响应式编程 - 支持基于JDK、JSON、字符串...
支持单节点Redis,主从Sentinel配置和分片Redis群集配置。 沙拉还确保生菜引发的所有异常都可以在Scala期货中进行映射。 如果直接使用生菜,则生菜中的异常可能不会触发Scala中的Future.failed 。用法SaladAPI是...
1. **选择一个Java Redis客户端**:在 Java 中有多个可用的 Redis 客户端库,比如 Jedis 和 Lettuce。这里我们将使用 Jedis 作为示例。 2. **添加依赖**:在你的 Java 项目中添加 Jedis 依赖。如果是使用 Maven,可
莴苣是一个可扩展的线程安全redis客户端,用于同步,
redis4cats:基于Cats Effect,Fs2和生菜构建的Redis客户端
celtuce:莴苣的Clojure包装器(Java Redis客户端)
高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。主要在一些分布式缓存框架上使用比较多。基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的...
最新版Lettuce文档,最牛逼的Redis客户端,支持异步及自定义Command,已裁剪成适合在Kindle上阅读的尺寸。
springboot2配置Lettuce连接池完整代码,采用common2-pool连接池,Lettuce为redis高级客户端,由于阅读官网文档太简单,无法完成配置,所有本示例是通过阅读源码后编写的
同时还介绍使用Java的两大redis客户端:Jedis与Lettuce用于读写redis-cluster的数据的一般方法。再通过官方文档以及互联网的相关技术文档,给出redis-cluster架构下的读写能力的优化方案,包括官方的推荐的扩展redis...