准备1台新虚拟机,要求如表-1所示。
实现此案例需要按照如下步骤进行。
步骤一:在主机redis64运行redis服务
命令操作如下所示:
[root@redis64 ~]# yum -y install redis 安装软件
[root@redis64 ~]# systemctl start redis 启动服务
[root@redis64 ~]# netstat -utnlp | grep redis-server 查看端口
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1970/redis-server 1
[root@redis64 ~]# redis-cli 连接服务
127.0.0.1:6379> ping 检查能否正在访问
PONG
127.0.0.1:6379> set school tarena 存储变量
OK
127.0.0.1:6379> get school 查看变量
"tarena"
127.0.0.1:6379> exit 断开连接
[root@redis64 ~]#
步骤二:修改服务运行参数
命令操作如下所示:
[root@redis64 ~]# systemctl stop redis
[root@redis64 ~]# vim /etc/redis.conf
69 bind 192.168.88.64
92 port 6364
647 requirepass tarenaplj
:wq
[root@redis64 ~]# setenforce 0
[root@redis64 ~]# systemctl start redis
[root@redis64 ~]# netstat -utnlp | grep redis-server
tcp 0 0 192.168.88.64:6364 0.0.0.0:* LISTEN 2009/redis-server 1
[root@redis64 ~]#
[root@redis64 ~]# redis-cli -h 192.168.88.64 -p 6364 连接服务
192.168.88.64:6364> ping 不输入密码无法正常访问
(error) NOAUTH Authentication required.
192.168.88.64:6364> auth tarenaplj 输入密码
OK
192.168.88.64:6364> keys * 查看存储的变量
1) "school"
192.168.88.64:6364> exit 断开连接
[root@redis64 ~]#
1)练习如下命令的使用
在搭建的redis64练习常用命令的使用。
实现此案例需要按照如下步骤进行。
命令操作如下所示:
192.168.88.64:6364> mset name plj age 80 class nsd2108 一起存储多个变量
OK
192.168.88.64:6364> keys *
1) "age"
2) "classs"
3) "name"
4) "school"
192.168.88.64:6364> mget name age 一起查看多个变量
1) "plj"
2) "80"
keys 使用统配符查看变量
* 匹配所有变量名
? 一个字符
192.168.88.64:6364> keys *
1) "age"
2) "classs"
3) "name"
4) "school"
192.168.88.64:6364> keys ??? 变量名是3个字符
1) "age"
192.168.88.64:6364> keys a* 变量名是a 开头的
1) "age"
192.168.88.64:6364>
192.168.88.64:6364> keys gender 查看指定变量是否存在
(empty list or set) 说明变量没有定义
192.168.88.64:6364> keys name
1) "name"
192.168.88.64:6364>
select 切换库 默认库编号 0-15
192.168.88.64:6364> select 1 切换到 1号库里
OK
192.168.88.64:6364[1]> keys * 查看数据没有数据
(empty list or set)
192.168.88.64:6364[1]>
192.168.88.64:6364[1]> select 0
OK
192.168.88.64:6364> select 16
(error) ERR DB index is out of range
move 命令 移动变量到其他库里
192.168.88.64:6364> keys *
1) "age"
2) "classs"
3) "name"
4) "school"
192.168.88.64:6364> move age 1 把age 变量移动到1 号库里
(integer) 1
192.168.88.64:6364> keys *
1) "classs"
2) "name"
3) "school"
192.168.88.64:6364> select 1
OK
192.168.88.64:6364[1]> keys *
1) "age"
exists 检查变量是否存储 返回值1 变量存储 返回值是0 变量不存在
192.168.88.64:6364[1]> select 0
OK
192.168.88.64:6364> EXISTS name 检查name变量是否存在
(integer) 1
192.168.88.64:6364> get name
"plj"
192.168.88.64:6364> set name bob
OK
192.168.88.64:6364> get name
"bob"
192.168.88.64:6364>
EXPIRE 命令设置变量的过期时间 不设置变量永不过期
ttl 检查变量可以在内存里存多久
192.168.88.64:6364> set sex girl
OK
192.168.88.64:6364> ttl sex
(integer) -1 表示永不过期
192.168.88.64:6364> EXPIRE sex 15 设置过期时间15 秒
(integer) 1
192.168.88.64:6364> keys sex
1) "sex"
192.168.88.64:6364> ttl sex
(integer) 8 还剩下8秒时间过期
192.168.88.64:6364> ttl sex
(integer) -2 表示已经过期被删除
192.168.88.64:6364> keys sex
(empty list or set)
192.168.88.64:6364>
type 命令检查变量存储数据的类型
使用set mset命令存储的数据都字符类型。
数据的类型不同 管理的命令也不同
明天讲数据类型。
192.168.88.64:6364> set x 99
OK
192.168.88.64:6364> mset y 108
OK
192.168.88.64:6364> type x
string
192.168.88.64:6364> type y
string
192.168.88.64:6364> lpush tea nb wk zzg plj lx 定义类别类型的变量tea
192.168.88.64:6364> type tea 查看变量类型 list 列表类型的数据
list
del 删除内存里的变量
192.168.88.64:6364> keys *
1) "y"
2) "tea"
3) "name"
4) "school"
5) "x"
6) "classs"
192.168.88.64:6364> del tea y school
(integer) 3
192.168.88.64:6364> keys *
1) "name"
2) "x"
3) "classs"
192.168.88.64:6364>
flushdb 删除当前所在库的所有数据
192.168.88.64:6364> keys *
1) "name"
2) "x"
3) "classs"
192.168.88.64:6364> flushdb
OK
192.168.88.64:6364> keys *
(empty list or set)
192.168.88.64:6364> SELECT 1
OK
192.168.88.64:6364[1]> keys *
1) "age"
192.168.88.64:6364[1]> flushall 删除内存里的所有内存里所有数据 (慎用
在redis64主机同时运行nginx 服务,并配置nginx服务可以把数据存储在本机的redis内存服务里。
实现此案例需要按照如下步骤进行。
步骤一:在主机192.168.88.64部署LNP 环境
1)安装源码nginx及php
]#yum -y install gcc pcre-devel zlib-devel make 安装依赖
]#]# tar -xf nginx-1.22.1.tar.gz 解压源码
]#cd nginx-1.22.1 进源码目录
]#./configure 配置
]#make 编译
]#make install 安装
]# ls /usr/local/nginx/ 查看安装目录
conf html logs sbin
]# yum -y install php php-fpm php-devel 安装php 软件
2)配置动静分离
]# vim +65 /usr/local/nginx/conf/nginx.conf
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
:wq
3)启动nginx服务
[root@redis64 ~]# /usr/local/nginx/sbin/nginx -t 测试配置
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@redis64 ~]#
[root@redis64 ~]# /usr/local/nginx/sbin/nginx 启动服务
[root@redis64 ~]# netstat -utnlp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10469/nginx: master
[root@redis64 ~]#
启动php-fpm服务
]# vim /etc/php-fpm.d/www.conf
38 ;listen = /run/php-fpm/www.sock
39 listen = 127.0.0.1:9000 非sock方式运行 (不是必须的)
:wq
[root@redis64 ~]# systemctl start php-fpm 启动服务
[root@redis64 ~]# netstat -utnlp | grep 9000 查看端口
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 10477/php-fpm: mast
[root@redis64 ~]#
测试配置
[root@redis64 ~]# vim /usr/local/nginx/html/test.php 编写php脚本
<?php
echo "hello world!!! \n";
?>
[root@redis64 ~]# curl http://localhost/test.php 访问php脚本
hello world!!!
[root@redis64 ~]#
步骤二:配置PHP支持redis
1)安装软件提供模块
--with-php-config=/usr/bin/php-config 获取php版本信息
[root@redis64 pub]# tar -xf redis-cluster-4.3.0.tgz 解压源码
[root@redis64 pub]# cd redis-4.3.0/ 进源码目录
[root@redis64 redis-4.3.0]# phpize 获取php版本信息
Configuring for:
PHP Api Version: 20170718
Zend Module Api No: 20170718
Zend Extension Api No: 320170718
[root@redis64 redis-4.3.0]# ./configure --with-php-config=/usr/bin/php-config 配置
[root@redis64 redis-4.3.0]# make && make install 编译并安装
Build complete.
Don't forget to run 'make test'.
Installing shared extensions: /usr/lib64/php/modules/ 提示模块安装的位置
[root@redis64 redis-4.3.0]# ls /usr/lib64/php/modules/redis.so 查看模块
/usr/lib64/php/modules/redis.so
[root@redis64 redis-4.3.0]#
2)调用模块
[root@redis64 redis-4.3.0]# vim /etc/php.ini 编辑php进程主配置文件
737 extension_dir = "/usr/lib64/php/modules/" 指定模块所在目录
739 extension = "redis.so" 指定模块名
:wq
3)加载模块
[root@redis64 redis-4.3.0]# systemctl restart php-fpm
4)查看模块
[root@redis64 ~]# php -m | grep redis
redis
[root@redis64 ~]#
步骤三:编写网站脚本,把数据存储到本机的内存里
1)允许通过lo口连接本机redis服务
[root@redis64 ~]# systemctl stop redis
[root@redis64 ~]# vim /etc/redis.conf
69 bind 127.0.0.1 192.168.88.64
:wq
[root@redis64 ~]# netstat -utnlp | grep redis-server
tcp 0 0 192.168.88.64:6364 0.0.0.0:* LISTEN 12794/redis-server
tcp 0 0 127.0.0.1:6364 0.0.0.0:* LISTEN 12794/redis-server
[root@redis64 ~]#
2)编写php脚本
[root@redis64 ~]# vim /usr/local/nginx/html/redis.php
<?php
$redis = new redis();
$redis->connect("127.0.0.1", "6364");
$redis->auth("tarenaplj");
$redis->set("class","nsd");
echo "save ok\n";
?>
3)访问脚本
[root@redis64 ~]# curl http://localhost/redis.php
save ok
[root@redis64 ~]#
4)连接redis服务查看变量
[root@redis64 ~]# redis-cli -h 127.0.0.1 -p 6364
127.0.0.1:6364> auth tarenaplj
OK
127.0.0.1:6364> keys *
1) "school"
2) "class"
127.0.0.1:6364> get class
"nsd"
127.0.0.1:6364>
创建6台新虚拟机,具体要求如表-2所示。
实现此案例需要按照如下步骤进行。
步骤一:准备集群环境
说明:准备做集群的主机,不允许存储数据、不允许设置连接密码
配置服务器192.168.88.51
]# yum -y install redis 安装软件
]# vim /etc/redis.conf 修改主配置文件夹
92 port 6379 //端口号
69 bind 192.168.88.51 //IP地址
838 cluster-enabled yes //启用集群功能
846 cluster-config-file nodes-6379.conf //存储集群信息文件
852 cluster-node-timeout 5000 //集群中主机通信超时时间
:wq
]# systemctl start redis
]# netstat -utnlp | grep redis-serve
tcp 0 0 192.168.88.51:6379 0.0.0.0:* LISTEN 21201/redis-serve
tcp 0 0 192.168.88.51:16379 0.0.0.0:* LISTEN 21201/redis-serve
配置服务器192.168.88.52
]# yum -y install redis
]# vim /etc/redis.conf
92 port 6379
69 bind 192.168.88.52
838 cluster-enabled yes //启用集群功能
846 cluster-config-file nodes-6379.conf //存储集群信息文件
852 cluster-node-timeout 5000 //集群中主机通信超时时间
:wq
]# systemctl start redis
]# netstat -utnlp | grep redis-serve
tcp 0 0 192.168.88.52:6379 0.0.0.0:* LISTEN 21201/redis-serve
tcp 0 0 192.168.88.52:16379 0.0.0.0:* LISTEN 21201/redis-serve
配置服务器192.168.88.53
]# yum -y install redis
]# vim /etc/redis.conf
92 port 6379
69 bind 192.168.88.53
838 cluster-enabled yes //启用集群功能
846 cluster-config-file nodes-6379.conf //存储集群信息文件
852 cluster-node-timeout 5000 //集群中主机通信超时时间
:wq
]# systemctl start redis
]# netstat -utnlp | grep redis-serve
tcp 0 0 192.168.88.53:6379 0.0.0.0:* LISTEN 21201/redis-serve
tcp 0 0 192.168.88.53:16379 0.0.0.0:* LISTEN 21201/redis-serve
配置服务器192.168.88.54
]# yum -y install redis
]# vim /etc/redis.conf
92 port 6379
69 bind 192.168.88.54
838 cluster-enabled yes //启用集群功能
846 cluster-config-file nodes-6379.conf //存储集群信息文件
852 cluster-node-timeout 5000 //集群中主机通信超时时间
:wq
]# systemctl start redis
]# netstat -utnlp | grep redis-serve
tcp 0 0 192.168.88.54:6379 0.0.0.0:* LISTEN 21201/redis-serve
tcp 0 0 192.168.88.54:16379 0.0.0.0:* LISTEN 21201/redis-serve
配置服务器192.168.88.55
]# yum -y install redis
]# vim /etc/redis.conf
92 port 6379
69 bind 192.168.88.55
838 cluster-enabled yes //启用集群功能
846 cluster-config-file nodes-6379.conf //存储集群信息文件
852 cluster-node-timeout 5000 //集群中主机通信超时时间
:wq
]# systemctl start redis
]# netstat -utnlp | grep redis-serve
tcp 0 0 192.168.88.55:6379 0.0.0.0:* LISTEN 21201/redis-serve
tcp 0 0 192.168.88.55:16379 0.0.0.0:* LISTEN 21201/redis-serve
配置服务器192.168.88.56
]# yum -y install redis
]# vim /etc/redis.conf
92 port 6379
69 bind 192.168.88.56
838 cluster-enabled yes //启用集群功能
846 cluster-config-file nodes-6379.conf //存储集群信息文件
852 cluster-node-timeout 5000 //集群中主机通信超时时间
:wq
]# systemctl start redis
]# netstat -utnlp | grep redis-serve
tcp 0 0 192.168.88.56:6379 0.0.0.0:* LISTEN 21201/redis-serve
tcp 0 0 192.168.88.56:16379 0.0.0.0:* LISTEN 21201/redis-serve
步骤二:创建集群
说明:
1、在任意一台redis服务器上都可以执行创建集群的命令。
2、--cluster-replicas 1 给每个master服务器分配一台slave服务器,每个主至少要分配1台slave服务器,不然无法实现redis服务的高可用。
3、创建集群时,会自动创建主从角色,默认把主机列表中的前3台服务器创建为
Master角色的redis服务器,剩下的均配置为slave角色服务器。
4、创建集群时,会自动给master角色的主机分配hash槽 ,通过hash槽实现数据的分布式存储。
]# redis-cli --cluster create 192.168.88.51:6379 192.168.88.52:6379 192.168.88.53:6379 192.168.88.54:6379 192.168.88.55:6379 192.168.88.56:6379 --cluster-replicas 1
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.88.51:6379
192.168.88.52:6379
192.168.88.53:6379
Adding replica 192.168.88.55:6379 to 192.168.88.51:6379
Adding replica 192.168.88.56:6379 to 192.168.88.52:6379
Adding replica 192.168.88.54:6379 to 192.168.88.53:6379
M: 0eb3b7aa0493a19189cba35b0c658202cc20884b 192.168.88.51:6379
slots:0-5460 (5461 slots) master
M: a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441 192.168.88.52:6379
slots:5461-10922 (5462 slots) master
M: f2c1bdb78d8d224c3666fa6440bdf80ba563c581 192.168.88.53:6379
slots:10923-16383 (5461 slots) master
S: bdba77868965371680fa825badff59bf8ef95a81 192.168.88.54:6379
replicates f2c1bdb78d8d224c3666fa6440bdf80ba563c581
S: 11510f42bfd9cf667bab5f31c01476d94984200a 192.168.88.55:6379
replicates 0eb3b7aa0493a19189cba35b0c658202cc20884b
S: fe572ce003ee634c52adc4b42d92d15f847937d7 192.168.88.56:6379
replicates a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441
Can I set the above configuration? (type 'yes' to accept): yes 同意
....
....
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered. //创建成功的提示
步骤三:查看集群信息
第一列:主服务器ip地址
第二列:主服务器ID
第三列:存储变量个数
第四列:hash槽个数 (hash槽的作用在集群存储工程过程里讲)
第五列:从服务器数量
]# redis-cli --cluster info 192.168.88.51:6379
192.168.88.53:6379 (f2c1bdb7...) -> 0 keys | 5461 slots | 1 slaves.
192.168.88.51:6379 (0eb3b7aa...) -> 0 keys | 5461 slots | 1 slaves.
192.168.88.52:6379 (a9cb8ccd...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
步骤四:访问集群
[root@host51 ~]# redis-cli -c -h 192.168.88.51 -p 6379
192.168.88.51:6379> set school tarena
-> Redirected to slot [8455] located at 192.168.88.52:6379
OK
192.168.88.52:6379> set teacher plj
-> Redirected to slot [12541] located at 192.168.88.53:6379
OK
192.168.88.53:6379> set class NSD
-> Redirected to slot [741] located at 192.168.88.51:6379
OK
192.168.88.51:6379>
会发现3个变量被分别存储到集群中的3台master服务器上,实现了数据的分布式存储。当连接集群中的任意一台redis服务器存储数据时,会调用集群CRC16算法 得出此次
存储变量使用的hash 槽,然后连接hash 槽 所在的master服务器存储变量。
在创建集群时会把默认的16384个槽平均的分配给集群中的3个master服务器。可以通过查看集群信息查看每个master服务器占用hash槽的个数。
]# redis-cli --cluster info 192.168.88.51:6379
192.168.88.53:6379 (f2c1bdb7...) -> 0 keys | 5461 slots | 1 slaves.
192.168.88.51:6379 (0eb3b7aa...) -> 0 keys | 5461 slots | 1 slaves.
192.168.88.52:6379 (a9cb8ccd...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
集群中slave角色的主机会自动同步master角色主机的数据,实现数据的自动备份,
分别连接集群中的3台slave服务器查看变量
[root@host54 ~]# redis-cli -c -h 192.168.88.54 -p 6379
192.168.88.54:6379> keys *
1) "class"
[root@host55 ~]# redis-cli -c -h 192.168.88.55 -p 6379
192.168.88.55:6379> keys *
1) "school"
[root@host56 ~]# redis-cli -c -h 192.168.88.56 -p 6379
192.168.88.56:6379> keys *
1) "teacher"
当master角色的服务器宕机时,对应的slave服务器会升级为master 并接手对应的hash槽,实现redis服务的高可用,例如停止host53主机的redis服务,对应的从会升级为master 。(当宕机的master恢复后 自动做当前主的从服务器)
停止redis服务
[root@host53 ~]# systemctl stop reddis
查看集群信息
[root@host51 ~]#]# redis-cli --cluster info 192.168.88.51:6379
192.168.88.54:6379 (f2c1bdb7...) -> 1 keys | 5461 slots | 0 slaves.
192.168.88.51:6379 (0eb3b7aa...) -> 1 keys | 5461 slots | 1 slaves.
192.168.88.52:6379 (a9cb8ccd...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
keys per slot on average.
启动redis服务
[root@host53 ~]# systemctl start reddis
查看集群信息
[root@host51 ~]#]# redis-cli --cluster info 192.168.88.51:6379
192.168.88.54:6379 (f2c1bdb7...) -> 1 keys | 5461 slots | 1 slaves.
192.168.88.51:6379 (0eb3b7aa...) -> 1 keys | 5461 slots | 1 slaves.
192.168.88.52:6379 (a9cb8ccd...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
keys per slot on average.
存储数据脚本
[root@redis64 ~]# vim /usr/local/nginx/html/set.php
<?php
$redis_list = ['192.168.88.51:6379','192.168.88.52:6379','192.168.88.53:6379','192.168.88.54:6379','192.168.88.55:6379','192.168.88.56:6379'];
$client = new RedisCluster(NUll,$redis_list);
$client->set("i","tarenaA ");
$client->set("j","tarenaB ");
$client->set("k","tarenaC ");
echo "save ok\n";
?>
:wq
查看数据脚本
[root@ redis64 ~]# vim /usr/local/nginx/html/get_data.php
<?php
$redis_list = ['192.168.88.51:6379','192.168.88.52:6379','192.168.88.53:6379','192.168.88.54:6379','192.168.88.55:6379','192.168.88.56:6379']; //定义redis服务器列表
$client = new RedisCluster(NUll,$redis_list); //定义连接redis服务命令
echo $client->get("i"); //获取变量i 的数据
echo $client->get("j"); //获取变量j 的数据
echo $client->get("k"); //获取变量k 的数据
?>
:wq
3)访问脚本
]# curl http://192.168.88.64/set_data.php
save ok
]# curl http://192.168.88.64/get_data.php
tarenaA tarenaB tarenaC
4)命令行连接redis集群主机查看数据
[root@host51 ~]# redis-cli -c -h 192.168.88.51 -p 6379
192.168.88.51:6379> keys *
1) "j"
[root@host52 ~]# redis-cli -c -h 192.168.88.52 -p 6379
192.168.88.52:6379> keys *
1) "k"
[root@host53 ~]# redis-cli -c -h 192.168.88.53 -p 6379
192.168.88.53:6379> keys *
1) "i"