首先需要了解的是
Redis
是c
语言开发的。
安装redis
需要c
语言的编译环境。如果没有gcc
需要在线安装。yum install gcc-c++
一、单机版
1.下载redis的linux版本文件并上传服务器并且解压
这里我上传到了服务器/data/file/目录下的位置
解压命令是:tar -zxvf redis-3.0.0.tar.gz
2.进入redis-3.0.0的目录进行编译
cd redis-3.0.0
make
3.进行安装可以指定安装路径
make install PREFIX=/usr/local/redis
我这里安装到/usr/local/redis 的路径下了
可以进入该路径下查看,会发现有一个bin的文件夹(该文件夹的名称可以重命名),进入该文件夹我们可以看到(这里的redis.conf是从/data/file/redis-3.0.0中复制过来的)
这里重点是redis.conf文件的配置类容
1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize yes
2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
4. 绑定的主机地址
bind 127.0.0.1 这个Ip要设置成你服务器的Ip
5. 设置当本机为slave服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof <masterip> <masterport>
6. 当master服务设置了密码保护时,slav服务连接master的密码
masterauth <master-password>
启动单机版的redis并且在后台执行只需要设置daemonize yes之后执行命令:
./redis-server redis.conf
通过客户端进入redis命令:
./redis-cli -h 127.0.0.1 -p 6379
-h
:连接的服务器的地址
-p
:服务的端口号
关闭redis的命令:
./redis-cli shutdown
到这里单机版的redis就安装完成了,外网如果要访问还需要关闭防火墙。
二、哨兵版
1. 首先哨兵模式是适用于拥有redis主从服务器的情况下的,
进入目录
cd /usr/local/redis
将刚刚的bin文件夹重命名
mv bin master
复制出从服务器
cp -r master slave
这时候目录下就有两台redis服务器了 ,当然这里也可以复制出多台从服务器。
然后需要做的就是进入各服务器目录下修改redis.conf文件类容.
2.修改moster目录下的redis.conf文件 的pidfile属性值 与 port 我这里端口号修改为6380
主服务器还可以设置从服务器只读的权限 redis.conf中设置
slave-read-only yes 即可。
3.修改slave目录下的redis.conf文件的pidfile ,port为6381,以及 slaveof 127.0.0.1 6380 (这里的ip地址和端口号对应着主服务器可以配置其他服务器的对应的值,我这里是因为安装在同一台服务器的原因)
如果主服务器设置了密码可以通过
masterauth <master-password> 进行修改
到这里主从的服务器已经配置好了。可以分别通过 ./redis-server redis.conf 进行启动
通过客户端 ./redis-cli -h 127.0.0.1 -p 6380进入 然后info命令查看服务器的角色
127.0.0.1:6380> info
...
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
...
./redis-cli -h 127.0.0.1 -p 6381 命令info
...
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:71
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
...
但是这里只是会起到一个数据备份的作用,而想要主服务器挂掉了从服务器顶上去的功能,还得需要配置哨兵,配置哨兵是通过配置sentinel.conf 文件,配置多个sentinel.conf文件就相当于配置了多个哨兵。
sentinel.conf文件在redis的解压目录下面。我这里将它复制到/usr/local/redis/目录下,修改类容
配置端口号 port 26379
配置主服务器ip和端口号
sentinel monitor mymaster
127.0
.
0.1
6380
2 (
我们这里加上权值为2,是用来计算我们需要将哪一台服务器升级升主服务器
)
配置后台启动 daemonize yes
配置日志文件位置 logfile /usr/local/redis/log/sentinel_log.log
启动命令:进入一个服务器的目录下使用 ./redis-server ../sentinel.conf --sentinel
java连接哨兵模式的redis 只需要连接哨兵的ip和端口就可以了。
二、集群版
Redis
集群中至少需要有三个节点。要保证集群的高可用,需要每个节点有一个备份机。
Redis
集群至少需要6
台服务器。
这里搭建一个伪分布式。使用一台虚拟机运行6
个redis
实例。修改redis
的端口号7001-7006
接着上边的写,首先复制redis服务器 cp -r /usr/local/redis/master /usr/local/redis-cluster/redis01
进入目录删除多余文件:
例如这里的appendonly.aof 和 dump.rdb 文件 如果有nodes.conf文件也需要删除
修改redis.conf中的port和pidfile 值 并且设置 cluster-enabled yes
复制另外的五个redis服务器 在redis-cluster目录下,并分别修改port 和 pidfile值 以及 cluster-enabled yes
在这里启动和关闭redis,自己写了一个脚本,具体步骤
cd /usr/local/redis-cluster
touch start-all.sh 创建启动脚本
chmod u+x start-all.sh 设置当前用户有执行该脚本的权限
vim start-all.sh 编辑文件
文件内容:
cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
同样的步骤创建关闭脚本 内容为:
cd redis01
./redis-cli -p 7001 shutdown
./redis-cli -p 7002 shutdown
./redis-cli -p 7003 shutdown
./redis-cli -p 7004 shutdown
./redis-cli -p 7005 shutdown
./redis-cli -p 7006 shutdown
这样多redis是可以启动了,但是并没有形成集群
需要使用ruby
脚本搭建集群。首先需要ruby
的运行环境。
安装ruby
yum install ruby
yum install rubygems
上传redis-3.0.0.gem 文件至服务器
安装
ruby
脚本运行使用的包
在该目录下面: gem install redis-3.0.0.gem
剩下的一步就需要通过redis-trib.rb 来进行集群的搭建,该文件在编译redis目录下的src子目录中,我这里复制到了/usr/local/redis-cluster/下了
启动集群命令为:
./redis-trib.rb create --replicas
1
192.168.5.153:7001 192.168.5.153:7002 192.168.5.153:7003 192.168.5.153:7004 192.168.5.153:7005 192.168.5.153:7006
这里的1是表示每一个节点有一个备份机
redis-cli 连接集群命令: ./redis-cli -h 127.0.0.1 -p 7001 -c
-c
:代表连接的是redis
集群
到这里redis的三种模式都完成了,因为刚好项目刚启动没有运维,自己就捣鼓了一下,顺便也总结了一下。
最后贴一下java单机版和集群的测试代码吧
单:
public
void
testJedisPool
()
throws
Exception {
// 第一步:创建一个JedisPool对象。需要指定服务端的
ip
及端口。
JedisPool
jedisPool
=
new
JedisPool(
"192.168.5.153"
, 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.5.153"
, 7001));
nodes
.add(
new
HostAndPort(
"192.168.5.153"
, 7002));
nodes
.add(
new
HostAndPort(
"192.168.5.153"
, 7003));
nodes
.add(
new
HostAndPort(
"192.168.5.153"
, 7004));
nodes
.add(
new
HostAndPort(
"192.168.5.153"
, 7005));
nodes
.add(
new
HostAndPort(
"192.168.5.153"
, 7006));
JedisCluster
jedisCluster
=
new
JedisCluster(
nodes
);
// 第二步:直接使用JedisCluster对象操作
redis
。在系统中单例存在。
jedisCluster
.set(
"hello"
,
"helloworl"
);
String
result
=
jedisCluster
.get(
"hello"
);
// 第三步:打印结果
System.
out
.println(
result
);
// 第四步:系统关闭前,关闭JedisCluster对象。
jedisCluster
.close();
}