redis学習ノート(7)-clusterクライアント(jedis)コード例
16248 ワード
前節ではclusterの構築とredis-cli端末の下でどのように操作するかを学習したが、より一般的なシーンはプログラムコードの中でclusterに対して読み書きすることであり、これはredis-clientのclusterモードに対するサポートが必要であり、現在spring-data-redis(1.6.4)はclusterをサポートしていない.最新の1.7.0 RC 1はclusterに関する実現があるが、現在は正式に発表されていない.したがって、現段階でredis-clusterを使用する場合は、clientはオリジナルのjedisを選択することが望ましい.サンプルコードは以下の通りである.
プロファイル:
注意:上のノードは、すべてを配置する必要はありません.少なくとも1つのclusterのノード情報だけを保持することができます.実行時、jedisは自動的に他のノードを発見しますが、あるノードが切られるのを防ぐために、構成時には、この多くのノードを配置することをお勧めします.このスタックの中で、少なくとも1つが接続できることを保証します.
サンプルコード:
注意:jedisでノードをkeysのあいまいな検索をできるだけ避けることをお勧めします.この操作はキャッシュ項目が多い場合、redisの性能が急激に低下する可能性があります.改善方法は、自分でセットを作って、すべてのキャッシュのkeyを記録することです.具体的には、上記の方法を参照してください.また、jedisが提供するコマンドは非常に多いが、詳細な説明ドキュメント(推定、著者らはコードが最良のドキュメントであると考えている)はなく、一般的に方法の接頭辞から推測することができる.例えば、sXXXはSetに対する操作であり、hXXXはhashに対する操作であり、lXXXまたはrXXXはlistに対する操作であり、zXXXはzsetに対する操作であり、どんな接頭辞もない.たとえばset/getは文字列に対する操作です.
あるネットユーザーはjedisの操作をドキュメントに整理しました.参照してください.http://blog.csdn.net/zhu_xun/article/details/16806285
最後に、上記の例のソースコードを添付します.https://github.com/yjmyzz/redis-cluster-demo
プロファイル:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg index="0">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="127.0.0.1"/>
<constructor-arg name="port" value="7000"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="127.0.0.1"/>
<constructor-arg name="port" value="7001"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="127.0.0.1"/>
<constructor-arg name="port" value="7002"/>
</bean>
<!--<bean class="redis.clients.jedis.HostAndPort">-->
<!--<constructor-arg name="host" value="127.0.0.1"/>-->
<!--<constructor-arg name="port" value="7003"/>-->
<!--</bean>-->
<!--<bean class="redis.clients.jedis.HostAndPort">-->
<!--<constructor-arg name="host" value="127.0.0.1"/>-->
<!--<constructor-arg name="port" value="7004"/>-->
<!--</bean>-->
<!--<bean class="redis.clients.jedis.HostAndPort">-->
<!--<constructor-arg name="host" value="127.0.0.1"/>-->
<!--<constructor-arg name="port" value="7005"/>-->
<!--</bean>-->
</set>
</constructor-arg>
</bean>
</beans>
注意:上のノードは、すべてを配置する必要はありません.少なくとも1つのclusterのノード情報だけを保持することができます.実行時、jedisは自動的に他のノードを発見しますが、あるノードが切られるのを防ぐために、構成時には、この多くのノードを配置することをお勧めします.このスタックの中で、少なくとも1つが接続できることを保証します.
サンプルコード:
package com.cnblogs.yjmyzz.redis;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class AppDemo {
private static Logger logger = LoggerFactory.getLogger(AppDemo.class);
private static JedisCluster jc = null;
private static final String KEYS_STRING = "STRING";
private static final String KEYS_SET = "SET";
private static final String KEYS_LIST = "LIST";
private static final String KEYS_HASH = "HASH";
private static final String KEYS_ZSET = "ZSET";
private static void addKey(final String conainter, final String key) {
if (!jc.exists(conainter)) {
jc.sadd(conainter, key);
} else {
if (!jc.smembers(conainter).contains(key)) {
jc.sadd(conainter, key);
}
}
}
/**
*
*
* @param key
* @param value
* @return
*/
private static String set(final String key, final String value) {
String result = jc.set(key, value);
addKey(KEYS_STRING, key);
return result;
}
/**
* Set
*
* @param key
* @param member
* @return
*/
private static Long sadd(final String key, final String... member) {
Long result = jc.sadd(key, member);
addKey(KEYS_SET, key);
return result;
}
/**
* List
*
* @param key
* @param string
* @return
*/
private static Long lpush(final String key, final String... string) {
Long result = jc.lpush(key, string);
addKey(KEYS_LIST, key);
return result;
}
/**
* HashMap
*
* @param key
* @param field
* @param value
* @return
*/
private static Long hset(final String key, final String field, final String value) {
Long result = jc.hset(key, field, value);
addKey(KEYS_HASH, key);
return result;
}
/**
* ZSet
*
* @param key
* @param score
* @param member
* @return
*/
private static Long zadd(final String key, final double score, final String member) {
Long result = jc.zadd(key, score, member);
addKey(KEYS_ZSET, key);
return result;
}
private static Long zadd(final String key, final String member) {
Long result = jc.zadd(key, 0d, member);
addKey(KEYS_ZSET, key);
return result;
}
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-redis.xml");
jc = ctx.getBean(JedisCluster.class);
Map<String, JedisPool> nodes = jc.getClusterNodes();
for (Map.Entry<String, JedisPool> entry : nodes.entrySet()) {
logger.info(entry.getKey() + " => " + entry.getValue().toString());
//
try {
entry.getValue().getResource().flushDB();
} catch (Exception e) {
logger.info(e.getLocalizedMessage());//slave flushDB
}
//entry.getValue().getResource().keys("*");// , , .
}
// key
logger.info(jc.exists("a").toString());
//
logger.info(set("a", "hello world!"));
logger.info(set("b", "hello redis!"));
//
logger.info(jc.get("a"));
//set
logger.info("set ==>");
logger.info(sadd("set1", "a", "b", "c") + "");
//
logger.info(jc.type("set1"));
//set
logger.info("set ==>");
Set<String> set1 = jc.smembers("set1");
for (String s : set1) {
logger.info(s);
}
//list
logger.info("list ==>");
logger.info(lpush("list1", "1", "2", "3") + "");
//list
logger.info("list ==>");
List<String> list1 = jc.lrange("list1", 0, 999);
for (String s : list1) {
logger.info(s);
}
//hash
logger.info("hash ==>");
logger.info(hset("hash1", "jimmy", " ") + "");
logger.info(hset("hash1", "CN", " ") + "");
logger.info(hset("hash1", "US", " ") + "");
//hash
logger.info("hash ==>");
Map<String, String> hash1 = jc.hgetAll("hash1");
for (Map.Entry<String, String> entry : hash1.entrySet()) {
logger.info(entry.getKey() + ":" + entry.getValue());
}
//zset
logger.info("zset ==>");
logger.info(zadd("zset1", "3") + "");
logger.info(zadd("zset1", "2") + "");
logger.info(zadd("zset1", "1") + "");
logger.info(zadd("zset1", "4") + "");
logger.info(zadd("zset1", "5") + "");
logger.info(zadd("zset1", "6") + "");
//zset
logger.info("zset ==>");
Set<String> zset1 = jc.zrange("zset1", 0, 999);
for (String s : zset1) {
logger.info(s);
}
// key
logger.info(" cluster key ==>");
logger.info(jc.smembers(KEYS_STRING).toString());
logger.info(jc.smembers(KEYS_HASH).toString());
logger.info(jc.smembers(KEYS_SET).toString());
logger.info(jc.smembers(KEYS_LIST).toString());
logger.info(jc.smembers(KEYS_ZSET).toString());
}
}
注意:jedisでノードをkeysのあいまいな検索をできるだけ避けることをお勧めします.この操作はキャッシュ項目が多い場合、redisの性能が急激に低下する可能性があります.改善方法は、自分でセットを作って、すべてのキャッシュのkeyを記録することです.具体的には、上記の方法を参照してください.また、jedisが提供するコマンドは非常に多いが、詳細な説明ドキュメント(推定、著者らはコードが最良のドキュメントであると考えている)はなく、一般的に方法の接頭辞から推測することができる.例えば、sXXXはSetに対する操作であり、hXXXはhashに対する操作であり、lXXXまたはrXXXはlistに対する操作であり、zXXXはzsetに対する操作であり、どんな接頭辞もない.たとえばset/getは文字列に対する操作です.
あるネットユーザーはjedisの操作をドキュメントに整理しました.参照してください.http://blog.csdn.net/zhu_xun/article/details/16806285
最後に、上記の例のソースコードを添付します.https://github.com/yjmyzz/redis-cluster-demo