软件包提取码:w5hy
redis: 非关系型数据库,基于键值对形式的数据库,查询效率高没有表之间的约束查询起来比较方便
特点:
- 支持多种的数据类型
- 支持分布式存储
- 功能集比较丰富
- 开源
- 缓存:缓存动态数据 提高客户端的访问速度减轻数据库的压力读redis 在mysq|上写入数据
redis和memcache区别 - redis能够将数据持久化memcache所有的数据都是存放在内存中的 不能进行持久化memcache宕机或者重启,其中的数据将会全部丢失。
- redis能够支持多种数据类型memcache只能支持 字符串
- redis单进程单线程的访问memcache是多线程的工作模式
- redis虽然是单线程的工作模式,但是redis使用了线程多路复用的功能,提高了redis的性能redis —多个进程— 单个线程
- redis的缓存数据尽量小一-些, memcahe数据块可以比较大- -些
redis的持久化: 有周期性 需要时间
redis先将数据缓存在内存中,可以通过周期,把缓存的内容中的内容通过aof和rdb的方式写入硬盘当中(数据不会丢失)需要更新
redis中缓存的数据: - 不经常修改的数据 例如:用户信息 商品简介 商品分类
- 查询效率比较高的 提高用户的访问速度
不适合缓存的数据: - 需要和数据库强一致性
redis的穿透: - 当请求为不正常的请求,redis查询不到对应的数据 直接去数据库上请求,会让数据不太安全
解决方式:拒绝空连接或不正常的数据
redis的雪崩: - 当请求过大,查询时间长积压了很多请求,redis宕机对于redis的请求会全部转移到MySQL
解决方法:设置最大连接
reids的常用的命令: - select 切换数据库 redis默认有16个数据库 (0-15)
- set 创建键值对 如果键对存在,会直接覆盖掉
set key value - get 查看指定的键值对get key
- mset 批量创建键值对
mset key1 value key2 value - append 对于指定的键的值的内容进行追加
append key append value - keys * 查看所有数据库中的键
- dbsize 统计数据库中的键的个数
- move 对于键值对进行迁移
move key db - del 删除指定的键值对 可以有多个
del key1 key2 - flushall 清空数据库中所有的键值对
整合lnmp
[root@CentOS2 ~]# vim /usr/local/nginx/conf/nginx.conf
fastcgi_pass 192.168.1.2:9000;
安装redis
[root@CentOS2 ~]# tar zxf redis-4.0.6.tar.gz
[root@CentOS2 ~]# mv redis-4.0.6 /usr/local/redis
[root@CentOS2 ~]# cd /usr/local/redis/
[root@CentOS2 redis]# make && make install
[root@CentOS2 redis]# vim redis.conf
69 bind 192.168.1.2
136 daemonize yes
[root@CentOS2 redis]# redis-server /usr/local/redis/redis.conf #启动服务
[root@CentOS2 redis]# netstat -anput | grep redis
tcp 0 0 192.168.1.2:6379 0.0.0.0:* LISTEN 26803/redis-server
[root@CentOS2 redis]# redis-cli -h 192.168.1.2 -p 6379 #登录redis
#php打模块
[root@CentOS1 ~]# unzip phpredis-develop.zip
[root@CentOS1 ~]# cd phpredis-develop/
[root@CentOS1 phpredis-master]# phpize
[root@CentOS1 phpredis-master]# ./configure --with-php-config=/usr/local/php/bin/php-config && make && make install
[root@CentOS1 phpredis-master]# vim /usr/local/php/php.ini
#末尾处添加
extension = redis.so
[root@CentOS1 phpredis-master]# mysql -uroot -p123.com
create database abc;
use abc
create table test(id int,name varchar(10));
insert into test values(1,"one"),(2,"two"),(3,"three"),(4,"four"),(5,"five");
grant all on abc.test to "root"@"192.168.1.2" identified by "123.com";
grant all on abc.test to "root"@"主机名" identified by "123.com";
flush privileges;
exit
7版本页面
[root@CentOS2 ~]# vim /usr/local/nginx/html/index.php
<?php
$redis=new Redis;
$redis->connect("192.168.1.2",6379) or die ("could not connect");
$query="select * from abc.test limit 5";
for ($key=1;$key<=5;$key++) {
if (!$redis->get($key)) {
$conn=mysqli_connect("192.168.1.2","root","123.com");
$result=mysqli_query($conn,$query);
while ($row=mysqli_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>";
}
?>
redis集群
redis来缓存mysql的数据的
因为mysql的数据随着用户不断的增加,导致redis的空间不够缓存mysql的数据,那么就可以使用多台redis组成一个组,形成一个集群,来扩大redis的缓存数据量
redis集群 最少3个节点,为了保证数据的安全,3个节点还需要3个备份
每个3个主节点之间的地位都是平等的,他们之间不分主从,每个上面都会有连接
redis是通过hash槽点来进行分配数据的
redis总共有16384个槽点(0-16383)
redis集群中数据是在槽点上的 槽点在哪里 数据就在哪里
将这些槽点分配平均到每一个主节点上,只有槽点的节点才会进行工作,主节点上有槽点,从节点是没有槽点的,当主节点宕机,从节点会接收槽点,保存数据,并从节点会变为主节点,当主修好之后,添加回集群,会变成从节点
当在实际生产环境当中 要注意 备份节点和主节点不要部署在同一台主机上 要交叉排放
数据算法 crc16(key)%16383=100
缓存流程
客户端发送请求(key) redis(集群)crc16算法,将当前的请求交给合适的redis,比如是第一个主节点,如果第一个主节点上没有匹配到数据,则去后端mysql上获取数据,mysql会直接返回给客户端,在客户端的同时,也会给redis发送一份,做为缓存,如果客户端再次访问同样的数据,则还是会将请求交给第一个的节点,这样redis将会把数据直接返回给客户端
通过多个端口实现redis集群
[root@CentOS2 html]# killall -9 redis-server
[root@CentOS2 html]# netstat -anput | grep redis-server
[root@CentOS2 ~]# mkdir /usr/local/cluster
[root@CentOS2 ~]# cd /usr/local/cluster/
[root@CentOS2 cluster]# mkdir {7000..7005}
[root@CentOS2 cluster]# cp /usr/local/redis/redis.conf 7000/
[root@CentOS2 cluster]# vim 7000/redis.conf
69 bind 192.168.1.2 #监听的ip
92 port 7000 #端口
136 daemonize yes #后台运行
672 appendonly yes #开启持久化
676 appendfilename "appendonly-7000.aof" #持久化文件
814 cluster-enabled yes #开启集群功能
822 cluster-config-file nodes-7000.conf #集群节点的配置文件
828 cluster-node-timeout 5000 #节点连接超时时间
[root@CentOS2 cluster]# cp 7000/redis.conf 7001/
[root@CentOS2 cluster]# cp 7000/redis.conf 7002/
[root@CentOS2 cluster]# cp 7000/redis.conf 7003/
[root@CentOS2 cluster]# cp 7000/redis.conf 7004/
[root@CentOS2 cluster]# cp 7000/redis.conf 7005/
[root@CentOS2 cluster]# sed -i "s/7000/7001/g" 7001/redis.conf
[root@CentOS2 cluster]# sed -i "s/7000/7002/g" 7002/redis.conf
appendfilename "appendonly-7002.aof"
cluster-config-file nodes-7002.conf
[root@CentOS2 cluster]# sed -i "s/7000/7003/g" 7003/redis.conf
[root@CentOS2 cluster]# sed -i "s/7000/7004/g" 7004/redis.conf
[root@CentOS2 cluster]# sed -i "s/7000/7005/g" 7005/redis.conf
[root@CentOS2 cluster]# redis-server 7000/redis.conf
[root@CentOS2 cluster]# redis-server 7001/redis.conf
[root@CentOS2 cluster]# redis-server 7002/redis.conf
[root@CentOS2 cluster]# redis-server 7003/redis.conf
[root@CentOS2 cluster]# redis-server 7004/redis.conf
[root@CentOS2 cluster]# redis-server 7005/redis.conf
[root@CentOS2 cluster]# yum -y install ruby
[root@CentOS2 cluster]# cd
[root@CentOS2 ~]# gem install redis-3.3.0.gem
[root@CentOS2 ~]# ln -s /usr/local/redis/src/redis-trib.rb /usr/bin/
[root@CentOS2 ~]# redis-trib.rb create --replicas 1 192.168.1.2:7000 192.168.1.2:7001 192.168.1.2:7002 192.168.1.2:7003 192.168.1.2:7004 192.168.1.2:7005
[root@CentOS2 ~]# redis-trib.rb check 192.168.1.2:7000
–replicas 1 指定主节点上面从节点节点的个数
多台主机 请写对应的ip 主节点是随机的 如果需要设置交叉排放 需要搭建好之后自己调整
如果想一次成功 前三台 一般为主节点 后面为从节点
验证
[root@CentOS2 ~]# redis-cli -h 192.168.1.2 -p 7000 -c
192.168.1.2:7000> set name jskdljfslkdjfosilkjfndlskfj
-> Redirected to slot [5798] located at 192.168.1.2:7001
OK
192.168.1.2:7001> set qqqqqqsafkjasjkg rrrr
-> Redirected to slot [12773] located at 192.168.1.2:7002
OK
192.168.1.2:7000> set gsjdkfhisdkhfkajdfhjkldsfhajlkhfldasjkhfhj llll
-> Redirected to slot [13396] located at 192.168.1.2:7002
OK
当随意停掉一 个主接点时,从节点将会变成主节点
178 netstat -anput| grep 7000
179 kill -9 58869
181 redis-trib.rb check 192.168.1.2:7001
重新启动之后没有槽点了(如果是高版本 当这个节点再次启动会自动加入到集群中成为从节点)
182 redis-server /usr/local/cluster/7000/redis.conf
183 redis-trib.rb check 192.1 68.2.20:7000
redis-trib.rb
create创建集群–replicas 指定从节 点的个数
reshard槽点重新分配
check
检查集群
info查看集群的详情信息
add-node添加节点默认为主节点
add-node --slave 添加从节点–master-id 指定主节点
del-node删除节点删除没有槽点的节点可以删除有槽点的节点不能删除
redis-trib.rb
- create 创建集群
- –replicas 指定从节点个数
- reshard槽点重新分配
- check检查集群
- info查看集群的详情信息
- add-node添加节点默认为主节点
-
--slave添加从节点 --master-id 指定主节点
- del-node删除节点删除没有槽点的节点可以删除有槽点的节点不能删除
添加从节点
[root@CentOS2 ~]# cd /usr/local/cluster/
[root@CentOS2 cluster]# mkdir 7006
[root@CentOS2 cluster]# cp 7000/redis.conf 7006/
[root@CentOS2 cluster]# sed -i "s/7000/7006/g" 7006/redis.conf
[root@CentOS2 cluster]# cat 7006/redis.conf | grep 7006
port 7006
appendfilename "appendonly-7006.aof"
cluster-config-file nodes-7006.conf
[root@CentOS2 cluster]# redis-server 7006/redis.conf
[root@CentOS2 cluster]# redis-trib.rb check 192.168.1.2:7000
e6e0230df1df53941ddee974ba788b16a04d748a
192 redis-trib.rb add-node --slave --master-id e6e0230df1df53941ddee974ba788b16a04d748a 192.168.1.2:7006 192.168.1.2:7003 主节点的id 从节点的ip 主节点的ip
193 redis-trib.rb check 192.168.1.2:7000
[root@CentOS2 cluster]# redis-trib.rb info 192.168.1.2:7000
192.168.1.2:7000 (f6a5cc79...) -> 2 keys | 5462 slots | 1 slaves.
192.168.1.2:7003 (e6e0230d...) -> 0 keys | 5461 slots | 1 slaves.
192.168.1.2:7005 (8d33a34c...) -> 1 keys | 5461 slots | 1 slaves.
添加新节点
[root@CentOS2 cluster]# mkdir 7006
[root@CentOS2 cluster]# cp 7000/redis.conf 7006/
[root@CentOS2 cluster]# sed -i "s/7000/7006/g" 7006/redis.conf
[root@CentOS2 cluster]# cat 7006/redis.conf | grep 7006
[root@CentOS2 cluster]# redis-server 7006/redis.conf
添加主节点
[root@CentOS2 cluster]# mkdir 7007
[root@CentOS2 cluster]# cp 7000/redis.conf 7007
[root@CentOS2 cluster]# sed -i "s/7000/7007/g" 7007/redis.conf
[root@CentOS2 cluster]# redis-server 7007/redis.conf
[root@CentOS2 cluster]# redis-trib.rb add-node 192.168.1.2:7007 192.168.1.2:7000
[root@CentOS2 cluster]# redis-trib.rb check 192.168.1.2:7000 #查看集群信息
#找到7007节点复制他的uuid
eb64891fb57ee8bf2bd29460faf5a0e0c0debfd2
#重新分配槽点
[root@CentOS2 cluster]# redis-trib.rb reshard 192.168.1.2:7000 #重新分配集群的槽点
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? eb64891fb57ee8bf2bd29460faf5a0e0c0debfd2(7007的uuid) #要给那个主节点移动
Source node #1:all #从所有节点总共移动4096
Do you want to proceed with the proposed reshard plan (yes/no)? yes
[root@CentOS2 cluster]# redis-trib.rb check 192.168.1.2:7000 #查看群集
#会发现7007有了槽点而且是其他几个主节点都有分配
删除从节点
[root@CentOS2 cluster]# redis-trib.rb check 192.168.1.2:7000
#找到要删除从节点的uuid
[root@CentOS2 cluster]# redis-trib.rb del-node 192.168.1.2:7000 0d5668f1af10b650346f612e0644be750ce6f82a #从节点的uuid
删除整个集群
[root@CentOS2 cluster]# cd /usr/local/cluster/
[root@CentOS2 cluster]# rm -rf nodes-700*
[root@CentOS2 cluster]# rm -rf appendonly-700*
[root@CentOS2 cluster]# ls
[root@CentOS2 cluster]# killall -9 redis-server
[root@CentOS2 cluster]# netstat -anput | grep redis-server
[root@CentOS2 cluster]# redis-server 7000/redis.conf