多线程下使用Jedis
在不同的線(xiàn)程中使用相同的Jedis實(shí)例會(huì)發(fā)生奇怪的錯(cuò)誤。
但是創(chuàng)建太多的實(shí)現(xiàn)也不好因?yàn)檫@意味著會(huì)建立很多sokcet連接,也會(huì)導(dǎo)致奇怪的錯(cuò)誤發(fā)生。
單一Jedis實(shí)例不是線(xiàn)程安全的。
為了避免這些問(wèn)題,可以使用JedisPool, JedisPool是一個(gè)線(xiàn)程安全的網(wǎng)絡(luò)連接池。可以用JedisPool創(chuàng)建一些可靠Jedis實(shí)例,可以從池中拿到Jedis的實(shí)例。這種方式可以解決那些問(wèn)題并且會(huì)實(shí)現(xiàn)高效的性能。
【初始化JedisPool】
JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");
可以以靜態(tài)的方式處理以上代碼,它是線(xiàn)程安全的。
JedisPoolConfig包含了許多有用的redis指定的連接池的默認(rèn)參數(shù)。比如,如果一個(gè)連接300秒內(nèi)沒(méi)有任何的返回Jedis將關(guān)閉這個(gè)連接。
01 Jedis jedis = pool.getResource();
02 try {
03 //隨便做一些對(duì)于redis的操作
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);
08 } finally {
09 //這里很重要,一旦拿到的jedis實(shí)例使用完畢,必須要返還給池中
10 pool.returnResource(jedis);
11 }
12 //程序關(guān)閉時(shí),需要調(diào)用關(guān)閉方法
13 pool.destroy();
【設(shè)置主/從分布】
啟用同步復(fù)制
Redis主要為了主/從分布而構(gòu)建。這意味著"write"請(qǐng)求必須要指向"master", "master"會(huì)同步復(fù)制改變的內(nèi)容到"slave". "read"請(qǐng)求可以(不是必須的)被指向"slave",緩解"master"的讀寫(xiě)壓力.
可以按以下的步驟使用"master". 為了啟用同步復(fù)制,有兩個(gè)方式去告訴"slave"將"slaveOf"到一個(gè)給定的"master":
1.在redis server的config文件(redis.conf)指明
2.在拿到的jedis實(shí)例中調(diào)用"slaveOf"方法并指定IP和端口
1 jedis.slaveOf("192.168.1.35", 6379);
注意:"slave"也是一個(gè)redis server,也可以接收"write"請(qǐng)求并不會(huì)報(bào)錯(cuò),但是改變不會(huì)被同步復(fù)制,所以如果弄反了jedis的實(shí)例則一些操作會(huì)被覆蓋.
禁用同步復(fù)制/master失敗后,提升slave
如果"master"down掉,可以提升"slave"成為新的"master".首先試著禁用同步復(fù)制離線(xiàn)的"master",如果有幾個(gè)"slave",啟用同步復(fù)制其余的"slave"到新的"master".
1 slave1jedis.slaveofNoOne();
2 slave2jedis.slaveOf("192.168.1.36", 6379);
轉(zhuǎn)載于:https://www.cnblogs.com/lsx1993/p/4632978.html
總結(jié)
以上是生活随笔為你收集整理的多线程下使用Jedis的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .NET出现频率非常高的笔试题
- 下一篇: 利用关系数据库开展智能化营销新思路详解