集群:
高可用,满足高并发, 把数据分布在不同的节点上,提高单个节点的性能
1.redis集群
架构细节
:
(1)
所有的
redis
节点彼此互联
(PING-PONG
机制
),
内部使用二进制协议优化传输速度和带宽
.
(2)
节点的
fail
是通过集群中超过半数的节点检测失效时才生效
.
(3)
客户端与
redis
节点直连
,
不需要中间
proxy
层
.
客户端
不需要连接集群所有节点
,
连接集群中任何一个可用节点即可
(4)redis-cluster
把所有的物理节点映射到
[0-16383]slot
上
,cluster
负责维护
node<->slot<->value
Redis
集群
中内置了
16384
个哈希槽,当需要在
Redis
集群中放置一个
key-value
时,
redis
先对
key
使用
crc16
算法算出一个结果,然后把结果对
16384
求余数,这样每个
key
都会对应一个编号在
0-16383
之间的哈希槽,
redis
会根据节点数量大致均等的将哈希槽映射到不同的节点
集群中应该至少有三个节点,每个节点有一备份节点。需要6台服务器。
搭建伪分布式,需要6个redis实例。
2.搭建集群的步骤:
1.正常安装后在redis.conf 文件中修改配置:
2.修改端口号:
创建
6
个
redis
实例指定端口(如从
7001
到
7006)
3.修改集群策略:
修改
redis.conf
打开
Cluster-enable yes
前面的注释。
4.
需要一个
ruby
脚本。在
redis
源码文件夹下的
src
目录下。
redis-trib.rb
5.
把
redis-trib.rb
文件复制到
redis-cluster
目录下。
6.执行
ruby
脚本之前,需要安装
ruby
环境。
1
、
yum install ruby
2
、
yum install rubygems
3
、安装
redis-trib.rb
运行依赖的
ruby
的包。
[root@bogon ~]# gem install redis-3.0.0.gem
7:
启动所有的redis
实例。
8:使用redis-trib.rb
创建集群。
./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006
使用客户端连接集群:
redis01/redis-cli -p 7001
-c
如何使用
redis
的
java
客户端
需要使用
Jedis
连接
redis
服务器。
3.集群版使用Jedis
@Test
public
void
testJedisCluster()
throws
Exception {
//创建一个JedisCluster对象
Set<
HostAndPort
>
nodes
=
new
HashSet<>();
nodes
.add(
new
HostAndPort
(
"192.168.25.153"
, 7001));
nodes
.add(
new
HostAndPort
(
"192.168.25.153"
, 7002));
nodes
.add(
new
HostAndPort
(
"192.168.25.153"
, 7003));
nodes
.add(
new
HostAndPort
(
"192.168.25.153"
, 7004));
nodes
.add(
new
HostAndPort
(
"192.168.25.153"
, 7005));
nodes
.add(
new
HostAndPort
(
"192.168.25.153"
, 7006));
//在nodes中指定每个节点的地址
//jedisCluster在系统中是单例的。
JedisCluster
jedisCluster
=
new
JedisCluster(
nodes
);
jedisCluster
.set(
"name"
,
"zhangsan"
);
jedisCluster
.set(
"value"
,
"100"
);
String
name
=
jedisCluster
.get(
"name"
);
String
value
=
jedisCluster
.get(
"value"
);
System.
out
.println(
name
);
System.
out
.println(
value
);
//系统关闭时关闭jedisCluster
jedisCluster
.close();
}
4.项目中使用jedis
思路:创建一个
redis
操作的接口。分别创建两个实现类对应
redis
的单机版和集群版。当使用单机版
redis
时,配置单机版的实现类,当使用集群版本的时候,配置集群版的实现类。
单机版:
见java操作redis
集群版:
public
class
JedisClientCluster
implements
JedisClient {
@Autowired
private
JedisCluster
jedisCluster
;
@Override
public
String set(String
key
, String
value
) {
return
jedisCluster
.set(
key
,
value
);
}
@Override
public
String get(String
key
) {
return
jedisCluster
.get(
key
);
}
@Override
public
Long hset(String
key
, String
item
, String
value
) {
return
jedisCluster
.hset(
key
,
item
,
value
);
}
@Override
public
String hget(String
key
, String
item
) {
return
jedisCluster
.hget(
key
,
item
);
}
@Override
public
Long incr(String
key
) {
return
jedisCluster
.incr(
key
);
}
@Override
public
Long decr(String
key
) {
return
jedisCluster
.decr(
key
);
}
@Override
public
Long expire(String
key
,
int
second
) {
return
jedisCluster
.expire(
key
,
second
);
}
@Override
public
Long ttl(String
key
) {
return
jedisCluster
.ttl(
key
);
}
}
5.Redis的Spring的配置
<
context:component-scan
base-package
=
"com.taotao.rest.service"
>
context:component-scan
>
<
bean
id
=
"jedisPool"
class
=
"redis.clients.jedis.JedisPool"
>
<
constructor-arg
name
=
"host"
value
=
"192.168.25.153"
>
constructor-arg
>
<
constructor-arg
name
=
"port"
value
=
"6379"
>
constructor-arg
>
bean
>
<
bean
id
=
"jedisClientSingle"
class
=
"com.taotao.rest.component.impl.JedisClientSingle"
/>
beans
>
测试:
public
void
testJedisClientSpring()
throws
Exception {
//创建一个spring容器
ApplicationContext
applicationContext
=
new
ClassPathXmlApplicationContext(
"classpath:spring/applicationContext-*.xml"
);
//从容器中获得JedisClient对象
JedisClient
jedisClient
=
applicationContext
.getBean(JedisClient.
class
);
//jedisClient操作
redis
jedisClient
.set(
"cliet1"
,
"1000"
);
String
string
=
jedisClient
.get(
"cliet1"
);
System.
out
.println(
string
);
}