4.redis分片

    在一些特定的業務場景,或者數據量比較大的時候,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上消耗了性能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章