Jedis即redis java客戶端,源碼地址:https://github.com/xetorthio/jedisjava
pom配置:node
public void testJedis() throws Exception { // 第一步:建立一個Jedis對象。須要指定服務端的ip及端口。 Jedis jedis = new Jedis("192.168.**.**", 6379); // 第二步:使用Jedis對象操做數據庫,每一個redis命令對應一個方法。 String result = jedis.get("hello"); // 第三步:打印結果。 System.out.println(result); // 第四步:關閉Jedis jedis.close(); }
2) 鏈接單機版使用鏈接池git
public void testJedisPool() throws Exception { // 第一步:建立一個JedisPool對象。須要指定服務端的ip及端口。 JedisPool jedisPool = new JedisPool("192.168.**.**", 6379); // 第二步:從JedisPool中得到Jedis對象。 Jedis jedis = jedisPool.getResource(); // 第三步:使用Jedis操做redis服務器。 jedis.set("jedis", "test"); String result = jedis.get("jedis"); System.out.println(result); // 第四步:操做完畢後關閉jedis對象,鏈接池回收資源。 jedis.close(); // 第五步:關閉JedisPool對象。 jedisPool.close(); }
public void testJedisCluster() throws Exception { // 第一步:使用JedisCluster對象。須要一個Set<HostAndPort>參數。Redis節點的列表。 Set<HostAndPort> nodes = new HashSet<>(); nodes.add(new HostAndPort("192.168.**.**", 7001)); nodes.add(new HostAndPort("192.168.**.**", 7002)); nodes.add(new HostAndPort("192.168.**.**", 7003)); nodes.add(new HostAndPort("192.168.**.**", 7004)); nodes.add(new HostAndPort("192.168.**.**", 7005)); nodes.add(new HostAndPort("192.168.**.**", 7006)); JedisCluster jedisCluster = new JedisCluster(nodes); // 第二步:直接使用JedisCluster對象操做redis。在系統中單例存在。 jedisCluster.set("hello", "100"); String result = jedisCluster.get("hello"); // 第三步:打印結果 System.out.println(result); // 第四步:系統關閉前,關閉JedisCluster對象。 jedisCluster.close(); }
private static final int taskCount = 50; // 併發任務 private static final int batchSize = 10; // pipeline大小 private static final int cmdCount = 1000;// 每一個任務處理命令數 private static final boolean usePipeline = true; JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxActive(200); poolConfig.setMaxIdle(100); poolConfig.setMaxWait(2000); poolConfig.setTestOnBorrow(false); poolConfig.setTestOnReturn(false); jedisPool = new JedisPool(poolConfig, host, port);
5)Jedis 消息發佈與訂閱APIgithub
5.1)消息訂閱redis
public void subscribeChannal(){
//從jedisPool中獲取一個jedis對象 Jedis jds = RedisInsUtil.getJedis(); // 方式1 訂閱獲得信息在lister的onPMessage(...)方法中進行處理 jds.psubscribe(this, new String[]{"channal01","channal02"});
// 方式2 訂閱獲得信息在lister的onMessage(...)方法中進行處理 (普通訂閱方式) //jedis.subscribe(listener, "foo", "watson");
} // 初始化訂閱時候的處理 @Override public void onSubscribe(String channel, int subscribedChannels) { } // 初始化按表達式的方式訂閱時候的處理 @Override public void onPSubscribe(String pattern, int subscribedChannels) { } @Override // 取得按表達式的方式訂閱的消息後的處理 public void onPMessage(String pattern, String channel, String message) { LOG.info("onPMessage()," + pattern + "=" + channel + ",msg="+ message); } // 取得訂閱的消息後的處理 public void onMessage(String channel, String message) { }
5.2)消息發佈算法
發佈消息只用調用Jedis的publish(...)方法便可。數據庫
Jedis jedis = ru.getConnection(); //獲取一個jedis對象,自行封裝工具類 jedis.publish("hello_foo", "bar123");
6) 管道緩存
16384
個槽(slot), 集羣的最大節點數量也是
16384
個。每一個主節點都負責處理
16384
個哈希槽的其中一部分。當一個集羣處於「穩定」(stable)狀態時(羣沒有在執行重配置(reconfiguration)操做), 每一個哈希槽都只由一個節點進行處理(hash Slot的分配是由CRC16算法計算)。
1.根據要插入的key知道這個key所對應的槽的號碼(JedisClusterCRC16.getSlot(key)), 再經過這個槽的號碼從集羣中找到對應Jedis(經過每一個節點的slot分佈,就知道了哪些key應該在哪些節點上)。服務器
2.相同槽位的key,使用同一個jedis.pipeline去執行命令。併發
3.合併這次pipeline全部的response返回。
keys實現思路:
循環集羣中全部的節點(分別獲取j對應的client對象),而後每一個節點作keys,最後再加到一塊返回。
備註:每次執行前須要刷新以獲取最新的slot分佈。