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、因为事务是在服务器端实现,而在分布式中,每批次的调用对象都可能访问不同的机器,所以,没法进行事务。
相关推荐
它使用Redis的`Jedis`客户端库进行通信,通过`KeyPrefix`策略来区分不同应用的会话键,避免了键冲突。 `RedisSession`是`RedisSessionManager`内部用于表示会话的对象,它继承自`org.apache.catalina.Session`,并...
Redis是一种高性能的键值对数据存储系统,常用于缓存、数据库和消息中间件等场景。这个名为"Redis-x64-3.2.100"的版本是Redis为64位操作系统编译的3.2.100稳定版,提供了高效的数据处理能力。在3.2版本中,Redis引入...
使用这个配置,当用户在任何一台服务器上创建或更新session时,Tomcat会调用Jedis将这些变化同步到Redis。然后,其他处理同一用户请求的服务器可以通过相同的session ID从Redis中获取并使用这些session数据,实现...
Jedis的使用非常简便,开发者可以通过简单的API调用来实现与Redis服务器的交互。 Spring Data Redis是Spring Framework的一部分,它为Redis提供了一套面向对象的API,简化了开发者的操作。通过Spring Data Redis,...
例如,创建一个`RedisKeyRepository`,Spring Data会自动为我们生成底层的Jedis调用。同时,Spring Data Redis还提供了Template模式,允许自定义更复杂的操作逻辑。 总的来说,`spring-data-redis-2.1.5.RELEASE....
Jedis是Java开发的一款高效的Redis客户端库,广泛用于与Redis服务器进行交互,处理各种数据结构如字符串、哈希、列表、集合、有序集合等。在2.10.0-m1版本中,Jedis提供了对Redis最新特性的支持以及一些性能优化和...
Jedis是Java开发的一款高效的Redis客户端库,广泛用于与Redis服务器进行交互,支持各种Redis命令。Jedis 3.4.1是该库的一个稳定版本,提供了许多改进和新特性,旨在提高性能、稳定性和易用性。在这个版本中,我们...
Jedis 是一个 Java 编写的 Redis 客户端,提供了丰富的 API 供开发者进行数据操作。 在开始之前,我们需要了解如何安装 Redis。首先,从 Redis 官方网站下载最新稳定版的 Redis 源代码或预编译二进制包。解压缩后,...
- 命令接口:Jedis通过一系列方法封装了Redis命令,如`set`、`get`、`lpush`、`rpop`等,使得在Java应用中调用Redis操作非常方便。 - 事务支持:Jedis支持Redis的事务特性,允许用户在一个原子操作中执行多个命令...
Redis是一种高性能的键值对数据存储系统,常用于缓存和数据库。Jedis是Java语言中广泛使用的Redis客户端库,提供了丰富的API以便于与Redis服务器进行交互。在本测试环境中,我们将探讨如何利用Jedis进行Redis的基本...
3. 连接Redis:调用Jedis的`connect()`方法建立连接。 4. 执行命令:利用Jedis对象的方法执行Redis命令,例如`set("key", "value")`设置键值对。 5. 关闭连接:操作完成后,记得调用`close()`方法关闭连接,释放资源...
2. **操作命令**:通过Jedis对象调用各种方法执行Redis命令,如`set(key, value)`用于设置键值对,`get(key)`用于获取键对应的值。 3. **事务处理**:Jedis支持Redis的事务功能,可以使用`multi()`、`exec()`和`...
在这个"redis-2.6.12(32系统)安装包"中,我们关注的是Redis在32位操作系统上的部署和使用,同时注意到它还包含与Java数据库的依赖包,这可能意味着它提供了一种方式来在Java应用中集成Redis。 首先,让我们详细...
Redis支持RDB(快照)和AOF(追加日志)两种持久化方式,Jedis提供了相应的方法来触发这些操作。 5. 连接池: 为了提高性能和资源利用率,Jedis支持连接池管理,可以使用JedisPool类创建和管理连接池。 6. 集群...
Jedis是Java开发的一款高效的Redis客户端,用于与Redis服务器进行通信。版本2.8.0是Jedis的一个稳定版本,提供了丰富的Redis操作功能,并优化了性能和稳定性。在这个压缩包"jedis-jedis-2.8.0.tar.gz"中,包含了...
Jedis是Java语言中的一款非常流行的Redis客户端库,它提供了丰富的API来操作Redis数据库。`jedis-jedis-2.6.0.tar.gz`是一个压缩包文件,包含了Jedis库的2.6.0版本。这个版本的发布旨在提供稳定且高效的服务,支持...
Jedis是Java开发的一款高效的Redis客户端库,广泛用于与Redis服务器进行交互,支持各种Redis命令。Jedis 3.4.1是该库的一个稳定版本,提供了对Redis 6.x的支持,同时也修复了一些已知的问题,提升了性能和稳定性。 ...
Jedis是Java开发的一款高效的Redis客户端,用于与Redis服务器进行通信。这个压缩包"jedis-jedis-1.3.1.tar.gz"包含了Jedis库的1.3.1版本,这是一个广泛使用的版本,适用于那些需要在Java项目中集成Redis功能的开发者...
1. **Redis连接**:使用Jedis或Lettuce等Java客户端库建立到Redis服务器的连接。 2. **主从配置操作**:包括设置和读取主从节点信息,可能有手动触发主从同步的API调用。 3. **Sentinel接口使用**:通过Sentinel API...
5. **关闭连接**:使用完毕后,记得调用`jedis.close()`关闭连接,以释放资源。 通过以上步骤,你可以在Java项目中顺利集成Redis和Jedis,实现高效的数据存储和访问。在实际开发中,还需要注意数据的安全性、并发...