Spring+Redis Cluster3.0.x
来源:互联网 发布:tensorflow gpu 测试 编辑:程序博客网 时间:2024/06/16 12:15
Redis 3.0集群搭建方法:
http://hot66hot.iteye.com/blog/2050676
Redis 3.0.x使用方法
1.Maven依赖
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.7.2</version></dependency>
2.Spring配置
<bean name="genericObjectPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig" > <property name="maxWaitMillis" value="-1" /> <property name="maxTotal" value="1000" /> <property name="minIdle" value="8" /> <property name="maxIdle" value="100" /> </bean> <bean id="jedisCluster" class="xxx.JedisClusterFactory"> <property name="addressConfig"> <value>classpath:connect-redis.properties</value> </property> <property name="addressKeyPrefix" value="address" /> <!-- 属性文件里 key的前缀 --> <property name="timeout" value="300000" /> <property name="maxRedirections" value="6" /> <property name="genericObjectPoolConfig" ref="genericObjectPoolConfig" /> </bean>
3.增加connect-redis.properties 配置文件
这里配置了6个节点
address1=172.16.23.27:6379 address2=172.16.23.27:6380 address3=172.16.23.27:6381 address4=172.16.23.27:6382 address5=172.16.23.27:6383 address6=172.16.23.27:6384
4.增加实现的Java类
import java.util.HashSet;import java.util.Properties;import java.util.Set;import java.util.regex.Pattern;import org.apache.commons.pool2.impl.GenericObjectPoolConfig;import org.springframework.beans.factory.FactoryBean;import org.springframework.beans.factory.InitializingBean;import org.springframework.core.io.Resource;import redis.clients.jedis.HostAndPort;import redis.clients.jedis.JedisCluster;public class JedisClusterFactory implements FactoryBean<JedisCluster>, InitializingBean {private Resource addressConfig;private String addressKeyPrefix ;private JedisCluster jedisCluster;private Integer timeout;private Integer maxRedirections;private GenericObjectPoolConfig genericObjectPoolConfig;private Pattern p = Pattern.compile("^.+[:]\\d{1,5}\\s*$");@Overridepublic JedisCluster getObject() throws Exception {return jedisCluster;}@Overridepublic Class<? extends JedisCluster> getObjectType() {return (this.jedisCluster != null ? this.jedisCluster.getClass() : JedisCluster.class);}@Overridepublic boolean isSingleton() {return true;}private Set<HostAndPort> parseHostAndPort() throws Exception {try {Properties prop = new Properties();prop.load(this.addressConfig.getInputStream());Set<HostAndPort> haps = new HashSet<HostAndPort>();for (Object key : prop.keySet()) {if (!((String) key).startsWith(addressKeyPrefix)) {continue;}String val = (String) prop.get(key);boolean isIpPort = p.matcher(val).matches();if (!isIpPort) {throw new IllegalArgumentException("ip 或 port 不合法");}String[] ipAndPort = val.split(":");HostAndPort hap = new HostAndPort(ipAndPort[0], Integer.parseInt(ipAndPort[1]));haps.add(hap);}return haps;} catch (IllegalArgumentException ex) {throw ex;} catch (Exception ex) {throw new Exception("解析 jedis 配置文件失败", ex);}}@Overridepublic void afterPropertiesSet() throws Exception {Set<HostAndPort> haps = this.parseHostAndPort();jedisCluster = new JedisCluster(haps, timeout, maxRedirections,genericObjectPoolConfig);}public void setAddressConfig(Resource addressConfig) {this.addressConfig = addressConfig;}public void setTimeout(int timeout) {this.timeout = timeout;}public void setMaxRedirections(int maxRedirections) {this.maxRedirections = maxRedirections;}public void setAddressKeyPrefix(String addressKeyPrefix) {this.addressKeyPrefix = addressKeyPrefix;}public void setGenericObjectPoolConfig(GenericObjectPoolConfig genericObjectPoolConfig) {this.genericObjectPoolConfig = genericObjectPoolConfig;}}
5.自动注入
@Autowiredprivate JedisCluster jedisCluster;
附录:
1.Redis Sentinel模式
Spring配置
<!-- Redis Sentinel 集群配置 --><bean id="redisSentinelConfiguration"class="org.springframework.data.redis.connection.RedisSentinelConfiguration"><constructor-arg name="master" value="${redis.master}"/><constructor-arg name="sentinelHostAndPorts"><set> <value>${redis.sentinels}</value></set></constructor-arg></bean><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"><property name="maxIdle" value="${redis.maxIdle}" /><property name="maxTotal" value="${redis.maxTotal}" /><property name="testOnBorrow" value="${redis.testOnBorrow}" /></bean><bean id="jedisConnectionFactory"class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><constructor-arg name="sentinelConfig" ref="redisSentinelConfiguration"/><constructor-arg name="poolConfig" ref="jedisPoolConfig"/><property name="usePool" value="true"></property><property name="password" value="${redis.password}" /><property name="timeout" value="${redis.timeout}" /><property name="database" value="${redis.db}" /></bean><bean id="stringRedisSerializer"class="org.springframework.data.redis.serializer.StringRedisSerializer" /><bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"><property name="connectionFactory" ref="jedisConnectionFactory" /><property name="defaultSerializer" ref="stringRedisSerializer" /></bean><bean id="cacheUtil" class="com.top.biz.util.RedisCacheUtil"><property name="redisTemplate" ref="redisTemplate" /></bean>
Redis properties:
redis.master=mymasterredis.sentinels=127.0.0.1:26379redis.password=redis.db=0redis.timeout=2000redis.maxIdle=5redis.maxTotal=20#redis.testOnBorrow=trueredis.testOnBorrow=false
Redis哨兵模式配置方法:
http://my.oschina.net/manmao/blog/550428
2.Redis单机配置
<!-- 配置Redis方法 单机配置 --><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"><property name="maxIdle" value="${redis.maxIdle}" /><property name="maxTotal" value="${redis.maxTotal}"></property><property name="testOnBorrow" value="${redis.testOnBorrow}" /></bean><bean id="jedisConnectionFactory"class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><property name="usePool" value="true"></property><property name="hostName" value="${redis.host}" /><property name="port" value="${redis.port}" /><property name="password" value="${redis.password}" /><property name="timeout" value="${redis.timeout}" /><property name="database" value="${redis.db}"></property><property name="poolConfig" ref="jedisPoolConfig" /></bean><bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" /><bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"><property name="connectionFactory" ref="jedisConnectionFactory" /><property name="defaultSerializer" ref="stringRedisSerializer" /></bean><bean id="cacheUtil" class="com.top.biz.util.RedisCacheUtil"><property name="redisTemplate" ref="redisTemplate" /></bean> <!--StringRedis Template 使用方法 --> <!-- <bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="jedisConnectionFactory" /> </bean> --> <!-- @Resource(name='stringRedisTemplate') private StringRedisTemplate redisTemplate; -->
Redis properties:
redis.host=127.0.0.1redis.port=6379redis.password=redis.db=0redis.timeout=2000redis.maxIdle=5redis.maxTotal=20#redis.testOnBorrow=trueredis.testOnBorrow=false
3.RedisUtil封装类
com.top.biz.util.RedisCacheUtil
RedisCacheUtil.java
实现代码
http://www.oschina.net/code/snippet_1403215_55824
public class RedisCacheUtil { private static RedisTemplate<String, String> redisTemplate; public void setRedisTemplate(RedisTemplate<String, String> redisTemp) { redisTemplate = redisTemp; } /* ----------- common --------- */ public static Collection<String> keys(String pattern) { return redisTemplate.keys(pattern); } public static void delete(String key) { redisTemplate.delete(key); } public static void delete(Collection<String> key) { redisTemplate.delete(key); } /* ----------- string --------- */ public static <T> T get(String key, Class<T> clazz) { String value = redisTemplate.opsForValue().get(key); return parseJson(value, clazz); } public static <T> List<T> mget(Collection<String> keys, Class<T> clazz) { List<String> values = redisTemplate.opsForValue().multiGet(keys); return parseJsonList(values, clazz); } public static <T> void set(String key, T obj, Long timeout, TimeUnit unit) { if (obj == null) { return; } String value = toJson(obj); if (timeout != null) { redisTemplate.opsForValue().set(key, value, timeout, unit); } else { redisTemplate.opsForValue().set(key, value); } } public static <T> T getAndSet(String key, T obj, Class<T> clazz) { if (obj == null) { return get(key, clazz); } String value = redisTemplate.opsForValue().getAndSet(key, toJson(obj)); return parseJson(value, clazz); } public static int decrement(String key, int delta) { Long value = redisTemplate.opsForValue().increment(key, -delta); return value.intValue(); } public static int increment(String key, int delta) { Long value = redisTemplate.opsForValue().increment(key, delta); return value.intValue(); } /* ----------- list --------- */ public static int size(String key) { return redisTemplate.opsForList().size(key).intValue(); } public static <T> List<T> range(String key, long start, long end, Class<T> clazz) { List<String> list = redisTemplate.opsForList().range(key, start, end); return parseJsonList(list, clazz); } public static void rightPushAll(String key, Collection<?> values, Long timeout, TimeUnit unit) { if (values == null || values.isEmpty()) { return; } redisTemplate.opsForList().rightPushAll(key, toJsonList(values)); if (timeout != null) { redisTemplate.expire(key, timeout, unit); } } public static <T> void leftPush(String key, T obj) { if (obj == null) { return; } redisTemplate.opsForList().leftPush(key, toJson(obj)); } public static <T> T leftPop(String key, Class<T> clazz) { String value = redisTemplate.opsForList().leftPop(key); return parseJson(value, clazz); } public static void remove(String key, int count, Object obj) { if (obj == null) { return; } redisTemplate.opsForList().remove(key, count, toJson(obj)); } /* ----------- zset --------- */ public static int zcard(String key) { return redisTemplate.opsForZSet().zCard(key).intValue(); } public static <T> List<T> zrange(String key, long start, long end, Class<T> clazz) { Set<String> set = redisTemplate.opsForZSet().range(key, start, end); return parseJsonList(setToList(set), clazz); } private static List<String> setToList(Set<String> set) { if (set == null) { return null; } return new ArrayList<String>(set); } public static void zadd(String key, Object obj, double score) { if (obj == null) { return; } redisTemplate.opsForZSet().add(key, toJson(obj), score); } public static void zaddAll(String key, List<TypedTuple<?>> tupleList, Long timeout, TimeUnit unit) { if (tupleList == null || tupleList.isEmpty()) { return; } Set<TypedTuple<String>> tupleSet = toTupleSet(tupleList); redisTemplate.opsForZSet().add(key, tupleSet); if (timeout != null) { redisTemplate.expire(key, timeout, unit); } } private static Set<TypedTuple<String>> toTupleSet(List<TypedTuple<?>> tupleList) { Set<TypedTuple<String>> tupleSet = new LinkedHashSet<TypedTuple<String>>(); for (TypedTuple<?> t : tupleList) { tupleSet.add(new DefaultTypedTuple<String>(toJson(t.getValue()), t.getScore())); } return tupleSet; } public static void zrem(String key, Object obj) { if (obj == null) { return; } redisTemplate.opsForZSet().remove(key, toJson(obj)); } public static void unionStore(String destKey, Collection<String> keys, Long timeout, TimeUnit unit) { if (keys == null || keys.isEmpty()) { return; } Object[] keyArr = keys.toArray(); String key = (String) keyArr[0]; Collection<String> otherKeys = new ArrayList<String>(keys.size() - 1); for (int i = 1; i < keyArr.length; i++) { otherKeys.add((String) keyArr[i]); } redisTemplate.opsForZSet().unionAndStore(key, otherKeys, destKey); if (timeout != null) { redisTemplate.expire(destKey, timeout, unit); } } /* ----------- tool methods --------- */ public static String toJson(Object obj) { return JSON.toJSONString(obj, SerializerFeature.SortField); } public static <T> T parseJson(String json, Class<T> clazz) { return JSON.parseObject(json, clazz); } public static List<String> toJsonList(Collection<?> values) { if (values == null) { return null; } List<String> result = new ArrayList<String>(); for (Object obj : values) { result.add(toJson(obj)); } return result; } public static <T> List<T> parseJsonList(List<String> list, Class<T> clazz) { if (list == null) { return null; } List<T> result = new ArrayList<T>(); for (String s : list) { result.add(parseJson(s, clazz)); } return result; }}
阅读全文
0 0
- Spring+Redis Cluster3.0.x
- redis cluster3.2.0注意点
- spring redis 集群(redis3.x及以上版本)
- spring 4.x 整合redis jar包冲突
- spring security2.0.x资料
- Spring + Redis
- spring+redis
- spring redis
- spring+redis
- spring-redis
- spring + redis
- redis:spring-data-redis
- [Spring]Redis+Spring整合
- Spring4.X + Spring MVC + Mybatis3 零配置应用开发框架搭建详解(5) - Redis缓存配置
- Spring4.X + Spring MVC + Mybatis3 零配置应用开发框架搭建详解(5) - Redis缓存配置
- Spring客户端对Redis 缓存的使用(Java客户端等Redis3.X RedisCluster模式的支持)
- 刚才通过了SUN CLUSTER3.2认证!
- Cluster3.0 和 treeView的使用
- Windows Server 2003下Apache Http Server升级到2.2.32,如何打补丁
- RadioGroup 的check(id)和他的子控件radiobutton 的setcheck(boolean)的区别
- Spring AOP原理
- PHP加速器:APC、eAccelerator、XCache比较
- 细说VLAN与Trunk .
- Spring+Redis Cluster3.0.x
- Android开发基础之Handler的使用
- link和@import的区别
- Full Screen Drag, Rotate, and Zoom——全屏、旋转和缩放
- 第一次写博客,很紧张
- MySQL sql优化
- Python中defaultdict(lambda:3)用法
- Error:warning: Ignoring InnerClasses attribute for an anonymous inner class
- PHP与c的语法区别