redis主从复制、哨兵服务、持久化、数据类型

1 案例1:配置主从复制

1.1 问题

  1. 配置一主一从结构
  2. 配置一主多从结构
  3. 配置主从从结构

1.2 方案

准备3台新虚拟机,具体配置如表-1所示。

redis主从复制、哨兵服务、持久化、数据类型_第1张图片

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:配置一主一从结构

1)配置host61为主服务器

    [root@host61 ~]# yum -y install redis 
    [root@host61 ~]# vim /etc/redis.conf
    69 bind 192.168.88.61  设置服务使用的Ip地址
    92 port 6379 设置服务使用的端口号 使用默认端口即可
    :wq
    [root@host61 ~]# systemctl  start redis
    [root@host61 ~]# redis-cli  -h 192.168.88.61 -p 6379
    192.168.88.61:6379> info replication  查看复制信息
    # Replication
    role:master  默认就是主服务器
    connected_slaves:0  没有从服务器
    master_replid:0aebff37df915061ddf157cc33d8742f14e8773f
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:0
    second_repl_offset:-1
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    192.168.88.61:6379>

2)配置host62为host61的从服务器

    [root@host62 ~]# yum -y install redis  安装软件
    [root@host62 ~]# vim /etc/redis.conf   修改配置文件
    69 bind 192.162.88.62 设置服务的ip地址
    92 port 6379 设置服务的端口号 默认即可
    :wq
    [root@host62 ~]# systemctl  start redis  启动服务
    [root@host62 ~]# redis-cli  -h 192.162.88.62 -p 6379 连接服务
    192.162.88.62.:6379> replicaof 192.162.88.61 6379  指定主服务器ip和端口
    OK
    192.162.88.62.:6379> config rewrite  永久保存配置
    OK
    192.162.88.62.:6379> exit 退出服务
    [root@host62 ~]# tail -1 /etc/redis.conf  查看文件末尾
    replicaof 192.162.88.61 6379
    [root@host62 ~]# redis-cli  -h 192.162.88.62 -p 6379  连接服务
    192.162.88.62.:6379> info replication  查看复制信息
    # Replication
    role:slave  角色
    master_host:192.162.88.61  主服务器ip地址 
    master_port:6379  主服务器端口号
    master_link_status:up  与主服务器连接状态 (up 正常  down 连接失败)
    master_last_io_seconds_ago:8
    master_sync_in_progress:0
    slave_repl_offset:14
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:14
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:14
    192.162.88.62.:6379>

3)在主服务器host61查看复制信息

    [root@host61 ~]# redis-cli  -h 192.168.88.61 -p 6379
    192.168.88.61:6379> info replication
    # Replication
    role:master 角色
    connected_slaves:1  一个从
    slave0:ip=192.168.88.62,port=6379,state=online,offset=322,lag=0 从服务器信息
    master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:322
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:322
    192.168.88.61:6379> mset x 1 y 2 z 3 存储数据
    OK
    192.168.88.61:6379> keys *  查看变量
    1) "z"
    2) "y"
    3) "x"

4)在从服务器查看是否同步数据

    [root@host62 ~]# redis-cli  -h 192.168.88.62 -p 6379
    192.168.88.62.:6379> keys *
    1) "y"
    2) "x"
    3) "z"
    192.168.88.62.:6379>

步骤二:配置一主多从结构

要求:把host63也配置为host61的从服务器

1)配置host63为host61的从服务器

    [root@host63 ~]# yum -y install redis  安装软件
    [root@host63 ~]# vim /etc/redis.conf   修改配置文件
    69 bind 192.168.88.63
    92 port 6379
    :wq
    [root@host63 ~]# systemctl  start redis  启动服务
    [root@host63 ~]# redis-cli  -h 192.168.88.63 -p 6379 连接服务
    192.168.88.63:6379> replicaof 192.168.88.61 6379 指定主服务器ip和端口
    OK
    192.168.88.63:6379> config rewrite  永久保存配置
    OK
    192.168.88.63:6379> exit
    [root@host63 ~]# tail -1 /etc/redis.conf   保存到文件末尾
    replicaof 192.168.88.61 6379
    [root@host63 ~]# redis-cli  -h 192.168.88.63 -p 6379  连接服务
    192.168.88.63:6379> info replication  查看复制信息
    # Replication
    role:slave 角色
    master_host:192.168.88.61 主服务器IP
    master_port:6379  主服务器端口
    master_link_status:up 与主服务器连接状态 up 正常连接状态 
    master_last_io_seconds_ago:9
    master_sync_in_progress:0
    slave_repl_offset:1171
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:1171
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1158
    repl_backlog_histlen:14
    192.168.88.63:6379> keys *  查看是否同步数据
    1) "x"
    2) "z"
    3) "y"
    192.168.88.63:6379>

在host61 查看到有2台从服务器

    [root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379
    192.168.88.61:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=192.168.88.62,port=6379,state=online,offset=3027,lag=0
    slave1:ip=192.168.88.63,port=6379,state=online,offset=3013,lag=1
    master_replid:209b3b7ce20c708ab1b6b95a5d1becb2454b0941
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:3027
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:3027
    192.168.88.61:6379>

步骤三:配置主从从结构

要求: 把host63恢复为独立的redis服务器,然后配置为host62的从服务器

1)配置host63

    [root@host63 ~]# redis-cli  -h 192.168.88.63 -p 6379
    192.168.88.63:6379> replicaof no one  恢复为独立的数据库服务器
    OK
    192.168.88.63:6379> replicaof 192.168.88.62 6379  指定主服务器为62
    OK
    192.168.88.63:6379> config rewrite  保存配置
    OK
    192.168.88.63:6379> exit 断开连接
    [root@host63 ~]# tail -1 /etc/redis.conf  查看是否保存
    replicaof 192.168.88.62 6379
    [root@host63 ~]# redis-cli  -h 192.168.88.63 -p 6379  连接服务
    192.168.88.63:6379> info replication  查看复制信息
    # Replication
    role:slave 角色
    master_host:192.168.88.62 主服务器IP
    master_port:6379 主服务端口
    master_link_status:up 与主服务器连接状态
    master_last_io_seconds_ago:0
    master_sync_in_progress:0
    slave_repl_offset:4545
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:4545
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:4420
    repl_backlog_histlen:126
    192.168.88.63:6379> 

2)在host62查看复制信息

    [root@host62 ~]# redis-cli  -h 192.168.88.62 -p 6379
    192.168.88.62.:6379> info replication  查看复制信息
    # Replication
    role:slave       本身是从服务器
    master_host:192.168.88.61 主服务器ip
    master_port:6379 主服务器redis服务端口
    master_link_status:up 与主服务器连接状态
    master_last_io_seconds_ago:4
    master_sync_in_progress:0
    slave_repl_offset:4769
    slave_priority:100
    slave_read_only:1
    connected_slaves:1  本身有一个从服务器
    slave0:ip=192.168.88.63,port=6379,state=online,offset=4769,lag=0 从服务器信息
    master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:4769
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:4769
    192.168.88.68.:6379> 

2 案例2:配置带验证的主从复制

2.1 问题

1)基于案例1做如下配置:

  • 配置主机host61,redis服务连接密码为123456
  • 主机host62设置连接host61的redis服务密码

2.2 方案

给host61主机的Redis服务设置连接密码,如果从服务器不指定连接密码无法同步数据。

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:配置主机host61,redis服务连接密码为123456

命令操作如下所示:

    [root@host61 ~]# redis-cli  -h 192.168.88.61 -p 6379
    192.168.88.61:6379> config get requirepass  查看密码,默认服务没有密码
    1) "requirepass"
    2) ""
    192.168.88.61:6379> config set requirepass 123456  设置密码
    OK
    192.168.88.61:6379> auth 123456  输入密码
    OK
    192.168.88.61:6379> config rewrite 保存配置
    OK
    192.168.88.61:6379> exit  退出
    [root@host61 ~]# tail -1 /etc/redis.conf   保存到文件的末尾
    requirepass "123456"
    [root@host61 ~]# redis-cli  -h 192.168.88.61 -p 6379  连接服务
    192.168.88.61:6379> auth 123456 输入密码
    OK
    192.168.88.61:6379> info replication 查看复制信息
    # Replication
    role:master
    connected_slaves:0   没有从服务器了 因为从没有输入连接密码连接不上主服务器
    master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:5763
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:5763
    192.168.88.61:6379>

步骤二:主机host62设置连接host61的redis服务密码

命令操作如下所示:

    [root@host62 ~]# redis-cli  -h 192.168.88.62 -p 6379  连接服务
    192.168.88.62.:6379> info replication 查看复制信息
    # Replication
    role:slave
    master_host:192.168.88.61
    master_port:6379
    master_link_status:down  没设置密码 与master主机是断开状态
    master_last_io_seconds_ago:-1
    master_sync_in_progress:0
    slave_repl_offset:1
    master_link_down_since_seconds:274
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:7803
    second_repl_offset:-1
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:7803
    192.168.88.62:6379> config set masterauth 123456  指定主服务器密码
    OK
    192.168.88.62:6379> config rewrite 保存配置
    OK
    192.168.88.62:6379> info replication 查看复制信息
    # Replication
    role:slave
    master_host:192.168.88.61
    master_port:6379
    master_link_status:up  设置连接密码后  状态为up 
    master_last_io_seconds_ago:10
    master_sync_in_progress:0
    slave_repl_offset:5847
    slave_priority:100
    slave_read_only:1
    connected_slaves:1
    slave0:ip=192.168.88.63,port=6379,state=online,offset=5847,lag=1
    master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:5847
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:5764
    repl_backlog_histlen:84
    192.168.88.62.:6379>

3 案例3:哨兵服务

3.1 问题

  1. 配置主机Host67为master服务器
  2. 配置主机host68为Host67的slave服务器
  3. 配置主机host69运行哨兵服务
  4. 测试配置

3.2 方案

准备3台新的虚拟机,具体配置如表-2所示。

redis主从复制、哨兵服务、持久化、数据类型_第2张图片

说明:

1)可以使用一主一从或 一主多从 或 主从从 + 哨兵服务 做服务的高可用 和 数据自动备份

2)如果主从结构中的redis服务设置连接密码的话必须全每台数据库都要设置密码且密码要一样,要么全都不设置密码。

3)如果Redis服务有密码宕机的服务器启动服务后,要人为指定主服务器的连接密码。

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:配置主机Host67为master服务器

命令操作如下所示:

1)配置host67为主服务器

    [root@host67 ~]# yum -y install redis  安装redis服务软件
    [root@host67 ~]# vim /etc/redis.conf  修改配置文件
    69 bind 192.168.88.67 设置redis服务使用IP地址
    92 port 6379 设置redis服务使用端口
    :wq
    [root@host67 ~]# systemctl  start redis   启动服务
    [root@host67 ~]# redis-cli  -h 192.168.88.67 -p 6379 连接服务
    192.168.88.67:6379> info replication  查看角色
    # Replication
    role:master 默认是master角色
    connected_slaves:0 没有从服务器
    master_replid:0aebff37df915061ddf157cc33d8742f14e8773f
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:0
    second_repl_offset:-1
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    192.168.88.67:6379>

步骤二:配置主机host68为Host67的slave服务器

命令操作如下所示:

2)配置host68为host67的从服务器

    [root@host68 ~]# yum -y install redis  安装软件
    [root@host68 ~]# vim /etc/redis.conf   修改配置文件
    69 bind 192.168.88.68 设置服务使用Ip地址
    92 port 6379 设置服务监听端口 默认即可
    :wq
    [root@host68 ~]# systemctl  start redis  启动服务
    [root@host68 ~]# redis-cli  -h 192.168.88.68 -p 6379 连接服务
    192.168.88.68:6379> replicaof 192.168.88.67 6379 指定主服务器ip和端口
    OK
    192.168.88.68:6379> config rewrite  永久保存配置
    OK
    192.168.88.68:6379> exit 断开
    [root@host68 ~]# tail -1 /etc/redis.conf   保存到文件末尾
    replicaof 192.168.88.67 6379
    [root@host68 ~]# redis-cli  -h 192.168.88.68 -p 6379  连接服务
    192.168.88.68:6379> info replication  查看复制信息
    # Replication
    role:slave  角色 从服务器
    master_host:192.168.88.67  主服务器Ip
    master_port:6379 主服务端口
    master_link_status:up  与主连接状态 
    master_last_io_seconds_ago:8
    master_sync_in_progress:0
    slave_repl_offset:14
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:14
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:14
    192.168.88.68:6379>

步骤三:配置主机host69运行哨兵服务

命令操作如下所示:

    ]# yum -y install  redis 安装软件
    ]# vim /etc/redis-sentinel.conf   创建并编辑主配置文件
    15 bind 192.168.88.69  指定哨兵服务使用ip地址
    21 port 26379  指定哨兵服务监听端口
    26 daemonize yes  以守护进程方式运行服务
    84 sentinel monitor mymaster 192.168.88.67 6379 1   监视master服务器Host67
    :wq
    [root@host69 ~]# systemctl  start redis-sentinel 启动哨兵服务
    [root@host69 ~]# netstat  -utnlp  | grep 26379  查看端口号
    tcp    0   0 192.168.88.69:26379     0.0.0.0:*  LISTEN      1651/redis-sentinel 
    [root@host69 ~]#

 查看日志获取监视信息

    [root@host69 ~]# tail -f /var/log/redis/sentinel.log   
    1651:X 03 Jun 2023 21:42:49.523 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    1651:X 03 Jun 2023 21:42:49.523 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1651, just started
    1651:X 03 Jun 2023 21:42:49.523 # Configuration loaded
    1651:X 03 Jun 2023 21:42:49.523 * supervised by systemd, will signal readiness
    1651:X 03 Jun 2023 21:42:49.525 * Running mode=sentinel, port=26379.
    1651:X 03 Jun 2023 21:42:49.525 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    1651:X 03 Jun 2023 21:42:49.530 # Sentinel ID is f9475074a53444ee81765646c105e04e73ac9ec8
    1651:X 03 Jun 2023 21:42:49.530 # +monitor master mymaster 192.168.88.67 6379 quorum 1
    1651:X 03 Jun 2023 21:42:49.533 * +slave slave 192.168.88.68:6379 192.168.88.68 6379 @ mymaster 192.168.88.67 6379

步骤四:测试配置

思路:停止master主机的redis 服务,原slave角色会升级为主,哨兵服务会自动监视新的master服务,宕机的master 主机恢复后自动配置为当前主的从服务器。

停止master主机的redis 服务

    [root@host67 ~]# systemctl  stop redis  

原slave角色会升级为主

    [root@host68 ~]# redis-cli  -h 192.168.88.68 -p 6379
    192.168.88.68:6379> info replication
    # Replication
    role:master  角色
    connected_slaves:0  没从服务器
    master_replid:e4d9399cdf19c724b032859e77316019735d391e
    master_replid2:bd1b8d193de170bedd8b40780ee3fb45f9590a5b
    master_repl_offset:35343
    second_repl_offset:32642
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:183
    repl_backlog_histlen:35161
    192.168.88.68:6379>

 哨兵服务会自动监视新的master服务

    [root@host69 ~]# tail -f /var/log/redis/sentinel.log  查看日志文件 
    1651:X 03 Jun 2023 21:50:23.603 # +failover-state-select-slave master mymaster 192.168.88.67 6379
    1651:X 03 Jun 2023 21:50:23.694 # +selected-slave slave 192.168.88.68:6379 192.168.88.68 6379 @ mymaster 192.168.88.67 6379
    1651:X 03 Jun 2023 21:50:23.695 * +failover-state-send-slaveof-noone slave 192.168.88.68:6379 192.168.88.68 6379 @ mymaster 192.168.88.67 6379
    1651:X 03 Jun 2023 21:50:23.796 * +failover-state-wait-promotion slave 192.168.88.68:6379 192.168.88.68 6379 @ mymaster 192.168.88.67 6379
    1651:X 03 Jun 2023 21:50:24.452 # +promoted-slave slave 192.168.88.68:6379 192.168.88.68 6379 @ mymaster 192.168.88.67 6379
    1651:X 03 Jun 2023 21:50:24.452 # +failover-state-reconf-slaves master mymaster 192.168.88.67 6379
    1651:X 03 Jun 2023 21:50:24.502 # +failover-end master mymaster 192.168.88.67 6379
    1651:X 03 Jun 2023 21:50:24.502 # +switch-master mymaster 192.168.88.67 6379 192.168.88.68 6379
    1651:X 03 Jun 2023 21:50:24.502 * +slave slave 192.168.88.67:6379 192.168.88.67 6379 @ mymaster 192.168.88.68 6379
    1651:X 03 Jun 2023 21:50:54.586 # +sdown slave 192.168.88.67:6379 192.168.88.67 6379 @ mymaster 192.168.88.68 6379

 宕机的master 主机恢复后自动配置为当前主的从服务器。

    [root@host67 ~]# systemctl  start redis  启动服务
    [root@host67 ~]# redis-cli  -h 192.168.88.67 -p 6379 连接服务
    192.168.88.67:6379> info replication    查看角色
    # Replication
    role:slave  从服务器
    master_host:192.168.88.68  主服务器ip
    master_port:6379 主服务器端口
    master_link_status:up  连通状态
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_repl_offset:54542
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:e4d9399cdf19c724b032859e77316019735d391e
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:54542
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:54379
    repl_backlog_histlen:164
    192.168.88.67:6379>

4 案例4:使用RDB文件恢复数据

4.1 问题

  1. 设置存盘间隔为120秒且10个key改变数据自动存盘
  2. 使用RDB文件恢复数据

4.2 方案

创建1台虚拟机,运行redis服务完成持久化练习,具体配置如表-3所示。

4.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:设置存盘间隔为120秒且10个key改变数据自动存盘

查看 redis服务存储数据到硬盘的存盘频率

    [root@redis70 ~]# vim /etc/redis.conf      
    save  秒   变量个数
    save 900   1
    save 300   10
    save 60    10000

 验证配置文件里定义的存储频率

    [root@redis70 ~]#systemctl stop redis      
    [root@redis70 ~]# rm -rf /var/lib/redis/*    
      
    [root@redis70 ~]# vim  +219 /etc/redis.conf      
    save 900 1
    #save 300 10
    save 120 10     # 2分钟内且有>=10个变量改变 就把内存里的数据复制到dump.rdb文件里
    save 60 10000
    :wq
      
    [root@redis70 ~]# systemctl start redis
    Starting Redis server...
     [root@redis70 ~]# ls /var/lib/redis/dump.rdb
    ls: 无法访问/var/lib/redis/6379/dump.rdb: 没有那个文件或目录
    [root@redis70 ~]# 

在服务启动后,要在2分钟内存储大于等10个变量

    [root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379    
    192.168.88.70:6379> mset a 1  b 2  c 3  d 4 
    OK
    192.168.88.70:6379> mset   x 1 y 2  z 3 k 6  i 7  z 9   f 22  zz 99  cc  66
    192.168.88.70:6379> exit
    [root@redis70 ~]# ls /var/lib/redis/
    dump.rdb
    [root@redis70 ~]# ls /var/lib/redis/ -l   显示文件创建的时间
    总用量 4
    -rw-r--r-- 1 root root 159 10月 26 16:30 dump.rdb
    [root@redis70 ~]#

 步骤二:使用RDB文件恢复数据

    第1步:拷贝 dump.rdb 文件就是对数据的备份
    [root@redis70 ~]# cp /var/lib/redis/dump.rdb  /opt/
    [root@redis70 ~]# ls /opt/*.rdb
    /opt/dump.rdb
    [root@redis70 ~]# 
                   第2步:把备份的 dump.rdb 文件 再次拷贝回数据库目录就是恢复
                          #误删除数据
    192.168.88.70:6379> FLUSHALL 
    OK
    192.168.88.70:6379> keys *
    (empty list or set)
    192.168.88.70:6379> 

使用备份的dump.rdb文件恢复

第1步 停止内存没有数据的redis服务

第2步 把没有数据的dump.rdb文件删除

第3步 把备份dump.rdb文件拷贝到数据库目录下

第4步 启动redis服务 并连接服务查看数据

    [root@redis70 ~]# systemctl stop redis
    [root@redis70 ~]# rm -rf /var/lib/redis/dump.rdb 
    [root@redis70 ~]# cp /opt/dump.rdb  /var/lib/redis/
    [root@redis70 ~]# systemctl start redis
    Starting Redis server...
    [root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379
    192.168.88.70:6379> keys *
     1) "i"
     2) "d"
     3) "x"
      ……
    ……

5 案例5:AOF

5.1 问题

  1. 启用AOF
  2. 使用AOF文件恢复数据

5.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:启用AOF

命令操作如下所示:

    [root@redis70 ~]# redis-cli  -h 192.168.88.70 -p 6379
    192.168.88.70:6379> config set  appendonly yes    启用aof文件
    OK
    192.168.88.70:6379> config get  appendonly  查看是否启用
    1) "appendonly"
    2) "yes"
    192.168.88.70:6379>
    192.168.88.70:6379> config rewrite  保存配置
    OK
    192.168.88.70:6379> exit 断开连接
    数据库目录多了.aof文件
    [root@redis70 ~]# ls /var/lib/redis/    
    appendonly.aof dump.rdb
    [root@redis70 ~]#wc –l  /var/lib/redis/appendonly.aof  查看文件行数
    [root@redis70 ~]# redis-cli  -h 192.168.88.70 -p 6379
    192.168.88.70:6379> set x 1  存储变量x
    OK
    192.168.88.70:6379> set y 2  存储变量y
    OK
    192.168.88.70:6379> set z 3  存储变量z
    OK
    192.168.88.70:6379>keys * 查看变量
    1) "x"
    2) "z"
    3) "y"
    192.168.88.70:6379> exit 断开连接
    [root@redis70 ~]#wc –l  /var/lib/redis/ appendonly.aof  查看文件行数

步骤二:使用AOF文件恢复数据

1)备份aof文件

    [root@redis70 ~]# cp /var/lib/redis/appendonly.aof  /opt/
    [root@redis70 ~]# ls /opt/*.aof
    /opt/appendonly.aof
    [root@redis70 ~]#

2)使用备份的aof文件恢复数据

                           #删除数据
    [root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379
    192.168.88.70:6379> flushall 
    192.168.88.70:6379> exit

3)恢复数据 

    第1步: 把没有数据的服务停止
     [root@redis70 ~]# systemctl stop redis
    第2步: 删除没有数据的aof文件和rdb文件
     [root@redis70 ~]# rm -rf  /var/lib/redis/*
    第3步:把备份的aof文件拷贝到数据库目录
     [root@redis70 ~]# cp /opt/appendonly.aof  /var/lib/redis/
                         
    第4步:启动redis服务并查看数据
     [root@redis70 ~]# systemctl start redis
     [root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379  
    192.168.88.70:6379> keys *
    1) "v4"
    2) "v3"
    。。。。。。
    。。。。。。

6 案例6:字符类型

6.1 问题

练习命令的使用,具体命令如下:

  • set getrange strlen append
  • decr decrby incr incrby incrbyfloat

6.2 方案

在redis70主机做字符类型命令的练习。

6.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:命令操作如下所示:

存储变量时 设置变量的有效期 px(毫秒) ex (秒)

    192.168.88.70:6379> set name plj ex 10   //变量10秒过期
    OK
    192.168.88.70:6379>
    192.168.88.70:6379> type name  //查看类型
    string
    192.168.88.70:6379>
    192.168.88.70:6379> set class  nsd  px 10   //变量10毫秒过期
    OK
    192.168.88.70:6379>
    NX 不覆盖赋值
    192.168.88.70:6379> set name plj NX
    OK
    192.168.88.70:6379> get name
    "plj"
    XX 覆盖赋值
    192.168.88.70:6379> set name yaya XX
    OK
    192.168.88.70:6379> get name
    "yaya"
    192.168.88.70:6379>

 set 命令完整格式演示

     192.168.88.70:6379> set gender girl  ex 20  NX
    OK
    192.168.88.70:6379>

- 递增数字:字符串类型可以存储任何形式的字符串,当存储的字符串是整数形式时,

Redis 提供了一个实用的命令 INCR,其作用是让当前键值递增,并返回递增后的值。

# 当要操作的键不存在时会默认键值为0,所以第一次递增后的结果是1。

    192.168.88.70:6379> set  num 1  //创建变量
    192.168.88.70:6379> INCR num    //+1
    (integer) 2
    192.168.88.70:6379> INCR num    //+1
    (integer) 3
    192.168.88.70:6379> GET num     
    "3"

 - 增加指定的整数

    192.168.88.70:6379> INCRBY num 2   //+2
    (integer) 5
    192.168.88.70:6379> INCRBY num 3   //+3
    (integer) 8
    - 递减数字
    192.168.88.70:6379> DECR num     //-1
    (integer) 7
    192.168.88.70:6379> DECRBY num 3   //
    (integer) 4

 - 向尾部追加值

    192.168.88.70:6379> SET hi Hello   //创建变量hi
    OK
    192.168.88.70:6379> APPEND hi " World"   # 因为字符串包含空格,需要使用引号
    (integer) 11        # 返回值为hi的总长度
    192.168.88.70:6379> GET hi
    "Hello World"

 - 获取字符串长度

    192.168.88.70:6379> STRLEN hi
    (integer) 11
    - 中文字符返回字节数
    192.168.88.70:6379> SET name 张三
    OK
    192.168.88.70:6379> STRLEN name
    (integer) 6   # UTF-8编码的中文,由于“张”和“三”两个字的UTF-8编码的长度都是3,所以此例中会返回6。

 获取变量部分数据

    192.168.88.70:6379> set zfc  ABCEF   //创建变量
    OK
    192.168.88.70:6379> GET zfc  //输出变量值
    "ABCEF"
    192.168.88.70:6379> GETRANGE zfc 0 1  //输出第1个到第2个字符
    "AB"
    192.168.88.70:6379> GETRANGE zfc 2 4  //输出第3个到第5个字符
    "CEF"
    192.168.88.70:6379> GETRANGE zfc -2 -1 //输出倒数第2个到第1个字符
    "EF"
    192.168.88.70:6379>

7 案例7:列表类型

7.1 问题

练习命令使用,具体如下:

  • lpush llen lrange lpop
  • lindex lset rpush rpop linsert

7.2 方案

在redis70主机做练习。

7.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:命令操作如下所示:

LPUSH命令用来向列表左边增加元素,返回值表示增加元素后列表的长度

    //创建变量
    192.168.88.70:6379> lpush  letter A B C 
    (integer) 3
    192.168.88.70:6379> type letter  查看类型
    list
    192.168.88.70:6379>
    //头部追加元素
    192.168.88.70:6379> lpush letter d e
    (integer) 5

 取出列表所有元素

    # 起始下标为0,结束下标为-1
    192.168.88.70:6379> lrange letter 0 -1
    1) "e"
    2) "d"
    3) "C"
    4) "B"
    5) "A"

 统计元素个数

    192.168.88.70:6379> llen letter
    (integer) 5

通过下标输出单个元素 第1个元素下标用0表示 第2个元素下标用1表示

最后一个元素下标用-1表示

    192.168.88.70:6379> lindex letter 0
    "e"
    192.168.88.70:6379> lindex letter 2
    "C"
    192.168.88.70:6379>
    192.168.88.70:6379> lindex letter -1 //最后1个
    "A"
    192.168.88.70:6379> lindex letter -2 //倒数第2个
    "B"
    192.168.88.70:6379>

 lset修改元素

    192.168.88.70:6379> lrange letter 0 -1  修改前查看
    1) "e"
    2) "d"
    3) "C"
    4) "B"
    5) "A"
    192.168.88.70:6379> lset letter 0 E  修改第1元素
    OK
    192.168.88.70:6379> lset letter -1 a 修改最后1个元素
    OK
    192.168.88.70:6379> lrange letter 0 -1 修改后查看
    1) "E"
    2) "d"
    3) "C"
    4) "B"
    5) "a"
    192.168.88.70:6379>

 弹出元素(删除元素)

    192.168.88.70:6379> lrange letter 0 -1  修改前查看
    1) "E"
    2) "d"
    3) "C"
    4) "B"
    5) "a"
    192.168.88.70:6379> lpop letter  弹出头部元素
    "E"
    192.168.88.70:6379> rpop letter  弹出尾部元素
    "a"
    192.168.88.70:6379> lrange letter 0 -1  修改后查看
    1) "d"
    2) "C"
    3) "B"
    192.168.88.70:6379>

 尾部追加元素

    192.168.88.70:6379> rpush letter e f 尾部追加元素
    (integer) 5
    192.168.88.70:6379> lrange letter 0 -1 追加后查看
    1) "d"
    2) "C"
    3) "B"
    4) "e"
    5) "f"
    192.168.88.70:6379> 

 插入元素

    192.168.88.70:6379> lrange letter 0 -1 插入前查看
    1) "d"
    2) "C"
    3) "B"
    4) "e"
    5) "f"
    192.168.88.70:6379> 
    192.168.88.70:6379> linsert letter before C C2   值C前插入C2
    (integer) 6
    192.168.88.70:6379> lrange letter 0 -1  插入后查看
    1) "d"
    2) "C2"
    3) "C"
    4) "B"
    5) "e"
    6) "f"
    192.168.88.70:6379>
    192.168.88.70:6379> linsert letter after C C3  值C后插入C3
    (integer) 7
    192.168.88.70:6379> lrange letter 0 -1 插入后查看
    1) "d"
    2) "C2"
    3) "C"
    4) "C3"
    5) "B"
    6) "e"
    7) "f"
    192.168.88.70:6379>

8 案例8:散列类型

8.1 问题

练习命令使用,具体如下:

  • hset hmset hgetall hkeys hvals
  • hget hmget hdel

8.2 方案

在redis70主机做练习。

8.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:命令操作如下所示:

赋值与取值

    192.168.88.70:6379> HSET user1 name bob  创建变量
    (integer) 1
    192.168.88.70:6379> type user1 查看类型
    hash
    192.168.88.70:6379>
    192.168.88.70:6379> HSET user1 gender man 赋新值
    (integer) 1
    192.168.88.70:6379> HGET user1 name  查看name列的值
    "bob"

 设置多个字段

    192.168.88.70:6379> HMSET user1 email [email protected] phone 13412345678
    OK
    192.168.88.70:6379> HMGET user1 email phone
    1) "[email protected]"
    2) "13412345678"

获取所有列名及对应的值

    192.168.88.70:6379> HGETALL user1
    1) "name"
    2) "bob"
    3) "gender"
    4) "male"
    5) "email"
    6) "[email protected]"
    7) "phone"
    8) "13412345678"

 删除列

    192.168.88.70:6379> HDEL user1 age
    (integer) 1

 只获取列名

    192.168.88.70:6379> HKEYS user1
    1) "name"
    2) "gender"
    3) "email"
    4) "phone"
    5) "address"

 只获取值

    192.168.88.70:6379> HVALS user1
    1) "bob"
    2) "male"
    3) "[email protected]"
    4) "13412345678"
    5) "beijing"

 获得列数量

    192.168.88.70:6379> HLEN user1
    (integer) 5

9 案例9:集合类型

9.1 问题

练习命令使用,具体如下:

  • 练习无序集合类型命令
  • 练习有序集合类型命令

9.2 方案

在redis70主机做练习。

9.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:练习无序集合类型命令

无序集合中的每个元素都是不同的,且没有顺序

创建/追加/删除/查看

    192.168.88.70:6379> sadd mylike film muisc game  创建
    (integer) 3
    192.168.88.70:6379> type mylike  查看数据类型
    set
    192.168.88.70:6379> sadd mylike sleep game it  追加,自动删除重复的值
    (integer) 2
    192.168.88.70:6379> srem mylike sleep game 删除成员
    (integer) 2
    192.168.88.70:6379> SMEMBERS mylike 查看成员
    1) "film"
    2) "it"
    3) "muisc"
    192.168.88.70:6379>

判断元素是否在集合中

    192.168.88.70:6379> SISMEMBER mylike game  输出0表示不存在
    (integer) 0
    192.168.88.70:6379> SISMEMBER mylike music 输出1表示存在
    (integer) 1
    192.168.88.70:6379> 

 输出成员个数

    192.168.88.70:6379> SCARD mylike
    (integer) 3
    192.168.88.70:6379>

 集合运算

    192.168.88.70:6379> SMEMBERS mylike
    1) "film"
    2) "it"
    3) "muisc"
    192.168.88.70:6379> sadd helike film music game  sleep
    (integer) 4
    192.168.88.70:6379>
    合集 重复的只显示一次
    192.168.88.70:6379> SUNION mylike helike
    1) "game"
    2) "it"
    3) "muisc"
    4) "film"
    5) "sleep"
    6) "music"
    192.168.88.70:6379>
    交集
    192.168.88.70:6379> SINTER mylike helike
    1) "film"
    192.168.88.70:6379>
    差集: 用第1列的变量和第2列的变量比
    192.168.88.70:6379> SDIFF mylike helike
    1) "it"
    2) "muisc"
    192.168.88.70:6379> SDIFF helike mylike
    1) "game"
    2) "sleep"
    3) "music"
    192.168.88.70:6379>

 随机获得集合中的元素

    # 在集合helike中随机取出两个不同元素。
    192.168.88.70:6379> SRANDMEMBER helike 2
    1) "sleep"
    2) "music"
    192.168.88.70:6379> SRANDMEMBER helike 2
    1) "game"
    2) "music"
    192.168.88.70:6379> 
    # 在集合helike中随机取出两个有可能相同元素。
    192.168.88.70:6379> SRANDMEMBER helike -2
    1) "film"
    2) "music"
    192.168.88.70:6379> SRANDMEMBER helike -2
    1) "music"
    2) "music"
    192.168.88.70:6379>

集合中随机弹出一个元素

    192.168.88.70:6379> spop helike 第1次弹出
    "music"
    192.168.88.70:6379> spop helike 第2次弹出
    "game"
    192.168.88.70:6379> SMEMBERS helike 查看
    1) "film"
    2) "sleep"
    192.168.88.70:6379>

步骤二:练习有序集合类型命令

ZADD命令的返回值是新加入到集合中的元素个数

    192.168.88.70:6379> ZADD scores 88 tom 90 jerry 75 bob 92 alice  创建变量
    (integer) 4
    192.168.88.70:6379> type scores 查看类型
    zset
    192.168.88.70:6379> ZCARD scores 统计成员个数
    (integer) 4
    192.168.88.70:6379> ZRANGE scores 0 -1  输出成员名称
    1) "bob"
    2) "tom"
    3) "jerry"
    4) "alice"
    192.168.88.70:6379> ZRANGE scores 0 -1 withscores  输出成员名称及对应的值
    1) "bob"
    2) "75"
    3) "tom"
    4) "88"
    5) "jerry"
    6) "90"
    7) "alice"
    8) "92"
    192.168.88.70:6379> 

获得某个成员的值

    192.168.88.70:6379> ZSCORE scores tom
    "88"

 - 获得指定分数范围的元素

    192.168.88.70:6379> ZRANGEBYSCORE scores 80 90 WITHSCORES
    1) "jerry"
    2) "85"
    3) "tom"
    4) "88"

 - 增加某个元素的分数

    192.168.88.70:6379> ZINCRBY scores 3 bob
    "78"
    192.168.88.70:6379> ZSCORE scores bob
    "78"

 - 获得指定分数范围内的元素个数

    192.168.88.70:6379> ZCOUNT scores 80 90
    (integer) 2

 - 删除元素

    192.168.88.70:6379> ZREM scores bob
    (integer) 1

- 获得元素的排名

    192.168.88.70:6379> ZRANK scores tom   # 获取tom的排名
    (integer) 1   # 升序排列,从0开始计数
    192.168.88.70:6379> ZREVRANK scores alice   # 获取alice的排名
    (integer) 0   # 降序排列,从0开始计数

 

你可能感兴趣的:(redis,数据库,缓存)