目录
1.Redis简介
1.1Redis简介
Redis 是当前互联网世界最为流行的 NoSQL(Not Only SQL)数据库。NoSQL 在互联网系统中的作用很大,因为它可以在很大程度上提高互联网系统的性能。
Redis 具备一定持久层的功能,也可以作为一种缓存工具。对于 NoSQL 数据库而言,作为持久层,它存储的数据 是半结构化的,这就意味着计算机在读入内存中有更少的规则,读入速度更快。
对于那些结构化、多范式规则的数据库系统而言,它更具性能优势。作为缓存,它可以支持大数据存入内存中,只 要命中率高,它就能快速响应,因为在内存中的数据读/写比数据库读/写磁盘的速度快几十到上百倍
1.2.Redis特点
Redis:Remote Dictionary Server(远程字典服务器)。是完全开源免费的,用C语言编写的,遵守BSD协议,是一 个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的 NoSQL数据库之一,也被人们称为数据结构服务器。
Redis与其他key - value缓存产品有以下三个特点: 1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 2. Redis不仅仅支持简单的key - value类型的数据,同时还提供list、set、zset、hash等数据结构的存储。 3. Redis支持数据的备份,即master - slave模式的数据备份。
1.3.为什么要用Redis
高性能: 假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在 缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相 当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可! 高并发: 直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存 中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
1.4.Redis与memcached的区别
2.Redis安装
2.1.yum安装
yum install epel-release --下载fedora的epel仓库 yum install redis -- 安装redis数据库
2.2.源码安装
首先需要安装tcl8.5版本以上,以解决 make test报错问题
TCL8.6安装
wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
tar xzvf tcl8.6.1-src.tar.gz -C /usr/local/
cd /usr/local/tcl8.6.1/unix/
./configure
make
make install
安装完成后,再安装redis
安装源码编译支持库:yum install gcc gcc-c++
下载包:wget https://download.redis.io/releases/redis-6.2.3.tar.gz
解压包:tar xzf redis-6.2.3.tar.gz
进入redis目录:cd redis-6.2.3
编译安装:make
编译测试:make test
编译安装历史清除:make distclean
3.Redis启动和停止
3.1.Redis的启动和关闭
不指定配置文件启动
src/redis-server
会产生启动警告:
解决办法如下:
echo 1024 > /proc/sys/net/core/somaxconn
在/etc/sysctl.conf 下添加如下内容:
net.ipv4.ip_forward = 1
vm.overcommit_memory=1
指定配置文件启动
src/redis-server redis.conf
前端启动后,终端页面会进入redis控制台,无法进行其他操作,可以在redis.conf文件中修改为后台启动。
将文件中的daemonize no 修改为yes即可
daemonize yes
前台启动的关闭操作
强制关闭:Ctrl+c
kill -9 进程
正常关闭:src/redis-cli shutdown
•强制关闭只需在Redis控制台直接执行即可(redis可能会丢失部分数据)。
•正常关闭需要另开一个终端窗口才可执行(redis不会丢失数据,推荐使用)。
一旦前端启动的关闭命令执行,则redis控制台关闭,redis服务也会停掉。
3.2.redis基础知识
1、单进程:单进程模型来处理客户端的请求。对读写等事件的相应。是通过epoll函数的包装来做到的。Redis的 实际处理速度完全依靠主进程的执行效率。Epoll是linux内核为处理大批量文件描述符而作了改进的epoll,是 linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的下 同CPU利用率。
2、默认16个库,类似数组下标从零开始,初始默认使用零号库。
3、select 命令切换数据库。
4、dbsize 查看当前数据库keys的数量
5、flushdb 清空当前数据库
6、flushall 清空全部数据库内容
7、redis索引都是从0开始的
4.Redis架构缓存实验
4.1.架构缓存准备
IP地址 | 环境 |
192.168.75.142 | MySQL |
192.168.75.144 | Web服务器 |
192.168.75.145 | redis |
关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
sed -i ‘s/enforcing/disabled/’/etc/selinux/config
setenforce 0
同步时间:
yum -y install ntp ntpdate
ntpdate cn.pool.ntp.org
hwclock --systohc
4.2.web服务器准备
1.PHP安装
yum install php php-fpm php-cli php-common php-gd php-mbstring php-mysql php-pdo php-devel phpxmlrpc php-xml php-bcmath php-dba php-enchant
2.安装php的redis扩展
wget http://pecl.php.net/get/redis-2.2.7.tgz
tar -zxvf redis-2.2.7.tgz
cd redis-2.2.7/
phpize
./configure
make && make install
编译完成后,可以看到安装目录下的文件
在文件/etc/php.ini 末尾添加内容
重启Web服务器的httpd服务
systemctl restart httpd
在httpd发布目录下编辑php页面
查看phpinfo是否显示成功:
安装redis
wget -c -t 0 http://download.redis.io/releases/redis-2.8.19.tar.gz
tar xvf redis-2.8.19.tar.gz
#安装很简单、直接make就可以了
cd redis-2.8.19
make
安装完毕后,如下图所示:
修改文件 redis.conf 中的daemonize no 改为yes。让redis变为后台启动。
启动redis(redis服务器)
src/redis-server redis.conf
编写php测试代码(web服务器)
vim redis.php
-
<?php
-
$redis=
new
Redis();
-
$redis->
connect(
'192.168.75.143',
6379)
or
die (
"could net connect redis server");
-
//此处修改自己的redis服务器地址,确保已经启动
-
# $query = "select * from test limit 9";
-
$query =
"select * from dog1";
-
for (
$key =
0;
$key <
10;
$key++)
-
{
-
if (!
$redis->
get(
$key))
-
{
-
$connect =
mysql_connect(
'192.168.75.142',
'redis',
'Nebula@123');
-
mysql_select_db(mytest);
-
-
mysql_query(
"SET CHARACTER SET UTF8");
-
mysql_query(
"SET CHARACTER_SET_RESULTS=UTF8");
-
mysql_query(
"SET NAMES ‘GBK'");
-
mysql_query(
"SET NAMES ‘UTF8′");
-
-
$result =
mysql_query(
$query);
-
$arr = [];
-
while (
$row =
mysql_fetch_assoc(
$result))
-
{
-
$redis->
setex(
$row[
'id'],
1,
$row[
'name']);
-
$arr[] =
$row;
-
}
-
$myserver =
'mysql';
-
$data =
$arr;
-
break;}
-
else
-
{
-
$myserver =
"redis";
-
$data[
$key] =
$redis->
get(
$key);
-
}
-
}
-
echo
$myserver;
-
echo
"<br>";
-
for (
$key =
0;
$key <
10;
$key++)
-
{
-
echo
"number is <b><font color=#FF0000>$key</font></b>";
-
echo
"<br>";
-
if (
$myserver ==
"mysql") {
-
$arr2 =
array_map(
'end',
$data);
-
echo
"name is <b><font color=#FF0000>$arr2[$key]</font></b>";
-
echo
"<br>";
-
}
-
else{
-
echo
"name is <b><font color=#FF0000>$data[$key]</font></b>";
-
echo
"<br>";
-
}
-
}
第一次测验,redis中没有对应的keys:
当再次访问时,redis中已经存在数据
5.Redis高可用概述
在Web服务器中,高可用是指服务器可以正常访问的时间。
在Redis服务器中,除了需要保证正常服务,还需要考虑数据容量的扩展、数据安全不丢失等等。
Redis技术中,实现高可用主要包括:持久化、复制、哨兵和集群。
1.持久化:持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储 在硬盘,保证数据不会因进程退出而丢失。
2.复制:复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现高可用的。复制主要实现了数据的多机备 份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力 受到单机的限制。
3.哨兵:在复制的基础上,哨兵实现了自动化的故障恢复。缺陷:写操作无法负载均衡;存储能力受到单机的限 制。
4.集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高 可用方案。
6.Redis主从复制
6.1.主从复制原理
Slave启动成功后,向Master发送一个sync命令。
Master收到后启动存盘进程,并且获取所有的修改数据的命令,在后台执行完毕后,Master将整个数据传送给slave,这样就完成了一次完全同步。
全量复制和增量复制:
全量复制:slave接收到数据后,将其存入到内存
增量复制:master将新获取到的数据再一次传递给slave,完成同步。
6.2.主从复制实战
基础配置:
准备三台服务器,注意关闭防火墙、selinux、iptables、时间同步。这些在之前4.1有写到。
IP地址 | 环境 |
192.168.75.142 | 从服务器 |
192.168.75.143 | 从服务器 |
192.168.75.145 | 主服务器 |
搭建步骤:
1.安装redis.
分别给三台服务器安装Redis
2.配置主服务器。
1、进入主服务器,打开redis配置文件,修改protected yes为no,即关闭保护模式让其他主机也能连接
2、将bind 127.0.0.1这行注释或者指定ip。(本例是注释,即所有ip都能连接)
3、开启守护进程
daemonize yes
4.设置访问密码(下图)(由于redis性能非常高,撞库风险极大,建议线上把密码设置非常复杂,最好能在第2步中指定 ip)。
3.从服务器的配置
从服务器的配置1-4步与主服务器相同。
5.配置所属服务器的IP和端口
6.配置所属主服务器的密码
测试
1.启动主服务器和从服务器的redis
src/redis-server redis.conf
2.进入主服务器(192.168.75.145)
因为在文件中设置了密码,需要登录。
用set命令设置一个值
3.进入从服务器查看
使用get获取name的值
可以看到,从服务器获取到了name的值。代表测试成功。
但是如果想在从服务器上设置值,是会报错的。
7.Redis哨兵模式
7.1.哨兵模式的定义
Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis 的高可用性解决方案,sentinel哨兵模式已经 被集成在redis2.4之后的版本中。sentinel系统可以监视一个或者多个redis master服务,以及这些master服务的 所有slave;当某个master服务下线时,自动将该master下的slave升级为master服务替代已下线的master服务继 续处理请求。
7.2.哨兵模式的作用
监控:sentinel会不断检查主服务器和从服务器是否运行正常
提醒:当被监控的某个redis服务器出现故障时,sentinel可以通过API向管理员或其他应用程序发送通知。
自动故障转移:当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操 作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制 新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以 使用新主服务器代替失效服务器。
7.3.哨兵模式工作原理
哨兵的作用:
•通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
•当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配 置文件,让它们切换主机。
当各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
故障切换原理:(重点)
假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程, 仅仅是哨兵1主观的认为主服务 器不可用,这个现象称为 主观下线。 当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵 之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式, 让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为 客观下线。
哨兵的工作方式:(重点)
1)每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个PING命令
2)如果一个实例(instance) 距离最后一次有效回复PING命令的时间超过own-after-milliseconds 选项所指定的值,则这个实例会被Sentinel标记为主观下线
3)如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态
4)当有足够数量的Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态,则Master会被标记为客观下线
5)在一般情况下,每个Sentinel 会以每10秒一次的频率向它已知的所有Master,Slave发送INFO命令
6)当Master被Sentinel标记为客观下线时,Sentinel 向下的 Master 的所有Slave发送INFO命令的频率会从10秒一次改为每秒一次。
7)若没有足够数量的Sentinel同意Master已经下线,Master的客观下线状态就会被移除。若Master重新向Sentinel的PING命令返回有效回复,Master的主观下线状态就会被移除。
7.4.哨兵模式搭建
环境配置:
IP地址 | 环境 |
192.168.75.142 | redis-master |
192.168.75.143 | redis-slave |
192.168.75.145 | redis-slave |
搭建步骤:
1.修改哨兵的配置文件 sentinel.conf。可以使用scp命令将文件复制给其他服务器
scp sentinel.conf 192.168.75.143:/opt/redis-6.2.3/
scp sentinel.conf 192.168.75.145:/opt/redis-6.2.3/
如果使用的是配置过哨兵模式的服务器,需要断开与主节点的复制关系,可以使用下面的命令
slaveof no one
2.启动redis服务
src/redis-server redis.conf
3.启动sentinel服务
src/redis-server sentinel.conf --sentinel
出现如图的报错,则说明是连接数设置太低,修改后重启就不会报错。
echo 1024 > /proc/sys/net/core/somaxconn
启动后,在日志文件中可以查到相关的信息,可以看到两个节点已经加入
在192.168.75.143上查看master信息
注意,在查看前需要输入刚才在配置文件中配置的密码
4.设置主机故障
与此同时,在slave机上,日志文件会有输出
可以看到,最终145服务器变为了主机
在redis服务上也可以查看到
5.重新启动142的redis服务,查看日志文件变化
可以看到,142重新启动后,变为了145的slave,并不会重新变为master
转载:https://blog.csdn.net/qq_60787657/article/details/128768460