Redis单机集群配置和java客户端
Redis单机集群配置和java客户端
一.redis使用手册
二.redis单机安装
三.redis的java单机客户端配置和调试
四.redis集群配置手册翻译和配置
五.redis的java集群客户端配置和调试
一.redis使用手册
Redis的官网首页https://redis.io/有基本介绍: 它是一个内存型数据结构存储系统,被用作数据库,缓存和中间件。另外有一个redis命令手册的中文网站//doc.redisfans.com/
二.redis单机安装
2.1 官网下载redis-3.2.6-.tar.gz(目前最新版是3.2.8),解压后在主目录redis-3.2.6下,redis.conf是它的配置文件:
bind指定特定client可访问,注释掉则任意client可访问
port执行server开放的端口,默认6379
repass指密码,注释掉则不需要密码则可以访问
protected-mode值为yes,旨在提供保护模式,当bind和repass均注释时,只允许本地可访问。
2.2 启动redis服务器
需要指定redis.conf;如果不指定则默认在当前目录下寻找,所以如果不指定的话,当前目录需是redis.conf所在目录。
由于redis默认配置是bind本地,且配置密码,则本地启动client如下:
三.redis单机客户端配置(使用之前搭建的项目http://download.csdn.net/detail/jintao_ma/9661038)
3.1 添加maven依赖
<!-- jedis配置 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
3.2 redis.properties(虚拟机中redis服务器地址为192.168.13.172,,另外由于使用java客户端调试,为方便,将redis.conf中bind注释掉)
redis.host = 192.168.13.172
redis.port = 6379
redis.password = 123456
springRedis.xml配置
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="300" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="true" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- jedis客户端单机版 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="${redis.host}"></constructor-arg>
<constructor-arg name="port" value="${redis.port}"></constructor-arg>
<constructor-arg name="password" value="${redis.password}"></constructor-arg>
<constructor-arg name="timeout" value="3000"></constructor-arg>
<constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
</bean>
JedisClient.java
package com.mycompany.jedis.dao;
public interface JedisClient {
/**获取缓存
* @param key
* @return
*/
String get(String key);
/**设置缓存
* @param key
* @param value
* @return
*/
String set(String key, String value);
}
JedisClientImpl.java
package com.mycompany.jedis.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
@Repository("jedisClient")
public class JedisClientImpl implements JedisClient{
@Autowired
private JedisPool jedisPool;
@Override
public String get(String key) {
String value = null;
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
value = jedis.get(key);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(jedis!=null){
jedis.close();
}
}
return value;
}
@Override
public String set(String key, String value) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
value = jedis.set(key, value);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(jedis!=null){
jedis.close();
}
}
return value;
}
}
使用定时器跑类JedisTest.java:
package com.mycompany.mvc.quartz;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mycompany.jedis.dao.JedisClient;
@Service("jedisTest")
public class JedisTest {
@Autowired
private JedisClient jedisClient;
public void JedisTestMain(){
jedisClient.set("tString","hello");
String tString = jedisClient.get("tString");
System.out.println("JedisTest.JedisTestMain():"+tString);
}
}
至此,已完成。
四.redis集群配置手册翻译和配置
在配置和使用之前需要阅读文档,官方:https://redis.io/topics/cluster-tutorial,最其中涉及到集群配置的部分进行翻译:http://blog.csdn.net/jintao_ma/article/details/60756645
本例的配置如下:
4.1 redis.conf配置中,注释bind,注释repass,protected-mode设置为no
然后设置一下几个选项:
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
4.2 redis主目录下新建目录cluster-test,然后cluster-test中新建子目录7000 7001 7002 7003 7004 7005,复制主目录的redis.conf到每个子目录中,修改端口port分别为7000 7001 7002 7003 7004 7005
在子目录中启动每个redis服务器:
cd 7000
../redis-server ./redis.conf
然后在每个子目录中会产生nodes.conf
查看,会发现其中记录了序列号,用来作为该服务器的唯一标识
4.3 下面需要创建集群
在每个server都启动后,然后创建集群。安装zlib,ruby,rubygem;如:yum -y install zlib,yum -y install ruby,yum -y install rubygem
安装完成后检验下:
之后可使用gem命令:
gem install redis
使用gem安装redis之后,接着就可以在redis主目录src目录下使用redis-trib.rb 这个ruby命令来创建集群:
./redis-trib.rb create --replicas 1 192.168.13.172:7000 192.168.13.172:7001 \
192.168.13.172:7002 192.168.13.172:7003 192.168.13.172:7004 192.168.13.172:7005
如下即可:
五.redis的java集群客户端配置和调试
5.1 redis.properties
redis01.host = 192.168.13.172
redis01.port = 7000
redis02.host = 192.168.13.172
redis02.port = 7001
redis03.host = 192.168.13.172
redis03.port = 7002
redis04.host = 192.168.13.172
redis04.port = 7003
redis05.host = 192.168.13.172
redis05.port = 7004
redis06.host = 192.168.13.172
redis06.port = 7005
spring-Redis.xml
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="300" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="true" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- jedis集群版配置 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg name="jedisClusterNode">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis01.host}"/>
<constructor-arg name="port" value="${redis01.port}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis02.host}"/>
<constructor-arg name="port" value="${redis02.port}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis03.host}"/>
<constructor-arg name="port" value="${redis03.port}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis04.host}"/>
<constructor-arg name="port" value="${redis04.port}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis05.host}"/>
<constructor-arg name="port" value="${redis05.port}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis06.host}"/>
<constructor-arg name="port" value="${redis06.port}"/>
</bean>
</set>
</constructor-arg>
<constructor-arg name="connectionTimeout" value="10000"></constructor-arg>
<constructor-arg name="soTimeout" value="10000"></constructor-arg>
<constructor-arg name="maxAttempts" value="10000"></constructor-arg>
<!-- <constructor-arg name="password" value="${redisCluster.password}"></constructor-arg> -->
<constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
</bean>
JedisClusterClientImpl.java
package com.mycompany.jedis.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import redis.clients.jedis.JedisCluster;
@Repository("jedisClusterClient")
public class JedisClusterClientImpl implements JedisClient{
@Autowired
private JedisCluster jedisCluster;
@Override
public String get(String key) {
String value = null;
try {
value = jedisCluster.get(key);
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
@Override
public String set(String key, String value) {
try {
value = jedisCluster.set(key, value);
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
}
定时器类JedisClusterTest.java
package com.mycompany.mvc.quartz;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mycompany.jedis.dao.JedisClient;
@Service("jedisClusterTest")
public class JedisClusterTest {
@Autowired
private JedisClient jedisClusterClient;
public void JedisClusterTestMain(){
jedisClusterClient.set("tStringCluster","helloCluster");
String tString = jedisClusterClient.get("tStringCluster");
System.out.println("JedisTest.JedisTestMain():"+tString);
}
}
至此完成
注意前面使用redis-trib.rb创建集群时,需要指定本服务器地址是192.168.13.172,不能为127.0.0.1, 否则Java客户端会出现no reachable node in cluster的错误
还没有评论,来说两句吧...