package com.gqshao.redis.connection; import org.junit.Test; import redis.clients.jedis.*; import java.util.Arrays; import java.util.List; /** * Redis的Java客户端Jedis的八种调用方式 */ public class ConnectionTest { /** * 普通连接方式 * Simple SET: 95.437 seconds */ @Test public void testNormal() { Jedis jedis = new Jedis("192.168.3.98", 6379); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { String result = jedis.set("n" + i, "n" + i); } long end = System.currentTimeMillis(); System.out.println("Simple SET: " + ((end - start) / 1000.0) + " seconds"); // 销毁 jedis.close(); } /** * 普通连接池方式 * POOL SET: 99.789 seconds * */ @Test public void testSimplePool() { JedisPool pool = new JedisPool(new JedisPoolConfig(), "192.168.3.98", 6379, 0); Jedis jedis = pool.getResource(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { String result = jedis.set("np" + i, "vp" + i); } long end = System.currentTimeMillis(); pool.returnResource(jedis); System.out.println("POOL SET: " + ((end - start) / 1000.0) + " seconds"); // 销毁 jedis.close(); } /** * 事务方式(Transactions) * 通过multi(开启一个事务)、exec(执行)、discard(放弃事务) * Transaction SET: 0.926 seconds */ @Test public void testMulti() { Jedis jedis = new Jedis("192.168.3.98", 6379); long start = System.currentTimeMillis(); Transaction tx = jedis.multi(); for (int i = 0; i < 100000; i++) { tx.set("t" + i, "v" + i); } List<Object> results = tx.exec(); long end = System.currentTimeMillis(); System.out.println("Transaction SET: " + ((end - start) / 1000.0) + " seconds"); jedis.close(); } /** * 管道(Pipelining) * 异步方式,一次发送多个指令 * Pipelined SET: 0.742 seconds */ @Test public void testPipelining() { Jedis jedis = new Jedis("192.168.3.98", 6379); Pipeline pipeline = jedis.pipelined(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { pipeline.set("p" + i, "p" + i); } List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("Pipelined SET: " + ((end - start) / 1000.0) + " seconds"); jedis.close(); } /** * 管道中调用事务 * 测试中会发生 java.lang.StackOverflowError */ @Test public void testPipeliningWithMulti() { Jedis jedis = new Jedis("192.168.3.98", 6379); long start = System.currentTimeMillis(); Pipeline pipeline = jedis.pipelined(); pipeline.multi(); // >10000次会内存溢出 /*for (int i = 0; i < 100000; i++) { pipeline.set("" + i, "" + i); }*/ for (int i = 0; i < 1000; i++) { pipeline.set("" + i, "" + i); } pipeline.exec(); List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("Pipelined transaction: " + ((end - start) / 1000.0) + " seconds"); jedis.close(); } /** * 分布式直接连接同步调用 * 通过List<JedisShardInfo>中Info的顺序和key,计算hash,确定key为固定的Redis上 * Simple@Sharing SET: 95.106 seconds */ @Test public void testshardNormal() { List<JedisShardInfo> shards = Arrays.asList( new JedisShardInfo("192.168.3.98", 6379), new JedisShardInfo("192.168.3.98", 6380)); ShardedJedis sharding = new ShardedJedis(shards); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { String result = sharding.set("sn" + i, "n" + i); } long end = System.currentTimeMillis(); System.out.println("Simple@Sharing SET: " + ((end - start) / 1000.0) + " seconds"); sharding.close(); } /** * 分布式直接连接管道异步调用,key的分配结果同 分布式直接连接同步调用 相同 * Pipelined@Sharing SET: 0.856 seconds */ @Test public void testshardPipelining() { List<JedisShardInfo> shards = Arrays.asList( new JedisShardInfo("192.168.3.98", 6379), new JedisShardInfo("192.168.3.98", 6380)); 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.close(); } /** * 分布式连接池同步调用 */ @Test public void testShardSimplePool() { List<JedisShardInfo> shards = Arrays.asList( new JedisShardInfo("192.168.3.98", 6379), new JedisShardInfo("192.168.3.98", 6380)); ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards); ShardedJedis one = pool.getResource(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { String result = one.set("spn" + i, "n" + i); } long end = System.currentTimeMillis(); pool.returnResource(one); System.out.println("Simple@Pool SET: " + ((end - start) / 1000.0) + " seconds"); pool.destroy(); } /** * 分布式连接池异步调用相同,返回管道与分布式直接连接管道异步调用 * Simple@Pool SET: 94.094 seconds */ @Test public void testShardPoolWithPipelined() { List<JedisShardInfo> shards = Arrays.asList( new JedisShardInfo("localhost", 6379), new JedisShardInfo("localhost", 6380)); 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(); } }
相关推荐
开发者可以根据需求调用这些方法来执行相应的Redis命令,而无需直接与Jedis实例交互,从而降低了代码的复杂性并提高了可维护性。 `JedisProvider`则扮演着提供Jedis实例的角色,它负责初始化和管理Jedis连接。考虑...
例如,当我们调用`Jedis.set(key, value)`时,实际上Jedis会构造Redis命令字符串`SET key value`,然后通过网络发送到Redis服务器。命令响应也会被解析成Java对象返回。 对于更复杂的操作,如`Jedis.hgetAll(key)`...
为了减少这种人为错误,可以采用封装JedisPool的方式,强制程序员通过一个中间层来访问Jedis实例。通过自定义的RedisPool类,程序员在使用Jedis时必须通过CallWithJedis接口来传递需要执行的操作,这样就能保证每次...
- **基本操作**:通过 `Jedis` 对象调用方法,如 `set`、`get` 等。 #### 五、总结 Redis 作为一种高性能的非关系型数据库,在实际应用中扮演着重要的角色。通过对 Redis 的学习和实战,可以有效地解决缓存问题,...
在Java开发中,有两个主流的Redis客户端框架——Jedis和Redisson,它们分别提供了不同的特性和使用方式。 **1. Jedis** Jedis是Redis的原生Java客户端,它的API设计紧密贴合Redis命令,提供了对Redis所有命令的直接...
3. 灵活性:可以通过调整Redis数据结构中的参数来适应不同的限流需求。 但同时,需要注意的是,Redis本身不是无状态的,因此在多实例部署时,需要考虑数据一致性问题,例如使用Sentinel或Cluster来确保高可用性。...
- **标题**:“jedis-2.9.0.jar”——这指的是 Jedis 库的一个特定版本(2.9.0),它是用于与 Redis 数据库进行交互的 Java 客户端库。 - **描述**:描述中提到的内容主要集中在如何开始在 Java 中使用 Redis,并...
5. **Jedis与Lettuce客户端**: Spring Data Redis 支持Jedis和Lettuce两种Redis客户端,你可以根据需求选择适合的客户端库。 最后,Maven在其中的作用主要体现在项目管理和依赖管理上: 1. **依赖管理**: 在`pom....
为了解决这个问题,一种常见的解决方案是使用集中式的session存储服务,如Redis,来实现session数据的共享。本文将详细介绍如何在Tomcat环境下利用Redis实现session共享。 #### 二、环境搭建与配置 **1. 测试环境*...
SpringBoot 搭建——整合 Redis 与 MyBatis 的实战指南 在现代的 Java 开发中,Spring Boot 已经成为了快速构建应用的首选框架,它极大地简化了 Spring 应用的初始设置和配置。本教程将详细介绍如何使用 Spring ...
在Java应用中,我们首先需要在项目中引入Jedis的依赖,然后通过Jedis实例连接到Redis服务器。基本操作包括设置键值对(`set(key, value)`)和获取键对应的值(`get(key)`)。在这个验证码场景中,我们可以用用户的...
文中提到了一个非常实用的工具库——jedis,这是Java应用中操作Redis的一个客户端库。通过在项目中引入jedis的依赖,可以方便地在Java代码中执行Redis命令。例如,创建一个分布式锁的操作可以通过调用`setnx`方法...
│ Java面试题80:java访问redis级redis集群?.mp4 │ Java面试题81:微信公众号分类和微信开发原理.mp4 │ Java面试题82:怎么把微信和业务平台进行绑定.mp4 │ Java面试题83:项目的分类和项目参与者.mp4 │ Java...
5. **stax**:Streaming API for XML(STAX)是Java中处理XML的一种低级别的、事件驱动的API,它允许程序员通过迭代器逐事件地读取和写入XML流,提供了高效的XML处理方式。 6. **redis**:Redis是一个开源的、高...
myredis-spring-boot-starter也不例外,它包含了一组与Redis相关的依赖库,如Jedis、Lettuce等,以及Spring Boot的自动配置类,这些配置类会根据应用的环境自动配置Redis的相关设置。 在使用myredis-spring-boot-...
缓存框架,如RedisTemplate和Jedis,用于管理和优化Redis、Memcached等缓存服务,提升数据访问速度。 接着,缓存、数据库、搜索引擎和消息队列是业务性能的关键。缓存能有效解决热点数据访问问题,提高查询性能。...