`
raymond.chen
  • 浏览: 1436822 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Redis客户端之Lettuce的使用

 
阅读更多

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高级客户端详解1

    【Lettuce-Redis高级客户端详解1】 ...以上就是关于Lettuce作为Redis高级客户端的基本介绍,包括其核心特性、连接方式和基本使用方法。Lettuce的灵活性和高性能使得它成为Java开发者在处理Redis时的理想选择。

    lettuce-高级JavaRedis客户端用于线程安全同步异步和reactive用法

    lettuce - 高级Java Redis客户端,用于线程安全同步,异步和reactive用法。 支持群集,Sentinel,管道和编解码器。

    SpringBoot2.X整合redis连接lettuce增强版本,支持多数据库切换,主从集群,哨兵

    该项目的主要目标是在`SpringBoot`应用中集成`Lettuce`作为Redis客户端,实现对Redis的高效访问和操作。同时,通过自定义配置和注入不同的`RedisTemplate`实例,可以轻松实现多库切换,满足不同场景下的需求。 2. **...

    redis客户端连接、spring boot整合、分布式锁.zip

    常见的 Redis 客户端库有 Jedis 和 Lettuce。Jedis 是一个用 Java 编写的轻量级 Redis 客户端,提供了丰富的命令支持,包括基本的数据操作和事务处理。在 Java 应用中,可以通过创建 Jedis 实例,设置服务器地址和...

    redis客户端,连接查看redis数据库

    在本场景中,"redis客户端,连接查看redis数据库"指的是使用特定的客户端工具来连接到Redis服务器,以便管理和操作存储在Redis中的数据。这里我们主要讨论如何连接Redis数据库以及常用的Redis客户端。 1. **Redis...

    redis客户端

    在Java环境中,虽然可以直接通过Jedis或Lettuce等库连接Redis,但有时使用图形化的Redis客户端会更加直观和方便,特别是对于开发、调试和运维来说。 "redis-desktop-manager-0.9.3.817.exe" 是一个名为Redis ...

    redis客户端和redis绿色免安装版和redis插件

    本文将深入探讨Redis客户端、Redis绿色免安装版以及与Java开发相关的Redis插件。 首先,Redis客户端在开发和管理Redis服务器时起着至关重要的作用。`redis-desktop-manager-0.8.8.384.exe` 是一个名为Redis Desktop...

    redis客户端连接工具

    这里我们将详细探讨Redis客户端工具的使用、特性和选择。 首先,Redis客户端工具分为命令行界面(CLI)工具和图形用户界面(GUI)工具。CLI工具如`redis-cli`是Redis自带的命令行工具,简洁高效,适合快速操作和...

    Redis客户端Lettuce.zip

    Lettuce是一个可伸缩线程安全的Redis客户端。多个线程可以共享同一个RedisConnection。它利用优秀netty NIO框架来高效地管理多个连接。 示例代码: RedisClient client = new RedisClient("localhost") ...

    lettuce-core,高级java redis客户端,用于线程安全同步、异步和响应性使用。支持群集、哨兵、管道和编解码器。.zip

    《lettuce-core:高级Java Redis客户端的深度解析》 Redis作为一种高性能的键值数据库,在分布式系统和微服务...如果你正在寻找一个高性能、灵活且易于使用的Redis客户端,那么Lettuce-core无疑是一个值得考虑的选项。

    Redis客户端Java服务接口封装

    首先,`RedisClientTemplate`这个名字暗示它是一个模板类,它封装了Redis客户端的基本操作,为开发者提供了一种简洁、易于使用的接口。在Java中,我们通常使用Jedis或Lettuce作为Redis的客户端库。这里,我们假设`...

    redis客户端和服务端

    为此,开发者通常会使用连接池(Connection Pool),如 Java 中的 JedisPool 或 lettuce 中的 ConnectionPool,来复用已建立的连接。连接池的主要作用: 1. **减少连接创建和释放的开销**:预先创建一定数量的连接...

    redis客户端操作实战-redisDemo.zip

    "redisDemo.zip"包含了一个名为"redisDemo-master"的项目,这很可能是用来演示Redis客户端使用的代码仓库。 一、Redis基础知识 1. Redis的数据类型:Redis支持五大数据类型,包括字符串(String)、哈希(Hash)、列表...

    redis 客户端,java编写,Mac

    本文将详细探讨 Redis 的 Java 客户端以及如何在 Mac 上使用 Java 编写的图形客户端。 首先,Java 作为跨平台的编程语言,提供了多种 Redis 客户端库,如 Jedis、Lettuce 和 Redisson。Jedis 是最常用的,它提供了...

    javaredis源码-anatomy-lettuce:庖丁解架构之RedisJava客户端Lettuce架构解剖和源码精读相关代码

    《庖丁解架构之RedisJava客户端Lettuce架构解剖与源码精读》 在IT行业中,Redis作为一款高性能的内存数据结构存储系统,被广泛应用于缓存、消息队列等多个场景。而Java作为企业级开发的主要语言,自然需要与Redis...

    Redis客户端Redisson.zip

    【redis官方推荐】Redisson 是使用熟悉的Java数据结构来发挥Redis的威力,基于lettuce Redis客户端和Netty 4 ,兼容 Redis 2.6 and JDK 1.6 ,使用Apache License 2.0授权协议,阅读 wiki 来获取更多使用信息...

    redis服务端和客户端

    Spring Data Redis支持Jedis和Lettuce两种Redis客户端。Jedis是较早的Redis Java客户端,轻量级且性能较好,但对Redis新特性的支持可能稍有滞后。Lettuce则是异步、基于Netty的客户端,适合处理高并发场景,且对...

    redis客户端Java代码实例

    本篇文章将深入探讨如何在Java项目中使用Redis客户端,主要以Jedis为例,同时也会提及Lettuce库。 首先,让我们导入Jedis库。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;redis.clients ...

    Redis使用lettuce和jedis.pdf

    Lettuce是另一个Redis客户端,它基于Netty实现,并且是一个完全的异步驱动。Lettuce支持自动重连、异步和同步用例,支持Redis的高级特性如发布订阅、事务、管道、自动故障转移和集群。 在Spring框架中,Spring Data...

    redis软件+客户端+java测试代码

    Java的Jedis是常用的Redis客户端库,它提供了一系列API,可以用来执行Redis命令,如设置和获取键值、操作列表、集合等数据结构。 "Redis入门教程.pptx"可能是关于Redis的基础教程,涵盖了Redis的基本概念、安装配置...

Global site tag (gtag.js) - Google Analytics