Redis

前言

redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库

redis的官网:redis.io
注:域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地

redis的特点

1.支持数据持久化 (可以将数据存储在磁盘中,当redis重启之后会自动加载磁盘中的数据)
2.支持事务 
3.支持搭建集群 (mencached不支持集群)
4.丰富的数据结构 ----- string,list,set,zset,hash等数据结构的存储

安装Redis

单机版安装

redis版本下载地址

redis的安装

##获取源码包
 wget https://download.redis.io/releases/redis-7.4.0.tar.gz
##解压重命名
 tar xvzf redis-7.4.0.tar.gz -C /usr/local/
 cd /usr/local/
 mv redis-7.4.0/ redis
##安装编译工具对redis进行编译
 yum -y install gcc make
 cd redis/
 make
##出现以下页面就表示编译完成
    LINK redis-cli
    CC redis-benchmark.o
    LINK redis-benchmark
    INSTALL redis-check-rdb
    INSTALL redis-check-aof

Hint: It's a good idea to run 'make test' ;)

make[1]: Leaving directory `/usr/local/redis/src'
redis修改配置文件并启动
 vim /usr/local/redis/redis.conf

bind 0.0.0.0
daemonize yes	     #开启后台模式将no改为yes
timeout 300      #连接超时时间
port 6379            #端口号
dir ./data           ###存放在安装目录下的data目录下 用于存放数据
logfile "/var/log/redis.log"       ###存放日志
pidfile /var/run/redis_6379.pid    #定义pid文件

--##创建redis数据存放目录
 cd /usr/local/redis
 mkdir data/

--##配置redis为systemctl启动
 vim /lib/systemd/system/redis.service

[Unit]
Description=Redis
After=network.target

[Service]
ExecStart=/usr/local/redis/src/redis-server /usr/local/redis/redis.conf  --daemonize no
ExecStop=/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6379 shutdown

[Install]
WantedBy=multi-user.target
redis启动
--##启动redis(systemctl启动):
 systemctl daemon-reload
 systemctl start redis.service

--##启动redis
 cd /usr/local/redis
 nohup src/redis-server redis.conf &
 ./src/redis-cli
image-20240926142111393
[root@redis-master src]# pwd
/usr/local/redis/src
[root@redis-master src]# ./redis-cli 
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> get name
"jack"

keys *查看所有key
del 删除key
expire 给key设置过期时间
ttl 查看key的剩余有效期
exists 查看key是否存在,0为不存在,1为存在
info 查看redis的信息
flushdb 清空数据(慎用)
redis相关的工具
./redis-benchmark     #用于进行redis性能测试的工具 
./redis-check-dump    #用于修复出问题的dump.rdb文件	
./redis-cli           #redis的客户端
./redis-server        #redis的服务端
./redis-check-aof     #用于修复出问题的AOF文件
./redis-sentinel      #用于集群管理

redis一主两从三哨兵

一主两从配置文件修改

环境准备

redis版本 redis7.4.0

192.168.13.111 redis主节点 redis、sentinel

192.168.13.112 redis从节点 redis、sentinel

192.168.13.115 redis从节点 redis、sentinel

主节点修改配置文件

 vim /usr/local/redis/redis.conf
 
bind 0.0.0.0
protected no  		 #关闭加密保护 否则从节点无法连接
daemonize yes	     #开启后台模式将no改为yes
timeout 300      #连接超时时间
port 6379            #端口号
logfile "/var/log/redis.log"       ###存放日志
pidfile /var/run/redis_6379.pid    #定义pid文件
dbfilename dump.rdb
dir ./data           ###存放在安装目录下的data目录下 用于存放数据(目录需要提前创建)
save 3600 1 300 100 60 10000	   #snapshot触发的时机
stop-writes-on-bgsave-error yes    #当snapshot时出现错误无法继续时,阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等 
rdbcompression yes	 #启用rdb文件压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间
appendonly yes		 #开启aof功能,只有在“yes”下,aof重写/文件同步等特性才会生效

将主服务器的redis安装目录发送到从服务器

 scp -r /usr/local/redis/ 192.168.13.112:/usr/local/
 scp -r /usr/local/redis/ 192.168.13.115:/usr/local/

修改从节点配置文件

 vim /usr/local/redis/redis.conf
 
replicaof 192.168.13.111 6379 	##添加 master IP和端口(注意:老版本的redis是搜索 slaveof 有些许区别)

启动测试

##-->master节点操作
 pkill -9 redis
 ./src/redis-server redis.conf
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> get name
"jack"
##查看连接状态
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2  ##两个从节点
slave0:ip=192.168.13.112,port=6379,state=online,offset=6535,lag=0
slave1:ip=192.168.13.115,port=6379,state=online,offset=6535,lag=0

##-->从节点操作
 ./src/redis-server redis.conf
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> get name
"jack" 
##查看连接状态
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.13.111
master_port:6379
master_link_status:up

一主两从搭建成功

下面开始配置三哨兵

哨兵搭建

配置文件修改

 vim /usr/local/redis/sentinel.conf
 
protected-mode no
daemonize yes
logfile "/var/log/sentinel.log"
sentinel monitor mymaster 192.168.13.111 6379 2  ##监控的主节点信息 “2”表示有两个sentinel认为主节点主观下线,则将主机点判断为客观下线
sentinel down-after-milliseconds mymaster 30000  ##30s后主机点无反应,则判断为主观下线
sentinel failover-timeout mymaster 180000        

将配置文件发送到另外两台服务器

 scp /usr/local/redis/sentinel.conf 192.168.13.112:/usr/local/redis/
 scp /usr/local/redis/sentinel.conf 192.168.13.115:/usr/local/redis/

启动测试

##--启动哨兵(三台机器均启动)
 ./src/redis-sentinel sentinel.conf
##--动态查看
 tailf /var/log/sentinel.log 
image-20240926185854631
##主节点
 cd /usr/local/redis
 ./src/redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.13.115,port=6379,state=online,offset=684083,lag=1
slave1:ip=192.168.13.112,port=6379,state=online,offset=684226,lag=0

##--停止主节点redis
[root@redis-master redis]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      7544/./src/redis-se 
tcp        0      0 0.0.0.0:26379           0.0.0.0:*               LISTEN      7479/./src/redis-se 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      961/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1204/master         
tcp6       0      0 :::26379                :::*                    LISTEN      7479/./src/redis-se 
tcp6       0      0 :::22                   :::*                    LISTEN      961/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1204/master         
[root@redis-master redis]# kill 7544
image-20240926190337611
##--新的主节点机器
 cd /usr/local/redis
 ./src/redis-cli
 
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.13.112,port=6379,state=online,offset=743594,lag=1

##已实现故障转移
##--启动故障机器
 ./src/redis-server redis.conf 
 ./src/redis-cli

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.13.115
master_port:6379
master_link_status:up

恢复的机器会自动加入集群降为从节点