Redis的认识安装、持久化、主从复制及集群搭建

发布于:2023-01-06 ⋅ 阅读:(467) ⋅ 点赞:(0)

学习目标

  • redis
  • redis集群搭建

1.redis

1.1.什么是redis

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RI0EyFTc-1661260733790)(assets\1588856613440.png)]

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。redis是将数据存放到内存中,由于内容存取速度快所以redis被广泛应用在互联网项目中。

1.2.redis下载

http://download.redis.io/releases/redis-3.0.0.tar.gz

1.3.安装redis

1.3.1.准备

Redis是c语言开发的。安装redis需要c语言的环境。

yum install gcc-c++

1.3.2.安装redis

将redis-3.0.0.tar.gz拷贝到/usr/upload下解压源码

tar -zxvf redis-3.0.0.tar.gz

进入解压后的目录进行编译

cd /usr/upload/redis-3.0.0

make

安装到指定目录

make install PREFIX=/usr/local/redis

1.4.启动和关闭redis

1.4.1.前端启动

1、启动方式:

直接运行bin/redis-server将以前端模式启动。

cd /usr/local/redis/bin
./redis-server

2、启动缺点:

ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法

3、启动图例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lC4TP35N-1661260733790)(assets\1588858019718.png)]

**4、前端启动的关闭:**ctrl+c

1.4.2.后端启动

第一步:进入源码目录,里面有一份配置文件 redis.conf,然后将其拷贝到安装路径下

cp /usr/upload/redis-3.0.0/redis.conf  /usr/local/redis/bin

第二步:修改/usr/java/redis/bin下的redis.conf,将daemonize由no改为yes

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2eV5eUy4-1661260733791)(assets\1588858554831.png)]

第三步:启动

./redis-server redis.conf

1.4.3.关闭

到redis/bin目录下执行如下命令

./redis-cli -p 端口号 shutdown

1.4.redis的基本命令

redis-cli连上redis服务后,可以在命令行发送命令:

./redis-cli -h 127.0.0.1 -p 6379

1、set和**get:**使用set和get可以向redis设置数据、获取数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LcsJt1o1-1661260733792)(assets\1588858857065.png)]

2、**keys *:**查看当前库中所有的key值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TXVtLvvI-1661260733793)(assets\1588858890464.png)]

3、exists:判断key值是否存在

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h4IReE17-1661260733793)(assets\1588859376977.png)]

4、expirettl:expire设置key的过期时间,ttl查看key的有效期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cXaY6fAp-1661260733794)(assets\1588859832417.png)]

5、**clear:**可以使用clear命令对redis-cli终端屏幕清屏。

1.5.多数据库测试

​ 一个redis实例可以包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库,就好比一个mysql中创建多个数据库,客户端连接时指定连接哪个数据库。

​ 一个redis实例最多可提供16个数据库,下标从015,客户端默认连接第0号数据库,也可以通过select选择连接哪个数据库,如下连接1号库:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VE623H8d-1661260733795)(assets\1588859063758.png)]

在1号库中查询上节设置的数据,结果查询不到:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kED11Pd1-1661261177767)(assets\1588859071497.png)]

重新选择第0号数据库,查询数据:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4mphZus-1661260733796)(assets\1588859081710.png)]

如果选择一个不存在数据库则会报错:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0I35f1Sh-1661260733797)(assets\1588859090756.png)]

注意:

  1. redis不支持修改数据库的名称,只能通过select 0、select 1…选择数据库。
  2. FLUSHALL --清空所有数据库的所有数据
  3. FLUSHDB --清空当前所在数据库的数据

1.6.redis五种数据类型

1.6.1.string

String:key-value

赋值:set key value

127.0.0.1:6379> set test 123

OK

取值:get key

127.0.0.1:6379> get test

"123“

删除:del key

127.0.0.1:6379>del test

(integer) 1

自增自减:incr key decr key

127.0.0.1:6379> incr num
(integer) 1

127.0.0.1:6379> incr num
(integer) 2

127.0.0.1:6379> incr num
(integer) 3

1.6.2.hash

Hash:key-field-value

key:map

赋值:HSET key field value

127.0.0.1:6379> hset user name zhangsan
(integer) 1

取值:HGET key field

127.0.0.1:6379> hget user name
"zhangsan“

删除:HDEL key field

127.0.0.1:6379> hdel user name
(integer) 1

1.6.3.list

List:有顺序可重复,内部是使用双向链表实现的

192.168.25.153:6379> lpush list a b c d

(integer) 4

192.168.25.153:6379> lrange list 0 -1

1) "d"

2) "c"

3) "b"

4) "a"

192.168.25.153:6379> rpush list 1 2 3 4

(integer) 8

192.168.25.153:6379> lrange list 0 -1

1) "d"

2) "c"

3) "b"

4) "a"

5) "1"

6) "2"

7) "3"

8) "4"

192.168.25.153:6379> lrem list 0 d 

(integer) 1

192.168.25.153:6379> lrange list1 0 -1

1) "c"

2) "b"

3) "a"

4) "1"

5) "2"

6) "3"

7) "4"

1.6.4.set

Set:元素无顺序,不能重复

192.168.25.153:6379> sadd set1 a b c c c d

(integer) 4

192.168.25.153:6379> smembers set1

1) "b"

2) "c"

3) "d"

4) "a"

192.168.25.153:6379> srem set1 a

(integer) 1

192.168.25.153:6379> smembers set1

1) "b"

2) "c"

3) "d"

1.6.5.zset

SortedSet(zset):有顺序,不能重复

192.168.25.153:6379> zadd zset1 2 a 5 b 1 c 6 d

(integer) 4

192.168.25.153:6379> zrange zset1 0 -1

1) "c"

2) "a"

3) "b"

4) "d"

192.168.25.153:6379> zrem zset1 a

(integer) 1

192.168.25.153:6379> zrange zset1 0 -1

1) "c"

2) "b"

3) "d"

192.168.25.153:6379> zrevrange zset1 0 -1

1) "d"

2) "b"

3) "c"

192.168.25.153:6379> zrange zset1 0 -1 withscores

1) "c"

2) "1"

3) "b"

4) "5"

5) "d"

6) "6"

192.168.25.153:6379> zrevrange zset1 0 -1 withscores

1) "d"

2) "6"

3) "b"

4) "5"

5) "c"

6) "1"

1.6.6.总结

数据类型 赋值 取值 删除 特点
string set key value get key del key String
hash hset key k-v get key k hdel key k HashMap
list lpush/rpush key value lrange key 0 -1 lrem key -2 value List
set sadd key value smembers k srem key value Set
zset zadd key 序号 value… zrange key start end zrem key value Sort Set

1.7.持久化

​ Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。

​ Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合用。

1.7.1.RDB持久化

​ RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。

​ RDB是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:

save 900 1  #900秒内容如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000 #表示60秒内如果超过10000个key被修改,则发起快照保存

在redis.conf中:

​ 配置dir指定rdb快照文件的位置

​ 配置dbfilenam指定rdb快照文件的名称

Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。

1.7.1.1.实验

1、删除dump.rdb

2、set test abc

3、关闭服务端并观察bin目录的变化

总结:

​ 优点:让redis的数据存取速度变快

​ 缺点:服务器断电时会丢失部分数据(数据的完整性得不到保证)

1.7.2.AOF持久化

默认情况下Redis没有开启AOF(append onlyfile)方式的持久化,可以通过appendonly参数开启:
appendonly yes

​ AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:

appendfilename appendonly.aof

​ AOF持久化策略如下:

#appendfsync always   #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec  #每秒钟同步一次,该策略为AOF的缺省策略。
#appendfsync no        #从不同步。高效但是数据不会被持久化。

1.7.2.1.实验

1、设置appendonly为yes

2、设置一个key

3、观察appendonly.aof

总结:

​ 优点:持久化良好,能包证数据的完整性

​ 缺点:大大降低了redis系统的存取速度

1.8.主从复制(了解)

1.8.1.什么是主从复制

​ 持久化保证了即使redis服务重启也会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oJecWCiN-1661260733798)(assets\1589039722744.png)]

说明:

  • 主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。

  • 主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。

  • 只有一个主redis,可以有多个从redis。

  • 主从复制不会阻塞master,在同步数据时,master可以继续处理client 请求

  • 一个redis可以即是主又是从,如下图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jIUJiC9P-1661260733799)(assets\1589039837006.png)]

1.8.2.主从配置

1.8.2.1.主redis配置

无需特殊配置。

1.8.2.2.从redis配置

修改从redis服务器上的redis.conf文件,添加slaveof 主redis ip 主redis端口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wSKSNOpX-1661260733799)(assets\1589039974159.png)]

上边的配置说明当前该从redis服务器所对应的主redis是192.168.101.3,端口是6379

1.8.3.主从复制过程

主从复制过程如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BXMzvKKG-1661260733801)(assets\1589040056672.png)]

复制过程说明:

1、 slave 服务启动,slave 会建立和master 的连接,发送sync 命令。

2、master启动一个后台进程将数据库快照保存到RDB文件中

3、master 就发送RDB文件给slave

4、slave 将文件保存到磁盘上,然后加载到内存恢复

5、master把缓存的命令转发给slave

注意:主死了,从只能读

1.8.4.配置主从赋值

1、拷贝redis

cd /usr/local
cp -r redis redis-6380

2、修改redis-6380的redis.conf

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g2BDS3ns-1661260733801)(assets\1589040250848.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jm5w2WTO-1661260733802)(assets\1589040260528.png)]

3、分别开启主从redis,并在主redis存入数据,测试效果

​ 效果:主从数据库数据一致

4、关闭主redis,使用从redis存入数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8bJ8WSlg-1661260733803)(assets\1589040307115.png)]

2.redis集群的搭建

2.1.redis-cluster架构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RCp1oIp5-1661260733804)(assets\1588861425437.png)]

架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),节点的fail是通过集群中超过半数的节点检测失效时才生效.

(2)存取数据时连接任一节点都可以,但集群中有一个节点fail整个集群都会fail

Redis 集群中内置了 16384 个哈希槽,当需要在Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A2Qxq7qt-1661260733805)(assets\1588861598290.png)]

2.2.redis集群的搭建

Redis集群中至少应该有三个节点。要保证集群的高可用,需要每个节点有一个备份机。

Redis集群至少需要6台服务器。

搭建伪分布式。可以使用一台虚拟机运行6个redis实例。需要修改redis的端口号7001-7006

2.2.1.集群搭建环境

使用ruby脚本搭建集群,需要安装ruby。

[root@upload ~]# yum install ruby
[root@upload ~]# yum install rubygems
[root@upload ~]# gem install redis-3.0.0.gem 

Successfully installed redis-3.0.0

1 gem installed

Installing ri documentation for redis-3.0.0...

Installing RDoc documentation for redis-3.0.0...

[root@localhost ~]# cd redis-3.0.0/src
[root@localhost src]# ll *.rb
-rwxrwxr-x. 1 root root 48141 Apr  1  2015 redis-trib.rb

2.2.2.搭建步骤

注意:必须删除dump.rdb和appendonly.aof文件

搭建伪分布式,需要6个redis实例放到/usr/local/redis-cluster目录下,并且运行在不同的端口7001-7006

cp -r  /usr/local/redis  /usr/local/redis-cluster/redis-7001

2.2.2.1.创建6个redis实例

每个实例运行在不同的端口。还需要修改redis.conf配置文件。配置文件中还需要把cluster-enabled yes前的注释去掉。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3vZlLHy6-1661260733806)(assets\1588862084740.png)]

2.2.2.2.启动每个redis实例

创建启动集群的脚本:start-all.sh 放在/usr/java/redis-cluster目录下。

cd redis-7001
./bin/redis-server bin/redis.conf
cd ..
cd redis-7002
./bin/redis-server bin/redis.conf
cd ..
cd redis-7003
./bin/redis-server bin/redis.conf0
cd ..
cd redis-7004
./bin/redis-server bin/redis.conf
cd ..
cd redis-7005
./bin/redis-server bin/redis.conf
cd ..
cd redis-7006
./bin/redis-server bin/redis.conf
cd .. 
[root@localhost redis-cluster]# chmod 777 start-all.sh

创建关闭集群的脚本:shutdown-all.sh,放在/usr/local/redis-cluster目录下。

cd /usr/local/redis-cluster/redis-7001
./redis7001/ bin/redis-cli -p 7001 shutdown
./redis7001/ bin/redis-cli -p 7002 shutdown
./redis7001/ bin/redis-cli -p 7003 shutdown
./redis7001/ bin/redis-cli -p 7004 shutdown
./redis7001/ bin/redis-cli -p 7005 shutdown
./redis7001/ bin/redis-cli -p 7006 shutdown
[root@localhost redis-cluster]# chmod 777shutdown-all.sh

2.2.2.3.使用ruby搭建集群

切换到*.rb目录

[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005  192.168.25.153:7006
>>> Creating cluster
Connecting to node 192.168.25.153:7001: OK
Connecting to node 192.168.25.153:7002: OK
Connecting to node 192.168.25.153:7003: OK
Connecting to node 192.168.25.153:7004: OK
Connecting to node 192.168.25.153:7005: OK
Connecting to node 192.168.25.153:7006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.25.153:7001
192.168.25.153:7002
192.168.25.153:7003
Adding replica 192.168.25.153:7004 to 192.168.25.153:7001
Adding replica 192.168.25.153:7005 to 192.168.25.153:7002
Adding replica 192.168.25.153:7006 to 192.168.25.153:7003
M: 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 192.168.25.153:7001
   slots:0-5460 (5461 slots) master
M: 8cd93a9a943b4ef851af6a03edd699a6061ace01 192.168.25.153:7002
   slots:5461-10922 (5462 slots) master
M: 2935007902d83f20b1253d7f43dae32aab9744e6 192.168.25.153:7003
   slots:10923-16383 (5461 slots) master
S: 74f9d9706f848471583929fc8bbde3c8e99e211b 192.168.25.153:7004
   replicates 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3
S: 42cc9e25ebb19dda92591364c1df4b3a518b795b 192.168.25.153:7005
   replicates 8cd93a9a943b4ef851af6a03edd699a6061ace01
S: 8b1b11d509d29659c2831e7a9f6469c060dfcd39 192.168.25.153:7006
   replicates 2935007902d83f20b1253d7f43dae32aab9744e6
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.....
>>> Performing Cluster Check (using node 192.168.25.153:7001)
M: 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 192.168.25.153:7001
   slots:0-5460 (5461 slots) master
M: 8cd93a9a943b4ef851af6a03edd699a6061ace01 192.168.25.153:7002
   slots:5461-10922 (5462 slots) master
M: 2935007902d83f20b1253d7f43dae32aab9744e6 192.168.25.153:7003
   slots:10923-16383 (5461 slots) master
M: 74f9d9706f848471583929fc8bbde3c8e99e211b 192.168.25.153:7004
   slots: (0 slots) master
   replicates 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3
M: 42cc9e25ebb19dda92591364c1df4b3a518b795b 192.168.25.153:7005
   slots: (0 slots) master
   replicates 8cd93a9a943b4ef851af6a03edd699a6061ace01
M: 8b1b11d509d29659c2831e7a9f6469c060dfcd39 192.168.25.153:7006
   slots: (0 slots) master
   replicates 2935007902d83f20b1253d7f43dae32aab9744e6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost redis-cluster]# 

2.2.2.4.测试

启动时使用-c参数来启动集群模式,命令如下:

./redis-cli -c -p 7001

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ja6FjHfO-1661260733807)(assets\1588862894173.png)]

2.2.2.5. redis cluster命令

cluster info   #打印集群的信息

cluster nodes  #列出集群当前已知的所有节点(node),以及这些节点的相关信息  
本文含有隐藏内容,请 开通VIP 后查看