在多線程下使用Jedisredis
在不一樣的線程中使用相同的Jedis實例會發生奇怪的錯誤。可是建立太多的實現也很差由於這意味着會創建不少sokcet鏈接,也會致使奇怪的錯誤 發生。單一Jedis實例不是線程安全的。爲了不這些問題,可使用JedisPool, JedisPool是一個線程安全的網絡鏈接池。能夠用JedisPool建立一些可靠Jedis實例,能夠從池中拿到Jedis的實例。這種方式能夠解 決那些問題而且會實現高效的性能.安全
初始化JedisPool 網絡
1 |
JedisPool pool = new JedisPool( new JedisPoolConfig(), "localhost" ); |
能夠以靜態的方式處理以上代碼,它是線程安全的.多線程
JedisPoolConfig包含了許多有用的redis指定的鏈接池的默認參數。好比,若是一個鏈接300秒內沒有任何的返回Jedis將關閉這個鏈接.性能
能夠這樣使用線程
01 |
Jedis jedis = pool.getResource(); |
04 |
jedis.set( "foo" , "bar" ); |
05 |
String foobar = jedis.get( "foo" ); |
06 |
jedis.zadd( "sose" , 0 , "car" ); jedis.zadd( "sose" , 0 , "bike" ); |
07 |
Set<String> sose = jedis.zrange( "sose" , 0 , - 1 ); |
09 |
//這裏很重要,一旦拿到的jedis實例使用完畢,必需要返還給池中 |
10 |
pool.returnResource(jedis); |
設置主/從分佈code
啓用同步複製server
Redis主要爲了主/從分佈而構建。這意味着"write"請求必需要指向"master", "master"會同步複製改變的內容到"slave". "read"請求能夠(不是必須的)被指向"slave",緩解"master"的讀寫壓力.get
能夠按如下的步驟使用"master". 爲了啓用同步複製,有兩個方式去告訴"slave"將"slaveOf"到一個給定的"master":同步
1.在redis server的config文件(redis.conf)指明
2.在拿到的jedis實例中調用"slaveOf"方法並指定IP和端口
1 |
jedis.slaveOf( "192.168.1.35" , 6379 ); |
注意:"slave"也是一個redis server,也能夠接收"write"請求並不會報錯,可是改變不會被同步複製,因此若是弄反了jedis的實例則一些操做會被覆蓋.
禁用同步複製/master失敗後,提高slave
若是"master"down掉,能夠提高"slave"成爲新的"master".首先試着禁用同步複製離線的"master",若是有幾個"slave",啓用同步複製其他的"slave"到新的"master".
1 |
slave1jedis.slaveofNoOne(); |
2 |
slave2jedis.slaveOf( "192.168.1.36" , 6379 ); |