linux安装Redis且搭建主从、哨兵、集群以及使用(超详细)

一.Redis简介

1.NoSQL简介

​ 目前市场主流数据存储都是使用关系型数据库。每次操作关系型数据库时都是I/O操作,I/O操作是主要影响程序执行性能原因之一,连接数据库关闭数据库都是消耗性能的过程。尽量减少对数据库的操作,能够明显的提升程序运行效率。

​ 针对上面的问题,市场上就出现了各种NoSQL(Not Only SQL,不仅仅可以使用关系型数据库)数据库,它们的宣传口号:不是什么样的场景都必须使用关系型数据库,一些特定的场景使用NoSQL数据库更好。

常见NoSQL数据库:

​ memcached :键值对,内存型数据库,所有数据都在内存中。

​ Redis:和Memcached类似,还具备持久化能力。

​ HBase:以列作为存储。

​ MongoDB:以Document做存储。

2.Redis简介

​ Redis是以Key-Value形式进行存储的NoSQL数据库。

​ Redis是使用C语言进行编写的。

​ 平时操作的数据都在内存中,效率特高,读的效率110000/s,写81000/s,所以多把Redis当做缓存工具使用。

​ Redis以solt(槽)作为数据存储单元,每个槽中可以存储N多个键值对。Redis中固定具有16384。理论上可以实现一个槽是一个Redis。每个向Redis存储数据的key都会进行crc16算法得出一个值后对16384取余就是这个key存放的solt位置。

3.Redis持久化策略

​ Redis不仅仅是一个内存型数据库,还具备持久化能力。

1. RDB

​ rdb模式是默认模式,可以在指定的时间间隔内生成数据快照(snapshot),默认保存到dump.rdb文件中。当redis重启后会自动加载dump.rdb文件中内容到内存中。

​ 用户可以使用SAVE(同步)或BGSAVE(异步)手动保存数据。

​ 可以设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令,可以通过save选项设置多个保存条件,但只要其中任意一个条件被满足,服务器就会执行BGSAVE命令。

例如:

save 900 1   
save 300 10   
save 60 10000

那么只要满足以下三个条件中的任意一个,BGSAVE命令就会被执行
服务器在900秒之内,对数据库进行了至少1次修改
服务器在300秒之内,对数据库进行了至少10次修改
服务器在60秒之内,对数据库进行了至少10000次修改

1.1 优点

​ rdb文件是一个紧凑文件,直接使用rdb文件就可以还原数据。

​ 数据保存会由一个子进程进行保存,不影响父进程。

​ 恢复数据的效率要高于aof

1.2 缺点

​ 每次保存点之间导致redis不可意料的关闭,可能会丢失数据。

​ 由于每次保存数据都需要fork()子进程,在数据量比较大时可能会比较耗费性能。

2.AOF

​ AOF默认是关闭的,需要在配置文件中开启AOF。Redis支持AOF和RDB同时生效,如果同时存在,AOF优先级高于RDB(Redis重新启动时会使用AOF进行数据恢复)

​ 监听执行的命令,如果发现执行了修改数据的操作,同时直接同步到数据库文件中。

2.1 优点

​ 相对RDB数据更加安全。

2.2 缺点

​ 相同数据集AOF要大于RDB。

​ 相对RDB可能会慢一些。

2.3 开启办法

​ 修改redis.conf中

# 默认no
appendonly yes
# aof文件名
appendfilename "appendonly.aof"

二. Redis单机版安装

链接: https://pan.baidu.com/s/10QFOBZs9qEwo9QG1hZl1mQ
提取码: dhyi

1.安装依赖C语言依赖

redis使用C语言编写,所以需要安装C语言库

yum install -y gcc-c++ automake autoconf libtool make tcl

2.上传并解压

​ 把redis-5.0.5.tar.gz上传到/usr/local/tmp中

# cd /usr/local/tmp

解压

# tar zxf redis-5.0.5.tar.gz

3.编译并安装

​ 进入解压文件夹

# cd /usr/local/tmp/redis-5.0.5/

​ 编译

# make

​ 安装

# make install PREFIX=/usr/local/redis

4.开启守护进程

​ 复制cd /usr/local/tmp/redis-5.0.5/中redis.conf配置文件

# cp redis.conf /usr/local/redis/bin/

​ 修改配置文件

# cd /usr/local/redis/bin/

修改

# vim redis.conf

​ 把daemonize的值由no修改为yes

在这里插入图片描述

5.修改外部访问

​ 在redis5中需要修改配置文件redis.conf允许外部访问。需要修改两处。

​ 注释掉bind 127.0.0.1

#bind 127.0.0.1

​ 受保护模式,改成no : protected-mode yes 改成 no

protected-mode yes

在这里插入图片描述

6.启动并测试

​ 启动redis

​ # ./redis-server redis.conf

关闭redis命令

​ # ./redis-cli shutdown

​ 启动客户端工具

​ #./redis-cli

​ 在redis5中客户端工具对命令会有提供功能。

三. Redis主从复制

​ Redis支持集群功能。为了保证单一节点可用性,redis支持主从复制功能。每个节点有N个复制品(replica),其中一个复制品是主(master),另外N-1个复制品是从(Slave),也就是说Redis支持一主多从。

​ 一个主可有多个从,而一个从又可以看成主,它还可以有多个从。

在这里插入图片描述

1. 主从优点

​ 增加单一节点的健壮性,从而提升整个集群的稳定性。(Redis中当超过1/2节点不可用时,整个集群不可用)

​ 从节点可以对主节点数据备份,提升容灾能力。

​ 读写分离。在redis主从中,主节点一般用作写(具备读的能力),从节点只能读,利用这个特性实现读写分离,写用主,读用从。

1.1 一主多从搭建

​ 在已经搭建的单机版redis基础上进行操作。

​ 并且关闭redis单机版

./redis-cli shutdown
1.2 新建目录
# mkdir /usr/local/replica
1.3 复制目录

​ 把之前安装的redis单机版中bin目录复制三份,分别叫做:master、slave1、slave2

cp -r /usr/local/redis/bin /usr/local/replica/master
cp -r /usr/local/redis/bin /usr/local/replica/slave1
cp -r /usr/local/redis/bin /usr/local/replica/slave2
1.4 修改slave1从的配置文件

​ 修改2个从的redis.conf,指定主节点ip和端口。并修改自身端口号防止和其他redis冲突。

vim /usr/local/replica/slave1/redis.conf

​ 指定主节点ip和端口

replicaof 192.168.93.10 6379

​ 修改自己端口

port 6380
1.5.修改slave2从的配置文件
vim /usr/local/replica/slave2/redis.conf

​ 指定主节点ip和端口

replicaof 192.168.93.10 6379

​ 修改自己端口

port 6381
1.6 启动三个redis实例

​ 注意:一定要关闭单机的redis,否则端口冲突。

进入到指定目录

cd /usr/local/replica

创建文件

vim startup.sh

内容如下

cd /usr/local/replica/master/
./redis-server redis.conf
  cd /usr/local/replica/slave1
./redis-server redis.conf
  cd /usr/local/replica/slave2
./redis-server redis.conf

赋予权限

chmod a+x startup.sh

​ 开启

./startup.sh
1.7 查看启动状态
# ps aux|grep redis

在这里插入图片描述

1.8查看主节点信息

如下图有两个从节点,分别为6380、6381
在这里插入图片描述

1.9 测试

进入到指定目录

# cd /usr/local/replica/master/

进入到redsi

 ./redis-cli -p 6379

在客户端命令行模式下,添加一条数据:

set testname testvalue

在这里插入图片描述

进去slave查看数据是否同步。

# cd /usr/local/replica/slave1
# ./redis-cli -p 6380

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四. 哨兵(Sentinel)

​ 在redis主从默认是只有主具备写的能力,而从只能读。如果主宕机,整个节点不具备写能力。但是如果这是让一个从变成主,整个节点就可以继续工作。即使之前的主恢复过来也当做这个节点的从即可。

​ Redis的哨兵就是帮助监控整个节点的,当节点主宕机等情况下,帮助重新选取主。

​ Redis中哨兵支持单哨兵和多哨兵。单哨兵是只要这个哨兵发现master宕机了,就直接选取另一个master。而多哨兵是根据我们设定,达到一定数量哨兵认为master宕机后才会进行重新选取主。我们以多哨兵演示。

1. 没有哨兵下主从效果

​ 只要杀掉主,整个节点无法在写数据,从身份不会变化,主的信息还是以前的信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.搭建多哨兵

​ 前提:安装了单机的redis

2.1 新建目录

# mkdir /usr/local/sentinel

2.2 复制redis

# cp -r /usr/local/redis/bin/* /usr/local/sentinel

2.3 复制配置文件

​ 从redis解压目录中复制sentinel配置文件

# cd /usr/local/tmp/redis-5.0.5/

复制

# cp sentinel.conf /usr/local/sentinel/

2.4 修改配置文件

cp sentinel.conf sentinel-26380.conf

2、修改
# vim sentinel-26379.conf
3、修改端口
port 26379
4、修改守护进程
daemonize yes
5、修改日志文件
logfile “/usr/local/sentinel/26379.log”
6、指定主节点地址
sentinel monitor mymaster 192.168.93.10 6379 2

复制sentinel.conf,命名为sentinel-26380.conf

cp sentinel.conf sentinel-26380.conf

2、修改
# vim sentinel-26380.conf
3、修改端口
port 26380	
4、修改守护进程
daemonize yes
5、修改日志文件
logfile “/usr/local/sentinel/26380.log”
6、指定主节点地址
sentinel monitor mymaster 192.168.93.10 6379 2

复制sentinel.conf,命名为sentinel-26381.conf

cp sentinel.conf sentinel-26381.conf

2、修改
# vim sentinel-26381.conf
3、修改端口
port 26381
4、修改守护进程
daemonize yes
5、修改日志文件
logfile “/usr/local/sentinel/26381.log”
6、指定主节点地址
sentinel monitor mymaster 192.168.93.10 6379 2

2.5 启动主从

​ 如果已经启动状态,忽略下面命令。如果启动部分,全部kill后重新启动。

​ 使用kill杀死全部redis

# ps aux|grep redis
# kill -9 进程号

​ 启动redis主从

# cd /usr/local/replica
# ./startup.sh

2.6 启动三个哨兵

进入到指定目录

cd /usr/local/sentinel

新建文件

vim startup.sh

内容如下:

  • List item
cd /usr/local/sentinel
./redis-sentinel sentinel.conf
cd /usr/local/sentinel
./redis-sentinel sentinel-26380.conf
cd /usr/local/sentinel
./redis-sentinel sentinel-26381.conf

赋予权限

# chmod a+x startup.sh

开启

./startup.sh

2.7 查看日志

cat 26379.log

此时6381变为了主节点,具备读写能力
在这里插入图片描述

2.8查看启动状态

ps aux|grep redis

在这里插入图片描述

2.9 查看主节点是否配置成功

进入到master目录

cd /usr/local/replica/master

执行命令:

./redis-cli

查看信息:

info replication
在这里插入图片描述

2.10 查看从节点

cd /usr/local/replica/slave1

进入6380redis

./redis-cli -p 6380

//查看信息

info replication
在这里插入图片描述

2.11 测试宕机

​ 查看redis进程号

ps aux|grep redis

在这里插入图片描述

杀死主进程号

kill -9 进程号

​ 查看日志,短暂延迟后会发现,出现新的主。

cat 26379.log

进入到从节点

/usr/local/replica/slave2

进入到内部

./redis-cli -p 6381

查看信息

info replication

可以看到此时6381的从节点变为了主节点,且还有个从节点为6380
在这里插入图片描述
进行操作,6380也会同步数据:
在这里插入图片描述

2.12 重启master后,会变成从节点

cd /usr/local/replica/master

重启

./redis-server redis.conf

查看主节点信息情况
在这里插入图片描述

哨兵完成

五. 集群(Cluster)

​ 前提:已经安装好redis单机版。

​ 当集群中超过或等于1/2节点不可用时,整个集群不可用。为了搭建稳定集群,都采用奇数节点。

1 .复制redis配置文件

​ 从/usr/local/redis/bin下把redis.conf复制到当前目录中,命名为redis-7001.conf

cp /usr/local/redis/bin/redis.conf /usr/local/redis/bin/redis-7001.conf

2. 修改redis-7001.conf

cd /usr/local/redis/bin

修改命令

vim redis-7001.conf

​ 需要修改如下

1、修改端口 7001-7006
port 7001
2、开启集群
cluster-enabled yes
3、配置集群文件
cluster-config-file nodes-7001.conf
4、连接超时
cluster-node-timeout 15000
# appendonly yes 如果开启aof默认,需要修改为yes。如果使用rdb,此处不需要修改
daemonize yes
protected-mode no
5、修改线程的pid
pidfile /var/run/redis_7001.pid

3 .复制配置文件,并修改内容

​ 把redis-7001.conf 复制5份,分别叫做redis-7002.conf、redis-7003.conf、redis-7004.conf、redis-7005.conf、redis-7006.conf

# cp redis-7001.conf redis-7002.conf
# cp redis-7001.conf redis-7003.conf
# cp redis-7001.conf redis-7004.conf
# cp redis-7001.conf redis-7005.conf
# cp redis-7001.conf redis-7006.conf
新复制的5个配置文件都需要需改三处。

​ 例如nodes-7002.conf中需要把所有7001都换成7002。

改如下三个地方:

1、修改端口
port 7002
2、修改配置
cluster-config-file nodes-7002.conf
3、修改线程的pid
pidfile /var/run/redis_7002.pid

4 .启动6个redis

​ 可以使用redis-server结合6个配置文件进行启动6个实例。

​ 执行之前一定要先删除dump.rdb,不然集成的发布有有影响。

删除

# rm -f dump.rdb

创建文件命令

# vim startup.sh

创建脚本启动

./redis-server redis-7001.conf
./redis-server redis-7002.conf
./redis-server redis-7003.conf
./redis-server redis-7004.conf
./redis-server redis-7005.conf
./redis-server redis-7006.conf

赋予权限

# chmod a+x startup.sh

启动

# ./startup.sh

5. 查看启动状态

ps aux|grep redis
在这里插入图片描述

6. 建立集群

​ 在redis3的时候需要借助ruby脚本实现集群。在redis5中可以使用自带的redis-cli实现集群功能,比redis3的时候更加方便了。

​ 建议配置静态ip,ip改变集群失效

./redis-cli --cluster create 192.168.93.10:7001 192.168.93.10:7002 192.168.93.10:7003 192.168.93.10:7004 192.168.93.10:7005 192.168.93.10:7006 --cluster-replicas 1

是否三主三从:yes

在这里插入图片描述

如果出现一直等待, 遇到这种情况大部分是因为集群总线的端口没有开放 ,

例如:redis的端口为6379,那么另外一个需要开通的端口是:6379 + 10000, 即需要开启 16379用于集群总线
在这里插入图片描述

建立成功

5Ctypora-user-images%5C1710835189847.png&pos_id=img-QuxKVIQT-1710837712259)

7. 测试

​ 集群测试时,千万不要忘记最后一个-c参数。

# ./redis-cli -p 7001 -c
# set age 18

7001写数据自动跳到7002去了,证明集群搭建成功。

为何数据到7002了?

因为Redis集群是根据key做crc16运算,然后对16384做取余操作,确认hash槽的,而这个槽可能是其他节点管理的,就自然去其他节点查询了

在这里插入图片描述

8 .编写关闭脚本

# vim stop.sh
# chmod a+x stop.sh

./redis-cli -p 7001 shutdown
./redis-cli -p 7002 shutdown
./redis-cli -p 7003 shutdown
./redis-cli -p 7004 shutdown
./redis-cli -p 7005 shutdown
./redis-cli -p 7006 shutdown

六. 使用SpringBoot整合SpringDataRedis操作redis

Spring Data是Spring公司的顶级项目,里面包含了N多个二级子项目,这些子项目都是相对独立的项目。每个子项目是对不同API的封装。

​ 所有Spring Boot整合Spring Data xxxx的启动器都叫做spring-boot-starter-data-xxxx

​ Spring Data 好处很方便操作对象类型。

​ 把Redis不同值得类型放到一个opsForXXX方法中。

​ opsForValue : String值

​ opsForList : 列表List

​ opsForHash: 哈希表Hash

​ opsForZSet: 有序集合Sorted Set

​ opsForSet : 集合

1. 添加依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
</dependencies>

2. 配置配置文件

​ spring.redis.host=localhost 默认值

​ spring.redis.port=6379 端口号默认值

spring:
  redis:
    database: 0
    password:
    timeout: 10s
    cluster:
      nodes: 192.168.93.10:7001,192.168.93.10:7002,192.168.93.10:7003,192.168.93.10:7004,192.168.93.10:7005,192.168.93.10:7006

3.编写配置类

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory 		  factory){
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
        return redisTemplate;
    }
}

4. 编写代码

在这里插入图片描述

编写对象新增

@RestController
public class RedisController {

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @PostMapping("set")
    public void set(@RequestParam String v) {
        redisTemplate.opsForValue().set("name", v);
    }

    @GetMapping("get")
    public Object get(String k) {
        return redisTemplate.opsForValue().get(k);
    }

}

在这里插入图片描述

key为name的新增到7002了
在这里插入图片描述

七. 使用Redis效果

​ 使用缓存流程

​ 1. 先判断缓存中是否存在。如果存在直接从缓存中取出数据。不执行2,3步骤

​ 2. 如果不存在,从mysql中获取数据

​ 3. 获取数据后,把数据缓存到redis中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喝汽水的猫^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值