Redis介绍
非关系型数据库,基于键值对进行存储数据,可以用来缓存动态数据,将动态数据缓存在内存中,通过aof或者持久化方式写入到硬盘中
特点
支持多种数据类型
支持分布式存储
功能丰富
常用命令
select:切换数据库,redis有16个数据库(0-15)
set:创建键值对,如果键值对存在,则会覆盖
get:查看指定键值对
mset:批量创建键值对
append:在对应的键值对的内容进行追加
keys *:查看数据库中所有键
dbsize:统计数据库中键的个数
move:对键进行迁移
del:删除指定的键值对,可以是多个
flushall:清空所有的数据
Redis缓存搭建
Redis缓存lnmp中MySQL的数据,通过php中间件
实验环境
一台lnmp环境的linux即可
实验目的
用户多次访问动态页面时,从redis缓存中读取数据
实验步骤
在lnmp的基础上
调整php-fpm配置文件
vim /usr/local/php5/etc/php-fpm.conf
listen = 192.168.1.5:9000 # 本机ip
systemctl restart php-fpm
# 重启php-fpm
调整nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
location ~ \.php$ {
root html;
fastcgi_pass 192.168.1.5:9000; # 改为本机地址
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
systemctl restart nginx
# 重启nginx
安装Redis数据库
tar zxf redis-4.0.6.tar.gz -C /usr/src
mv /usr/src/redis-4.0.6 /usr/local/redis
cd /usr/local/redis/
make && make install
调整Redis配置文件
vim /usr/local/redis/redis.conf
bind 192.168.1.5 # 监听本机ip
daemonize yes # 允许后台运行
启动redis服务
redis-server /usr/local/redis/redis.conf
登录Redis数据库的方法
redis-cli -h 192.168.1.5 -p 6379
编译安装Redis的php模块
unzip phpredis-master.zip
cd phpredis-master/
phpize # 生成configure文件
./configure --with-php-config=/usr/local/php5/bin/php-config && make && make install
验证生成的Redis模块
cd /usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/
ls
opcache.a opcache.so redis.so
将生成的redis模块与php整合
vim /usr/local/php5/php.ini
extension = redis.so
重启php-fpm
systemctl restart php-fpm
编写php页面,验证redis的php模块是否成功加入了php中
vim /usr/local/nginx/html/index.php
<?php
phpinfo();
?>
访问192.168.1.5/index.php
,验证是否成功,在页面中找到如图所示,即是成功
登录mysql授权php可以登录的用户,用于验证redis缓存数据
mysql -u root -p123.com
mysql> create database abc;
mysql> use abc;
mysql> create table test(id int,name varchar(30));
mysql> insert into test values(1,'cyj'),(2,'pjf'),(3,'fy'),(4,'mp'),(5,'fm');
grant all on abc.test to 'root'@'192.168.1.5' identified by '123.com';
重新编写php页面
vim /usr/local/nginx/html/index.php
<?php
$redis=new Redis;
$redis->connect("192.168.1.5",6379) or die ("could not connect"); # 本机ip及redis端口号
$query="select * from abc.test limit 5";
for ($key=1;$key<=5;$key++) {
if (!$redis->get($key)) {
$conn=mysqli_connect("192.168.1.5","root","123.com"); # 连接数据库,用户密码
$result=mysql_query($query);
while ($row=mysql_fetch_assoc($result)) {
$redis->set($row["id"],$row["name"]);
}
break;
}
else {
$name="redis";
$data[$key]=$redis->get($key);
}
}
echo $name;
echo "<br>";
for ($key=1;$key<=5;$key++) {
echo "id is $key";
echo "<br>";
echo "name is $data[$key]";
echo "<br>";
}
?>
重新192.168.1.5/index.php
访问进行验证
刷新两次,即可看到下图,刷新两次是因为,第一次直接拿去数据库的数据,第二次则时拿去redis缓存中的数据
Redis集群
Redis集群最少要有三个节点,三个节点每个都需要从
每个节点之间都是平等的,每个上面都有连接,从节点不工作,只有主节点才会存储数据
通过hash(CRC16算法)槽点进行分配,一共有16384个槽点,平均分配到每个节点上,只有主节点上面有槽点,有槽点才能存储数据,备份节点没有槽点,当主机点宕机,槽点会转移到备份节点,由备份节点来工作,提升为主节点
数据通过crc16算法进行分配,算出来在哪个槽点范围则进入那台节点
集群搭建
实验环境
一台LNMP的linux服务器,生产环境至少3台服务器
实验目的
搭建Redis集群
实验步骤
创建集群配置文件目录
[root@localhost ~]# cd /usr/local/
[root@localhost local]# mkdir cluster
[root@localhost local]# cd cluster/
[root@localhost cluster]# mkdir {7000..7005}
[root@localhost cluster]# cp /usr/local/redis/redis.conf 7000/
vim 7000/redis.conf
daemonize yes # 允许后台运行
port 7000 # 节点端口
appendonly yes # 持久化开启
appendfilename "appendonly-7000.aof" # 快照文件名
cluster-enabled yes # 开启集群
cluster-config-file nodes-7000.conf # 节点配置文件名
cluster-node-timeout 5000 # 集群节点超时时间
[root@localhost cluster]# cp 7000/redis.conf 7001
[root@localhost cluster]# cp 7000/redis.conf 7002
[root@localhost cluster]# cp 7000/redis.conf 7003
[root@localhost cluster]# cp 7000/redis.conf 7004
[root@localhost cluster]# cp 7000/redis.conf 7005
[root@localhost ~]# sed -i 's/7000/7001/g' /usr/local/cluster/7001/redis.conf
[root@localhost ~]# sed -i 's/7000/7002/g' /usr/local/cluster/7002/redis.conf
[root@localhost ~]# sed -i 's/7000/7003/g' /usr/local/cluster/7003/redis.conf
[root@localhost ~]# sed -i 's/7000/7004/g' /usr/local/cluster/7004/redis.conf
[root@localhost ~]# sed -i 's/7000/7005/g' /usr/local/cluster/7005/redis.conf
启动6个不同端口服务
redis-server /usr/local/cluster/7000/redis.conf
redis-server /usr/local/cluster/7001/redis.conf
redis-server /usr/local/cluster/7002/redis.conf
redis-server /usr/local/cluster/7003/redis.conf
redis-server /usr/local/cluster/7004/redis.conf
redis-server /usr/local/cluster/7005/redis.conf
查看服务是否启动成功
netstat -anput | grep redis
安装pem包,用来创建集群
yum -y install ruby # anzruby,能够使用gem命令
gem install redis-3.3.0.gem
创建集群
cd /usr/local/redis/src
./redis-trib.rb create --replicas 1 192.168.1.5:7000 192.168.1.5:7001 192.168.1.5:7002 192.168.1.5:7003 192.168.1.5:7004 192.168.1.5:7005
create:创建集群 --replicas给主节点指定从节点个数
reshard 槽点重新分配
info 集群信息
add-node:添加节点,默认为主节点
add-node --slave 添加从节点
--master-id:指定主节点
del-node:删除节点,如果是主节点,这里的槽点需要提前转移,然后删除
./redis-trib.rb check 192.168.1.5:7000
添加从节点
# 准备从节点配置文件目录
[root@localhost ~]# mkdir /usr/local/cluster/7006
[root@localhost ~]# cp /usr/local/cluster/7000/redis.conf /usr/local/cluster/7006/
[root@localhost ~]# sed -i "s/7000/7006/g" /usr/local/cluster/7006/redis.conf
# 启动从节点
[root@localhost ~]# redis-server /usr/local/cluster/7006/redis.conf
[root@localhost ~]# /usr/local/redis/src/redis-trib.rb check 192.168.1.5:7000
# 粘贴任意一个主的uuid
2172d6d3bfcc487241903193d437ff9dc9a60995
# 创建从节点,并指定一个主节点
/usr/local/redis/src/redis-trib.rb add-node --slave --master-id 2172d6d3bfcc487241903193d437ff9dc9a60995 192.168.1.5:7006 192.168.1.5:7000
添加主节点
# 准备主节点配置文件目录
[root@localhost ~]# mkdir /usr/local/cluster/7007
[root@localhost ~]# cp /usr/local/cluster/7000/redis.conf /usr/local/cluster/7007/
[root@localhost ~]# sed -i "s/7000/7007/g" /usr/local/cluster/7007/redis.conf
# 启动服务
[root@localhost ~]# redis-server /usr/local/cluster/7007/redis.conf
创建主节点
/usr/local/redis/src/redis-trib.rb add-node 192.168.1.5:7007 192.168.1.5:7000
[root@localhost ~]# /usr/local/redis/src/redis-trib.rb check 192.168.1.5:7000
# 因为没有槽点。复制刚添加的端口号的uuid,要进行重新分配槽点
90e63fe3e6c50fe596e761c2b652f5e10d65ff84
[root@localhost ~]# /usr/local/redis/src/redis-trib.rb reshard 192.168.1.5:7000
填写移动槽点 因为四台16384/4=4096
然后,填写uuid,输入all,yes就好了
[root@localhost ~]# /usr/local/redis/src/redis-trib.rb check 192.168.1.5:7000
# 再次查看7007有了槽点
重新分配槽点是移动的每个主节点中的其中一部分
删除从节点
# 删除哪个就复制哪个的uuid,uuid使用check查看
[root@localhost ~]# /usr/local/redis/src/redis-trib.rb del-node 192.168.1.5:7003 f18c73d8dc1e7c679b03e25c5c0ff02dbec4f2e6
查看集群节点信息
[root@localhost ~]# /usr/local/redis/src/redis-trib.rb info 192.168.1.5:7000