4.redis分片

来源:互联网 发布:海阔淘宝客助手 编辑:程序博客网 时间:2024/05/29 10:47

    在一些特定的业务场景,或者数据量比较大的时候,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上消耗了性能。

0 0