在一些特定的业务场景,或者数据量比较大的时候,redis可以像数据库一样分表分库,它的概念是分片,当数据量很大的时候,你需要把数据分配到不同的机器上,比如100条数据,redis-a有50条,redis-b有50条数据。jedis提供了这样操作的实现类,ShardedJedis。
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
public class redisShardedConcurrent {
private static ShardedJedisPool redisPool ;
void init() {
redis.clients.jedis.JedisPoolConfig config = new redis.clients.jedis.JedisPoolConfig();
config.setMaxIdle(1000);
config.setMaxTotal(500);
List<JedisShardInfo> shards = Arrays.asList(
new JedisShardInfo("192.168.1.68", 6379),
new JedisShardInfo("127.0.0.1",6379));
//创建一个分片连接池
redisPool = new ShardedJedisPool(config,shards);
}
public static void main(String[] args) throws InterruptedException {
final redisShardedConcurrent redisConcurrent = new redisShardedConcurrent();
redisConcurrent.init();
final AtomicLong counter = new AtomicLong(0);
final AtomicBoolean stopFlag = new AtomicBoolean(false);
final int threadCount = 1000;
for (int i = 0; i < threadCount; i++) {
final String sss = i + "";
new Thread(new Runnable() {
@Override
public void run() {
while (!stopFlag.get()) {
ShardedJedis jedis = redisPool.getResource();
jedis.set(sss, "aaasasdasdasdasdasdasdasdasdasdasdasdasdasaaaaaaaaaaaaaaaaaa");
redisPool.returnResource(jedis);
counter.incrementAndGet();
}
}
}).start();
}
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.err.println("*** stop client ***");
stopFlag.set(true);
}
});
long startTime = System.currentTimeMillis();
while (!stopFlag.get()) {
Thread.sleep(1000);
final long count = counter.get();
long currentTime = System.currentTimeMillis();
long qps = count * 1000 / (currentTime - startTime);
System.out.println("qps=" + qps);
if ((currentTime - startTime) / 1000 > 10) {
counter.set(0);
startTime = currentTime;
System.out.println("reset counter");
}
}
}
}
其实用方式也是很简单,创建一个分片连接池,从池里面获取ShardedJedis,然后进行操作,选择存储到哪个redis的时候,它有自己的一套算法,保证了一致性,但是在并发测试的时候,他的性能略低于jedis,主要是需要去计算存储到哪台redis上消耗了性能。