Redis,RedisCluster,Redis主从复制、Redis持久化

发布于:2023-01-05 ⋅ 阅读:(280) ⋅ 点赞:(0)

目录

一、Redis

(一)、什么是Redis

(二)、 Redis的安装

(三)、启动和关闭redis

(四)、redis的基本命令

(五)、多数据库

(六)、Redis的五种数据类型

二、Redis持久化

(一)、RDB持久化  

(二)、AOF持久化  

三、Redis的主从复制

(一)主从复制

(二)配置主从赋值

四、redis集群的搭建

 (一)redis-cluster架构图

(二)Redis集群搭建

(三)Reids集群搭建环境

(四)搭建步骤

(五)、启动每个redis实例

(六)使用ruby搭建集群


一、Redis

(一)、什么是Redis

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

redis下载地址:http://download.redis.io/releases/redis-3.0.0.tar.gz

(二)、 Redis的安装

        1、准备

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

        yum install gcc-c++

        2、安装 

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

        tar -zxvf redis-3.0.0.tar.gz

        3、解压

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

        cd /usr/upload/redis-3.0.0

        ​ make

        4、安装到指定目录

        make install PREFIX=/usr/local/redis

(三)、启动和关闭redis

       前端启动

        1、启动方式:

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

        cd /usr/local/redis/bin

        ./redis-server

        2、启动缺点:

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

        3、启动图例:

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

       后端启动

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

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

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

        3、第三步:启动

        ./redis-server redis.conf

        关闭

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

        ./redis-cli -p 端口号 shutdown

  (四)、redis的基本命令

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

        ./redis-cli -h 127.0.0.1 -p 6379

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

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

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

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

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

 (五)、多数据库

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

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

        注意:

  1. redis不支持修改数据库的名称,只能通过select 0、select 1...选择数据库。

  2. FLUSHALL --清空所有数据库的所有数据

  3. FLUSHDB --清空当前所在数据库的数据

    (六)、Redis的五种数据类型

        1、string

        赋值: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

        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

        3、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"

        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"

        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"

二、Redis持久化

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

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

        (一)、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被修改,则发起快照保存

        1、在redis.conf中:

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

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

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

      2、  测试

1、删除dump.rdb

2、set test abc

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

总结:

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

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

(二)、AOF持久化  

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

       appendonly yes

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

        appendfilename appendonly.aof

        AOF持久化策略如下:

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

         测试

1、设置appendonly为yes

2、设置一个key

3、观察appendonly.aof

        总结:

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

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

三、Redis的主从复制

        (一)主从复制

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

说明

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

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

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

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

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

         2、主从配置

        主redis配置

                无需特殊配置。

        从redis配置

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

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

        3、主从复制过程

        复制过程说明:

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

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

3、master 就发送RDB文件给slave

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

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

注意:主redis挂了,从redis只能进行读取操作

(二)配置主从赋值

        1、拷贝redis

        由于资源有限,采用不同端口的redis来模拟多态redis服务器

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

        2、修改redis-6380的redis.conf

        先改变端口

        随后更改他的主redis ,让其链接到主redis上,如果是多台redis,则需要链接到另外一台redis服务器的ip和端口上

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

        效果:主从数据库数据一致        4、关闭主redis,使用从redis存入数据 

四、redis集群的搭建

       (一) redis-cluster架构图

        

        架构细节

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

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

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

 (二)Redis集群搭建

        注意: 由于资源有限,所有redis都采用虚拟机的方式,通过不同端口来表示不同的redis服务器

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

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

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

(三)Reids集群搭建环境

        使用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

(四)搭建步骤

        注意:搭建之前必须删除dump.rdb和appendonly.aof文件

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

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

cp -r  /usr/local/redis  /usr/local/redis-cluster/redis-700x    

 x 为1~6

  (五)、启动每个redis实例

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

 cd /usr/local/redis-cluster/redis-7001/bin
                ./redis-server redis.conf
 cd /usr/local/redis-cluster/redis-7002/bin
                ./redis-server redis.conf
 cd /usr/local/redis-cluster/redis-7003/bin
                ./redis-server redis.conf
 cd /usr/local/redis-cluster/redis-7004/bin
                ./redis-server redis.conf
 cd /usr/local/redis-cluster/redis-7005/bin
                ./redis-server redis.conf
 cd /usr/local/redis-cluster/redis-7006/bin
                ./redis-server redis.conf

        给脚本增加权限

[root@localhost redis-cluster]# chmod 777 start-all.sh

  (六)使用ruby搭建集群

[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

        出现这个弹框后选择yes

        Can I set the above configuration? (type 'yes' to accept): yes

测试

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

        ./redis-cli -c -p 7001

在后续使用集群时只需要执行一下脚本后,执行此命令即可进入集群中

        redis cluster命令

cluster info   #打印集群的信息

cluster nodes  #列出集群当前已知的所有节点(node),以及这些节点的相关信息  

本文含有隐藏内容,请 开通VIP 后查看