目录
[1. 在root目录下创建一个software目录,把redis压缩文件拷贝到该目录下](#1. 在root目录下创建一个software目录,把redis压缩文件拷贝到该目录下)
[2. 安装gcc环境](#2. 安装gcc环境)
[3. 在software目录中,进行解压缩操作](#3. 在software目录中,进行解压缩操作)
[4. 把压缩的文件copy到/usr/local/src/redis里面](#4. 把压缩的文件copy到/usr/local/src/redis里面)
[5. 进入到/usr/local/src/redis/redis-5.0.10/目录进行编译](#5. 进入到/usr/local/src/redis/redis-5.0.10/目录进行编译)
[6. 将redis安装到/usr/local/redis目录中](#6. 将redis安装到/usr/local/redis目录中)
[7. 把配置文件copy到/usr/local/redis/conf目录](#7. 把配置文件copy到/usr/local/redis/conf目录)
[8. 启动redis](#8. 启动redis)
[1. 基础配置](#1. 基础配置)
[2. 解读持久化配置](#2. 解读持久化配置)
[1. 淘汰策略和删除策略的区别和共同点](#1. 淘汰策略和删除策略的区别和共同点)
[2. 淘汰策略(内存相关)](#2. 淘汰策略(内存相关))
[3. 删除策略](#3. 删除策略)
[1. 在/usr/local/redis目录中创建msconf目录,将redis.conf文件拷贝到该目录下。](#1. 在/usr/local/redis目录中创建msconf目录,将redis.conf文件拷贝到该目录下。)
[2. 修改配置文件](#2. 修改配置文件)
[3. 启动redis](#3. 启动redis)
[① 进入到/usr/local/redis目录,执行下面的命令](#① 进入到/usr/local/redis目录,执行下面的命令)
②由于配置redis是在后台运行,所以他之前的启动日志是看不到的,执行下面的命令查看redis是否启动成功
[⑤ 配置主从关系(遵循配从不配主)](#⑤ 配置主从关系(遵循配从不配主))
[4. 问题思考](#4. 问题思考)
①、从机slave1和slave2同步主机的数据的时候,是从切入点同步还是从头同步,比如在主机未配置从机的时候,主机就存在数据k1,k2,k3,从k4的时候主机配置了两个从机,数据从哪里同步。
③、主机shutdown后情况如何?从机是上位还是原地待命?
⑤、其中一台从机shutdown之后情况如何?依照原有他能跟上大部队吗?
①、在之前的/usr/local/redis/msconf目录中创建一个sentinel.conf文件(文件名字不能错)
④、将主机shutdown之后,哨兵会进行投票选举出一个新的主机
①、首先进入到/usr/local/redis目录中创建一个clusterconf目录
⑤、复制五份修改后的配置文件,前三个作为主机的配置文件,后三个作为主机的从机配置文件
⑥、在/usr/local/redis/目录当中编写一个启动redis的脚本run.sh
⑦、执行run.sh脚本,启动redis集群,并查看redis状态
⑧、使用docker下载redis-trib的镜像运行(设置主从)
一、redis的非docker安装
准备一个redis压缩文件,可以直接在官网上下载https://redis.io/download.本篇文章使用的redis版本是5.0.10,使用ssh连接工具连接上linux服务器。
1. 在root目录下创建一个software目录,把redis压缩文件拷贝到该目录下
使用FinalShell工具,可以直接将下载好的压缩包,拖到当前目录中。
2. 安装gcc环境
因为redis是用C语言编写的,需要让redis运行起来,需要给linux中安装编译环境
bash
yum install gcc-c++
3. 在software目录中,进行解压缩操作
bash
tar -zxvf redis-5.0.10.tar.gz
4. 把压缩的文件copy到/usr/local/src/redis里面
bash
cp -r /root/software/redis/redis-5.0.10 /usr/local/src/redis
这里的cp命令就是复制,-r表示多层级拷贝。第一个路径是要copy的文件目录,第二个路径是目标路径。
5. 进入到/usr/local/src/redis/redis-5.0.10/目录进行编译
进入到该目录之后,执行make命令等待编译完成。
6. 将redis安装到/usr/local/redis目录中
bash
mkdir -p /usr/local/redis
make install PREFIX=/usr/local/redis
安装完成之后,可以进入到/usr/local/redis/bin目录中进行查看,使用命令ls.出现这些东西就表示安装成功了。

安装成功之后,在启动的时候还是存在问题的,我们启动的时候redis还是需要读取config文件的,所以在安装目录中我们还需要创建一个conf目录,将他的配置文件copy过来。
7. 把配置文件copy到/usr/local/redis/conf目录
bash
进入到/usr/local/redis目录中
mkdir conf
cp -r /usr/local/src/redis/redis-5.0.10/redis.conf /usr/local/redis/conf
8. 启动redis
bash
进入到/usr/local/redis目录
//启动服务器
./bin/redis-server ./conf/redis.conf
//启动客户端
./bin/redis-cli -h 127.0.0.1 -p 6379
服务器启动之后,想要查看redis服务是否启动成功可以通过下面的命令来查看
bash
ps -ef | grep redis

二、了解redis.conf配置文件
1. 基础配置
bash
bind:指定redis只接受来自该IP的请求,如果不设置,默认是处理所有请求,在生产环境中最好设置该项
port:监听端口,默认为6379
logfile:配置log文件地址,默认使用标准输出,即打印在命令行终端的端口上
database:设置数据库的个数,默认是共有16个库,默认使用的是0号数据库
2. 解读持久化配置
①、RDB持久化

- save 这三行配置表示的意思是,60秒内发送10000次写,触发一次快照;300秒10次写,也触发一次快照;900秒1次写,同样也触发一些快照。把三行全部注释掉就关闭RDB。
- stop-writes-on-bgsave-error yes表示的意思是,最后一次后台快照失败时,是否拒绝新的写入,强迫运维发现故障。
- rdbcompression yes / rdbchecksum yes表示的意思是,快照文件是否做LZF压缩,是否在最后家CRC64校验,默认都开。
- dbfilename dump.rdb / dir ./表示的意思是快照我呢见名和存放目录;dir也是AOF文件的目录。
②、AOF持久化
- appendonly no 表示的意思是,默认关闭AOF,改成yes就是开启
- appendfilename "appendonly.aof" 表示AOF文件名
- appendfsync everysec 表示每秒中把内存缓冲区fsync到磁盘一次(折中方案),另外两个可选:always(每条写命令到刷盘,最安全最慢)、no(完全交给OS,最快最危险)
- aof-load-truncated yes 表示的意思是,Redis 启动时发现 AOF 末尾被截断(例如断电),是否忽略截断部分继续启动;yes = 尽量加载,no = 直接报错退出。
- aof-use-rdb-preamble yes 表示的意思是,开启「混合持久化」:重写后的 AOF 文件前半段是 RDB 格式、后半段是增量 AOF,加载更快。
③、混合持久化
想要开启混合持久化,在配置文件中修改两行即可
- 打开AOF把这一行改成yes: appendonly yes
- 让重写后的AOF文件前半截用RDB格式,把这一行保持yes即可aof-use-rdb-preamble yes 。
三、淘汰策略和删除策略
1. 淘汰策略和删除策略的区别和共同点
①、共同点
保证redis的内存空间不被占满,既能保存尽量多的热数据,又不会出现OOM(内存溢出)崩溃。
②、区别
- 淘汰策略:是内存满了之后触发,决定扔掉那些键给新数据让路。
- 删除策略:是键过期之后触发,决定怎么把过期键清理掉,与内存上限无关。虽然说我们在写入数据的时候,会添加过期时间,到时间之后就访问不到这个数据了,但是在redis当中这个过期键有可能并没有删除掉。
2. 淘汰策略(内存相关)
①、触发时机
只有当maxmemory上限被设置并且实例已用内存≥maxmemory时才会触发;目的是给新数据腾地方
②、redis.conf配置文件
配置项:maxmemmory-policy <策略>
③、淘汰策略
- noeviction:默认。不淘汰任何键,只返回OOM错误(写操作失败,读命令任然可以执行)
- allkey-lru:所有键里面淘汰最久未使用的键;缓存场景最常用
- volatile-lru:在设置了过期时间的键里面淘汰最久未使用的键,没过期时间的键永远不被淘汰。
- allkeys-lfu:淘汰所有键里面访问次数最少的键,谁最冷门谁出局。(热点缓存场景更稳)
- volatile-lfu:在设置了过期时间的键里,淘汰访问次数最少的扔掉,同样不懂永不过期的键。
- volatile-random / allkeys-random:要么从带过期时间的键里随机淘汰,要么从全部键里随机淘汰。(基本不用)
- volatile-ttl:在带过期时间的键里,挑离过期时间最近的扔掉,越快过期的越先被清理。
3. 删除策略
①、触发时机
键本身设置了过期时间,到达过期时间后redis会触发删除策略将过期键删除掉。
②、实现方式(redis采用1+2组合)
1、惰性删除:每次访问键时检查过期时间,过期就立即删除(用到才检查);优点:省CPU,缺点:内存占用过大。
2、定期删除:没100ms抽一小批带过期时间的键,发现过期就删。(优点:把过期键慢慢清理掉,内存压力小)
3、定时删除:到期瞬间用定时器删除,对内存最友好,但高并发下CPU扛不住,redis未采用(优点:内存最干净,缺点:给每个设置过期时间的键,往全局定时器里注册一个事件进行监控,消耗CPU性能)
四、主从搭建(一主二从)
为了演示效果,直接使用一个服务器演示。redis启动的时候更换不同的redis.conf文件即可。
1. 在/usr/local/redis目录中创建msconf目录,将redis.conf文件拷贝到该目录下。
bash
//创建msconf目录,进入到/usr/local/redis目录中
mkdir msconf
//拷贝redis.conf文件
cp -r /usr/local/src/redis/redis-5.0.10/redis.conf ./msconf
2. 修改配置文件
- part 6379
- bind 0.0.0.0
- daemonize yes
- pidfile /var/run/redis_6379.pid
- logfile "/usr/local/redis/log/6379.log"
- save 30 5
- dbfilename dump6379.rdb
- dir /usr/local/redis/data/
剩下的两个配置文件,只需要将配置文件当中的6379统一替换成其他端口号即可。
3. 启动redis
① 进入到/usr/local/redis目录,执行下面的命令
bash
./bin/redis-server ./msconf/redis6379.conf
./bin/redis-server ./msconf/redis6380.conf
./bin/redis-server ./msconf/redis6381.conf
②由于配置redis是在后台运行,所以他之前的启动日志是看不到的,执行下面的命令查看redis是否启动成功
bash
ps -ef | grep redis

③复制多个ssh连接,开启redis客户端
bash
//进入到/usr/local/redis目录中
./bin/redis-cli -p 127.0.0.1 -h 6379
./bin/redis-cli -p 127.0.0.1 -h 6380
./bin/redis-cli -p 127.0.0.1 -h 6381
④进入redis客户端之后,查看当前redis的主从关系
bash
info replication

圈出来的地方是配置过主从之后,显示的当前主机存在几个从机,以及从机的ip和端口号。
⑤ 配置主从关系(遵循配从不配主)
也就是说我们需要让那个redis作为主机,就不配那个redis,在剩余的redis客户端中执行下面的命令即可。表示这个redis的主机是ip为127.0.0.1,端口为6379的redis
bash
slaveof 127.0.0.1 6379
配置完成之后我们可以查看一下从机的主从关系

4. 问题思考
①、从机slave1和slave2同步主机的数据的时候,是从切入点同步还是从头同步,比如在主机未配置从机的时候,主机就存在数据k1,k2,k3,从k4的时候主机配置了两个从机,数据从哪里同步。
主从关系配置完成之后,从机就会复制主机的全部数据。
②、从机是否可以写?
从机不能执行set命令,也就是不能进行写操作,redis客户端提示从机只允许读操作。
③、主机shutdown后情况如何?从机是上位还是原地待命?
shutdown之后,在没有配置哨兵模式的情况下,从机是不变的,等待主机恢复。
④、主机又回来了后,主机新增记录,从机还能顺利复制吗?
可以,主机恢复之后还是主机。
⑤、其中一台从机shutdown之后情况如何?依照原有他能跟上大部队吗?
可以跟上
❗❗当前主从模式存在问题就是主机宕机之后,系统就只能读取,不能写入了,必须等待主机恢复,所以下面我们了解一下哨兵模式。
五、哨兵模式(主从)

哨兵模式就是启动一个线程监视主机状态,如果主机挂了,那么就从从机当中通过投票选举的方式,选举一个从机升级为主机。
①、在之前的/usr/local/redis/msconf目录中创建一个sentinel.conf文件(文件名字不能错)
②、填写配置
bash
sentinel monitor host6379 127.0.0.1 6379 1
- 这里host6379表示的是自己起的哨兵名字
- 127.0.0.1 6379表示主机的ip和端口号
- 1表示投票的票数,这里设置成1的原因就是为了快速选举出主机,谁先获得一票谁就是主机。
③、启动redis哨兵模式

图片中圈出来的部分就是redis哨兵启动命令。
进入到/usr/local/redis目录执行下面的命令即可。执行这个命令之前需要确保之前的主从redis已经启动起来了,并且配置了主从关系。
bash
./bin/redis-sentinel ./msconf/sentinel.conf

④、将主机shutdown之后,哨兵会进行投票选举出一个新的主机

图片中显示将6381选举为主机了,我们查看一下6381这个redis.

⑤、6379也就是原主机上线之后,就会变成当前主机的从机

❗❗❗ 主从和哨兵模式存在一个问题就是,写操作在主机上进行,但是如果并发量过高,主机的压力过大,这个时候就需要了解集群模式了。
六、集群搭建
搭建集群模式,就是去中心化,在主从模式中,只有主机可以进行写操作(相当于主机可以讲话),但是从机只可以进行读操作(相当于从机不能讲话,只能听),那么主从模式中主机就是这个中心。现在使用集群模式,就是让每台服务器都拥有读写能力,为每个服务器搭配一个从机,防止主机挂掉之后,从机上位。
集群模式中,内置了16384个哈希槽,在集群模式启动的时候,他会给每个主机分配一个区间的哈希槽值。当需要在redis中存放k-v数据时,redis先对key使用redis内置的算法,计算出这个key所属的哈希值区间,将这个key-value路由存放到对应的redis服务器中。当进行读取操作的时候,可以根据key来计算所属的哈希值区间,将读取请求路由到对应的redis服务上来获取数据。

1、搭建过程
这里还是在一台机器上模拟。
①、首先进入到/usr/local/redis目录中创建一个clusterconf目录
bash
mkdir clusterconf
②、复制redis.conf配置文件。
进入到/usr/local/src/redis/redis-5.0.10目录中
bash
cp ./redis.conf /usr/local/redis/clusterconf
③、修改文件名称
bash
mv redis.conf redis7000.conf
④、修改配置文件内容
bash
bind 0.0.0.0
port 7000
daemonize yes
# 打开aof 持久化
appendonly yes
# 开启集群
cluster-enabled yes
# 集群的配置文件,该文件自动生成
cluster-config-file nodes-7000.conf
# 集群的超时时间
cluster-node-timeout 5000
⑤、复制五份修改后的配置文件,前三个作为主机的配置文件,后三个作为主机的从机配置文件
进入到clusterconf目录中,执行下面的命令,从7000-7005。并修改配置文件当中7000为对应的数字
bash
cp redis7000.conf redis7001.conf
⑥、在/usr/local/redis/目录当中编写一个启动redis的脚本run.sh
bash
./bin/redis-server ./clusterconf/redis7000.conf
./bin/redis-server ./clusterconf/redis7001.conf
./bin/redis-server ./clusterconf/redis7002.conf
./bin/redis-server ./clusterconf/redis7003.conf
./bin/redis-server ./clusterconf/redis7004.conf
./bin/redis-server ./clusterconf/redis7005.conf

可以看到这个启动脚本没有执行的权限。使用下面的命令给这个脚本文件升级权限
bash
chmod 777 run.sh
⑦、执行run.sh脚本,启动redis集群,并查看redis状态
进入到/usr/local/redis目录
bash
./run.sh
ps -ef | grep redis

但是现在没有主从的概念。
⑧、使用docker下载redis-trib的镜像运行(设置主从)
bash
#拉取镜像
docker pull inem0o/redis-trib
#运行
docker run -it --net host inem0o/redis-trib create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
第二个命令的作用是,用docker启动一个一次性容器,借助inem0o/redis-trib 镜像,在宿主机网络里给6个本地redis节点组件一个3主3从的redis-cluster
docker run -it启动一个交互式容器,把当前终端挂到容器的 stdin/stdout,方便你看到交互提示和输入 yes。--net host让容器直接使用宿主机网络栈(Linux-only)。create --replicas 1create 子命令表示"新建集群"。--replicas 1指定"每个主节点带 1 个从节点",6 个节点 → 3 主 3 从。

出现图片中的内容表示成功。7000这个服务器分配的哈希槽范围是0-5460,7001分配的是5461-10922 ...。
2、客户端连接测试
①、客户端连接
进入到/usr/local/redis目录当中,执行下面的命令
bash
./bin/redis-cli -c -h 127.0.0.1 -p 7000
#这里的-c表示集群模式
②、连接三个主机完成之后,随便挑选一个客户端写入数据

在连接7002主机的客户端,写入数据,计算出key的哈希值为5798,数据7001主机哈希槽的范围,所以将数据写入到7001主机当中,客户端的连接也由7002变为了7001.
③、随机选取一个客户端,获取数据

和上面一样,通过计算key的哈希值,将请求路由到了7001主机。