1. 程式人生 > >redis分片技術

redis分片技術

需求:

  如果將全部資料都儲存到一臺redis中,那麼如果該伺服器損壞,則影響全部的服務;

  使用單臺redis記憶體設定一般不要超過1G,但是有些業務資料量很大,如果不修改記憶體,則資料無法儲存;

方案:

  採用redis分片技術;

  優點:

    1.使用redis分片可以實現記憶體資料的動態擴容;

    2.使用分片,每臺redis節點中儘可能儲存1/n的資料量,防止資料的丟失;

    3.對於使用者而言,整個redis的分片就是一個服務;n臺伺服器作為一個整體的伺服器共同為使用者服務;

1.  分片搭建:

    1.1複製配置檔案:新建shards資料夾,將redis.conf檔案複製到shards檔案中,並且複製3分,改名字,改埠號;

[[email protected] redis]# ls
00-RELEASENOTES  deps      MANIFESTO   runtest-cluster   src
BUGS             dump.rdb  README.md   runtest-sentinel  tests
CONTRIBUTING     INSTALL   redis.conf  sentinel.conf     utils
COPYING          Makefile  runtest     shards
[[email protected] redis]# cp redis.conf shards
/redis-6379.conf [[email protected] redis]# cp redis.conf shards/redis-6380.conf [[email protected] redis]# cp redis.conf shards/redis-6381.conf [[email protected] redis]# ll

結果:

 [[email protected] redis]# cd shards/
 [[email protected] shards]# ll
 total 144
 -rw-r--r--. 1 root root 46696 Nov 2 22:51 redis-6379.conf


 -rw-r--r--. 1 root root 46696 Nov 2 22:51 redis-6380.conf
 -rw-r--r--. 1 root root 46696 Nov 2 22:51 redis-6381.conf

    1.2確認啟動是否成功:

[[email protected] shards]# redis-server redis-6379.conf 
[[email protected] shards]# redis-server redis-6380.conf 
[[email protected] shards]# redis-server redis-6381.conf 
[[email protected] shards]# ps -ef |grep redis
root      2845     1  0 22:58 ?        00:00:00 redis-server *:6379         
root      2849     1  0 22:58 ?        00:00:00 redis-server *:6380         
root      2853     1  0 22:59 ?        00:00:00 redis-server *:6381         
root      2857  2585  0 22:59 pts/0    00:00:00 grep redis

    1.3測試:

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

public class TestShardRedis {

    @Test
    public void testShard(){
        /**
         * 建立分片的物件
         * 1.poolConfig    標示池的大小
         * 2.shards        redis分片的節點資訊
         */
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(1000);
        poolConfig.setTestOnBorrow(true);//獲取連線時,先檢測,如果不行就換一個

        List<JedisShardInfo> shards = new ArrayList<>();
        shards.add(new JedisShardInfo("192.168.25.132", 6379));
        shards.add(new JedisShardInfo("192.168.25.132", 6380));
        shards.add(new JedisShardInfo("192.168.25.132", 6381));

        ShardedJedisPool pool = new ShardedJedisPool(poolConfig, shards);

        //獲取redis的連線
        ShardedJedis jedis = pool.getResource();

        jedis.set("shards", "儲存分片的資料");
        System.out.println(jedis.get("shards"));

        //還回連線到pool
        pool.returnResource(jedis);
    }
}

輸出:儲存分片的資料