`
yugouai
  • 浏览: 498561 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Redis-Jedis的八种调用方式

 
阅读更多

package com.irwin.redis;

import java.util.Arrays;
import java.util.List;

import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPipeline;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.jedis.Transaction;

public class RedisConnectKindsTests {
	Jedis jedis  = new Jedis("192.168.56.101", 6379);
	
	//普通同步方式
    //最简单和基础的调用方式,每次执行命令后都可以返回结果,标记是否成功
	@Test
	public void testNormal(){
		
		long start = System.currentTimeMillis();
	    for (int i = 0; i < 5; i++) {
	        String result = jedis.set("n" + i, "n" + i);
	        System.out.println(result);
	    }
	    long end = System.currentTimeMillis();
	    System.out.println("Simple SET: " + ((end - start)/1000.0) + " seconds");
	    jedis.disconnect();
	}
	
	//事务方式
	//保障一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令
	//调用jedis.watch(…)方法来监控key,如果调用后key值发生变化,则整个事务会执行失败。
	//另外,事务中某个操作失败,并不会回滚其他操作。这一点需要注意。还有,我们可以使用discard()方法来取消事务。
	@Test
	public void test2Transactions(){
		long start = System.currentTimeMillis();
		Transaction tx = jedis.multi();
		for (int i = 0; i < 10; i++) {
			tx.set("t"+i, "t"+i);
		}
		System.out.println(jedis.watch("t1","t2"));
		
		//tx.discard();
		List<Object> results = tx.exec();
		long end = System.currentTimeMillis();
		jedis.disconnect();
	}
	
	//管道
	//要采用异步方式,一次发送多个指令,不同步等待其返回结果
	@Test
	public void test3Pipelined(){
		Pipeline pipeline = jedis.pipelined();
		for (int i = 0; i < 10; i++) {
			pipeline.set("p"+i, "p"+i);
		}
		List<Object> results = pipeline.syncAndReturnAll();
		for (Object object : results) {
			System.out.println(object);
		}
		jedis.disconnect();
	}
	
	//管道中调用事务
	//Jedis提供的方法而言,是可以做到在管道中使用事务
	@Test
	public void test4combPipelineTrans() {
		Pipeline pipeline = jedis.pipelined();
		pipeline.multi();
		
		for (int i = 0; i < 10; i++) {
			pipeline.set("" + i, "" + i);
		}
		
		List<Object> results = pipeline.syncAndReturnAll();
		jedis.disconnect();
	}
	
	//分布式直连同步调用
	//分布式直接连接,并且是同步调用,每步执行都返回执行结果。类似地,还有异步管道调用
	@Test
	public void test4ShardNormal(){
		List<JedisShardInfo> shards = Arrays.asList(
				new JedisShardInfo("192.168.56.101", 6379),
				new JedisShardInfo("192.168.56.101", 6179)
				);
		
		ShardedJedis sharding = new ShardedJedis(shards);
		
		for (int i = 0; i < 10; i++) {
			String result = sharding.set("sn" + i, "n" + i);
			System.out.println(result);
		}
		sharding.disconnect();
	}
	
	//分布式直连异步调用
	@Test
	public void test6shardpipelined() {
		List<JedisShardInfo> shards = Arrays.asList(
				new JedisShardInfo("192.168.56.101", 6379),
				new JedisShardInfo("192.168.56.101", 6179)
				);

	    ShardedJedis sharding = new ShardedJedis(shards);

	    ShardedJedisPipeline pipeline = sharding.pipelined();
	    long start = System.currentTimeMillis();
	    for (int i = 0; i < 100000; i++) {
	        pipeline.set("sp" + i, "p" + i);
	    }
	    List<Object> results = pipeline.syncAndReturnAll();
	    long end = System.currentTimeMillis();
	    System.out.println("Pipelined@Sharing SET: " + ((end - start)/1000.0) + " seconds");

	    sharding.disconnect();
	}
	
	//分布式连接池同步调用
	//分布式调用代码是运行在线程中,那么上面两个直连调用方式就不合适了,
	//因为直连方式是非线程安全的,这个时候,你就必须选择连接池调用
	@Test
	public void test7shardSimplePool() {
		List<JedisShardInfo> shards = Arrays.asList(
				new JedisShardInfo("192.168.56.101", 6379),
				new JedisShardInfo("192.168.56.101", 6179)
				);

	    ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards);

	    ShardedJedis one = pool.getResource();

	    long start = System.currentTimeMillis();
	    for (int i = 0; i < 10; i++) {
	        String result = one.set("spn" + i, "n" + i);
	        System.out.println(result);
	    }
	    long end = System.currentTimeMillis();
	    pool.returnResource(one);
	    System.out.println("Simple@Pool SET: " + ((end - start)/1000.0) + " seconds");

	    pool.destroy();
	}
	
	//分布式连接池异步调用
	@Test
	public void test8shardPipelinedPool() {
		List<JedisShardInfo> shards = Arrays.asList(
				new JedisShardInfo("192.168.56.101", 6379),
				new JedisShardInfo("192.168.56.101", 6179)
				);

	    ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards);

	    ShardedJedis one = pool.getResource();

	    ShardedJedisPipeline pipeline = one.pipelined();

	    long start = System.currentTimeMillis();
	    for (int i = 0; i < 100000; i++) {
	        pipeline.set("sppn" + i, "n" + i);
	    }
	    List<Object> results = pipeline.syncAndReturnAll();
	    long end = System.currentTimeMillis();
	    pool.returnResource(one);
	    System.out.println("Pipelined@Pool SET: " + ((end - start)/1000.0) + " seconds");
	    pool.destroy();
	}
}

 

总结:

1、事务和管道都是异步模式。在事务和管道中不能同步查询结果。

2、事务和管道都是异步的,个人感觉,在管道中再进行事务调用,没有必要,不如直接进行事务模式。

3、分布式中,连接池的性能比直连的性能略好

4、分布式调用中不支持事务。

5、因为事务是在服务器端实现,而在分布式中,每批次的调用对象都可能访问不同的机器,所以,没法进行事务。

分享到:
评论

相关推荐

    tomcat-redis-session-manager源码

    它使用Redis的`Jedis`客户端库进行通信,通过`KeyPrefix`策略来区分不同应用的会话键,避免了键冲突。 `RedisSession`是`RedisSessionManager`内部用于表示会话的对象,它继承自`org.apache.catalina.Session`,并...

    Redis-x64-3.2.100 Jedis-2.9.0 pool2-2.42例子及jar.rar

    Redis是一种高性能的键值对数据存储系统,常用于缓存、数据库和消息中间件等场景。这个名为"Redis-x64-3.2.100"的版本是Redis为64位操作系统编译的3.2.100稳定版,提供了高效的数据处理能力。在3.2版本中,Redis引入...

    commons-pool2-2.0.jar  jedis-2.7.2.jar  tomcat-redis-session-manage-tomcat8.jar

    使用这个配置,当用户在任何一台服务器上创建或更新session时,Tomcat会调用Jedis将这些变化同步到Redis。然后,其他处理同一用户请求的服务器可以通过相同的session ID从Redis中获取并使用这些session数据,实现...

    spring-data-redis-1.6.0.RELEASE.jar + jedis-2.7.2.jar

    Jedis的使用非常简便,开发者可以通过简单的API调用来实现与Redis服务器的交互。 Spring Data Redis是Spring Framework的一部分,它为Redis提供了一套面向对象的API,简化了开发者的操作。通过Spring Data Redis,...

    redis相关jar包(redis2.1.5、jedis2.9.0)

    例如,创建一个`RedisKeyRepository`,Spring Data会自动为我们生成底层的Jedis调用。同时,Spring Data Redis还提供了Template模式,允许自定义更复杂的操作逻辑。 总的来说,`spring-data-redis-2.1.5.RELEASE....

    jedis-jedis-2.10.0-m1.zip

    Jedis是Java开发的一款高效的Redis客户端库,广泛用于与Redis服务器进行交互,处理各种数据结构如字符串、哈希、列表、集合、有序集合等。在2.10.0-m1版本中,Jedis提供了对Redis最新特性的支持以及一些性能优化和...

    jedis-jedis-3.4.1.tar.gz

    Jedis是Java开发的一款高效的Redis客户端库,广泛用于与Redis服务器进行交互,支持各种Redis命令。Jedis 3.4.1是该库的一个稳定版本,提供了许多改进和新特性,旨在提高性能、稳定性和易用性。在这个版本中,我们...

    redis的安装包以及jedis 的jar

    Jedis 是一个 Java 编写的 Redis 客户端,提供了丰富的 API 供开发者进行数据操作。 在开始之前,我们需要了解如何安装 Redis。首先,从 Redis 官方网站下载最新稳定版的 Redis 源代码或预编译二进制包。解压缩后,...

    jedis-jedis-2.2.0.tar.gz

    - 命令接口:Jedis通过一系列方法封装了Redis命令,如`set`、`get`、`lpush`、`rpop`等,使得在Java应用中调用Redis操作非常方便。 - 事务支持:Jedis支持Redis的事务特性,允许用户在一个原子操作中执行多个命令...

    redis使用jedis测试

    Redis是一种高性能的键值对数据存储系统,常用于缓存和数据库。Jedis是Java语言中广泛使用的Redis客户端库,提供了丰富的API以便于与Redis服务器进行交互。在本测试环境中,我们将探讨如何利用Jedis进行Redis的基本...

    redis-2.6.jar

    3. 连接Redis:调用Jedis的`connect()`方法建立连接。 4. 执行命令:利用Jedis对象的方法执行Redis命令,例如`set("key", "value")`设置键值对。 5. 关闭连接:操作完成后,记得调用`close()`方法关闭连接,释放资源...

    征服 Redis + Jedis

    2. **操作命令**:通过Jedis对象调用各种方法执行Redis命令,如`set(key, value)`用于设置键值对,`get(key)`用于获取键对应的值。 3. **事务处理**:Jedis支持Redis的事务功能,可以使用`multi()`、`exec()`和`...

    redis-2.6.12(32系统)安装包

    在这个"redis-2.6.12(32系统)安装包"中,我们关注的是Redis在32位操作系统上的部署和使用,同时注意到它还包含与Java数据库的依赖包,这可能意味着它提供了一种方式来在Java应用中集成Redis。 首先,让我们详细...

    jedis-jedis-1.5.0-RC1.tar.gz

    Redis支持RDB(快照)和AOF(追加日志)两种持久化方式,Jedis提供了相应的方法来触发这些操作。 5. 连接池: 为了提高性能和资源利用率,Jedis支持连接池管理,可以使用JedisPool类创建和管理连接池。 6. 集群...

    jedis-jedis-2.8.0.tar.gz

    Jedis是Java开发的一款高效的Redis客户端,用于与Redis服务器进行通信。版本2.8.0是Jedis的一个稳定版本,提供了丰富的Redis操作功能,并优化了性能和稳定性。在这个压缩包"jedis-jedis-2.8.0.tar.gz"中,包含了...

    jedis-jedis-2.6.0.tar.gz

    Jedis是Java语言中的一款非常流行的Redis客户端库,它提供了丰富的API来操作Redis数据库。`jedis-jedis-2.6.0.tar.gz`是一个压缩包文件,包含了Jedis库的2.6.0版本。这个版本的发布旨在提供稳定且高效的服务,支持...

    jedis-jedis-3.4.1.zip

    Jedis是Java开发的一款高效的Redis客户端库,广泛用于与Redis服务器进行交互,支持各种Redis命令。Jedis 3.4.1是该库的一个稳定版本,提供了对Redis 6.x的支持,同时也修复了一些已知的问题,提升了性能和稳定性。 ...

    jedis-jedis-1.3.1.tar.gz

    Jedis是Java开发的一款高效的Redis客户端,用于与Redis服务器进行通信。这个压缩包"jedis-jedis-1.3.1.tar.gz"包含了Jedis库的1.3.1版本,这是一个广泛使用的版本,适用于那些需要在Java项目中集成Redis功能的开发者...

    redis-2.8.19主从配置+sentinel主从切换+Java源码案例

    1. **Redis连接**:使用Jedis或Lettuce等Java客户端库建立到Redis服务器的连接。 2. **主从配置操作**:包括设置和读取主从节点信息,可能有手动触发主从同步的API调用。 3. **Sentinel接口使用**:通过Sentinel API...

    redis+jedis

    5. **关闭连接**:使用完毕后,记得调用`jedis.close()`关闭连接,以释放资源。 通过以上步骤,你可以在Java项目中顺利集成Redis和Jedis,实现高效的数据存储和访问。在实际开发中,还需要注意数据的安全性、并发...

Global site tag (gtag.js) - Google Analytics