package com.easyooo.framework.redis;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Ignore;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
/**
* Jedis API Test
*
* simple api, transactions, Pipelining, Sharding
* @author Killer
*/
@SuppressWarnings("unused")
public class JedisApiTest {
Logger logger = LoggerFactory.getLogger(getClass());
final int COUNTER = 12000;
/**
* 最简单的调用方式,
* 本地1秒钟可设置10000 - 12000次
*/
@Test
@Ignore
public void testNormalApi(){
List<String> keys = new ArrayList<String>();
Jedis jedis = new Jedis("localhost");
long start = System.currentTimeMillis();
for(int i = 0; i< COUNTER; i++){
keys.add("n" + i);
String result = jedis.set("n" + i, "n" + i);
}
long end = System.currentTimeMillis();
logger.info("SET: " + ((end - start) / 1000.0) + " seconds");
start = System.currentTimeMillis();
List<String> values = jedis.mget(keys.toArray(new String[]{}));
end = System.currentTimeMillis();
logger.info("MGet: " + ((end - start) / 1000.0) + " seconds");
jedis.close();
}
/**
* 一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。
*/
@Test
@Ignore
public void testTransactions(){
Jedis jedis = new Jedis("localhost");
long start = System.currentTimeMillis();
Transaction tx = jedis.multi();
for(int i = 0; i< COUNTER; i++){
tx.set("t" + i, "t" + i);
// 提示使用JedisTransaction代替
if(i == 100){
System.out.println(jedis.get("t1"));
// 无法读取到,是正确的
//System.out.println(new Jedis("localhost").get("t1"));
}
}
List<Object> results = tx.exec();
long end = System.currentTimeMillis();
logger.info("Tx Set: " + ((end - start)/1000.0) + " seconds");
jedis.close();
System.out.println("results: " + results);
}
/**
* Pipelining
* 测试时间:0.287 seconds
*/
@Test
@Ignore
public void testPipelining(){
Jedis jedis = new Jedis("localhost");
Pipeline pipeline = jedis.pipelined();
long start = System.currentTimeMillis();
for(int i = 0; i< COUNTER; i++){
pipeline.set("p" + i, "p" + i);
if(i == 100){
System.out.println(jedis.get("p1"));
}
}
List<Object> results = pipeline.syncAndReturnAll();
long end = System.currentTimeMillis();
logger.info("Pipelined SET: " + ((end - start)/1000.0) + " seconds");
jedis.close();
System.out.println("result: " + results.get(0));
System.out.println(jedis.get("p1"));
}
/**
* 单机模拟分库
* 耗时:1.244 seconds
*/
@Test
@Ignore
public void testShardNormal(){
List<JedisShardInfo> shards = Arrays.asList(
new JedisShardInfo("localhost",6379),
new JedisShardInfo("localhost",6379));
ShardedJedis sharding = new ShardedJedis(shards);
long start = System.currentTimeMillis();
for (int i = 0; i < COUNTER; 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.disconnect();
sharding.close();
}
/**
* 分布式直连异步调用
* 耗时:
* 0.866 seconds
* 0.892 seconds
*/
@Test
@Ignore
public void testShardpipelined() {
List<JedisShardInfo> shards = Arrays.asList(
new JedisShardInfo("localhost",6379),
new JedisShardInfo("localhost",6379));
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();
sharding.close();
}
/**
* 分布式连接池同步调用
* 1.288 seconds
* 1.291 seconds
*/
@Test
public void testShardSimplePool() {
List<JedisShardInfo> shards = Arrays.asList(new JedisShardInfo(
"localhost", 6379), new JedisShardInfo("localhost", 6379));
ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards);
ShardedJedis one = pool.getResource();
long start = System.currentTimeMillis();
for (int i = 0; i < COUNTER; i++) {
String result = one.set("spn" + i, "n" + i);
}
long end = System.currentTimeMillis();
pool.returnResource(one);
logger.info("Simple@Pool SET: " + ((end - start) / 1000.0) + " seconds");
pool.destroy();
}
/**
* 分布式连接池异步调用
* 0.452 seconds
* 0.43 seconds
*/
@Test
@Ignore
public void testShardPipelinedPool() {
List<JedisShardInfo> shards = Arrays.asList(
new JedisShardInfo("localhost",6379),
new JedisShardInfo("localhost",6379));
ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards);
ShardedJedis one = pool.getResource();
ShardedJedisPipeline pipeline = one.pipelined();
long start = System.currentTimeMillis();
for (int i = 0; i < COUNTER; i++) {
pipeline.set("sppn" + i, "n" + i);
}
List<Object> results = pipeline.syncAndReturnAll();
long end = System.currentTimeMillis();
pool.returnResource(one);
logger.info("Pipelined@Pool SET: " + ((end - start)/1000.0) + " seconds");
pool.destroy();
}
}