redis分片技術
阿新 • • 發佈:2018-11-03
需求:
如果將全部資料都儲存到一臺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); } }
輸出:儲存分片的資料