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

Top

NSD DBA DAY10

  1. 案例1:配置主从复制
  2. 案例2:配置带验证的主从复制
  3. 案例3:哨兵服务
  4. 案例4:使用RDB文件恢复数据
  5. 案例5:AOF
  6. 案例6:字符类型
  7. 案例7:列表类型
  8. 案例8:散列类型
  9. 案例9:集合类型

1 案例1:配置主从复制

1.1 问题

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

1.2 方案

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

1.3 步骤

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

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

1)配置host61为主服务器

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

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

  1. [root@host62 ~]# yum -y install redis 安装软件
  2. [root@host62 ~]# vim /etc/redis.conf 修改配置文件
  3. 69 bind 192.162.88.62 设置服务的ip地址
  4. 92 port 6379 设置服务的端口号 默认即可
  5. :wq
  6. [root@host62 ~]# systemctl start redis 启动服务
  7. [root@host62 ~]# redis-cli -h 192.162.88.62 -p 6379 连接服务
  8. 192.162.88.62.:6379> replicaof 192.162.88.61 6379 指定主服务器ip和端口
  9. OK
  10. 192.162.88.62.:6379> config rewrite 永久保存配置
  11. OK
  12. 192.162.88.62.:6379> exit 退出服务
  13. [root@host62 ~]# tail -1 /etc/redis.conf 查看文件末尾
  14. replicaof 192.162.88.61 6379
  15. [root@host62 ~]# redis-cli -h 192.162.88.62 -p 6379 连接服务
  16. 192.162.88.62.:6379> info replication 查看复制信息
  17. # Replication
  18. role:slave 角色
  19. master_host:192.162.88.61 主服务器ip地址
  20. master_port:6379 主服务器端口号
  21. master_link_status:up 与主服务器连接状态 (up 正常 down 连接失败)
  22. master_last_io_seconds_ago:8
  23. master_sync_in_progress:0
  24. slave_repl_offset:14
  25. slave_priority:100
  26. slave_read_only:1
  27. connected_slaves:0
  28. master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
  29. master_replid2:0000000000000000000000000000000000000000
  30. master_repl_offset:14
  31. second_repl_offset:-1
  32. repl_backlog_active:1
  33. repl_backlog_size:1048576
  34. repl_backlog_first_byte_offset:1
  35. repl_backlog_histlen:14
  36. 192.162.88.62.:6379>

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

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

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

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

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

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

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

  1. [root@host63 ~]# yum -y install redis 安装软件
  2. [root@host63 ~]# vim /etc/redis.conf 修改配置文件
  3. 69 bind 192.168.88.63
  4. 92 port 6379
  5. :wq
  6. [root@host63 ~]# systemctl start redis 启动服务
  7. [root@host63 ~]# redis-cli -h 192.168.88.63 -p 6379 连接服务
  8. 192.168.88.63:6379> replicaof 192.168.88.61 6379 指定主服务器ip和端口
  9. OK
  10. 192.168.88.63:6379> config rewrite 永久保存配置
  11. OK
  12. 192.168.88.63:6379> exit
  13. [root@host63 ~]# tail -1 /etc/redis.conf 保存到文件末尾
  14. replicaof 192.168.88.61 6379
  15. [root@host63 ~]# redis-cli -h 192.168.88.63 -p 6379 连接服务
  16. 192.168.88.63:6379> info replication 查看复制信息
  17. # Replication
  18. role:slave 角色
  19. master_host:192.168.88.61 主服务器IP
  20. master_port:6379 主服务器端口
  21. master_link_status:up 与主服务器连接状态 up 正常连接状态
  22. master_last_io_seconds_ago:9
  23. master_sync_in_progress:0
  24. slave_repl_offset:1171
  25. slave_priority:100
  26. slave_read_only:1
  27. connected_slaves:0
  28. master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
  29. master_replid2:0000000000000000000000000000000000000000
  30. master_repl_offset:1171
  31. second_repl_offset:-1
  32. repl_backlog_active:1
  33. repl_backlog_size:1048576
  34. repl_backlog_first_byte_offset:1158
  35. repl_backlog_histlen:14
  36. 192.168.88.63:6379> keys * 查看是否同步数据
  37. 1) "x"
  38. 2) "z"
  39. 3) "y"
  40. 192.168.88.63:6379>

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

  1. [root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379
  2. 192.168.88.61:6379> info replication
  3. # Replication
  4. role:master
  5. connected_slaves:2
  6. slave0:ip=192.168.88.62,port=6379,state=online,offset=3027,lag=0
  7. slave1:ip=192.168.88.63,port=6379,state=online,offset=3013,lag=1
  8. master_replid:209b3b7ce20c708ab1b6b95a5d1becb2454b0941
  9. master_replid2:0000000000000000000000000000000000000000
  10. master_repl_offset:3027
  11. second_repl_offset:-1
  12. repl_backlog_active:1
  13. repl_backlog_size:1048576
  14. repl_backlog_first_byte_offset:1
  15. repl_backlog_histlen:3027
  16. 192.168.88.61:6379>

步骤三:配置主从从结构

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

1)配置host63

  1. [root@host63 ~]# redis-cli -h 192.168.88.63 -p 6379
  2. 192.168.88.63:6379> replicaof no one 恢复为独立的数据库服务器
  3. OK
  4. 192.168.88.63:6379> replicaof 192.168.88.62 6379 指定主服务器为62
  5. OK
  6. 192.168.88.63:6379> config rewrite 保存配置
  7. OK
  8. 192.168.88.63:6379> exit 断开连接
  9. [root@host63 ~]# tail -1 /etc/redis.conf 查看是否保存
  10. replicaof 192.168.88.62 6379
  11. [root@host63 ~]# redis-cli -h 192.168.88.63 -p 6379 连接服务
  12. 192.168.88.63:6379> info replication 查看复制信息
  13. # Replication
  14. role:slave 角色
  15. master_host:192.168.88.62 主服务器IP
  16. master_port:6379 主服务端口
  17. master_link_status:up 与主服务器连接状态
  18. master_last_io_seconds_ago:0
  19. master_sync_in_progress:0
  20. slave_repl_offset:4545
  21. slave_priority:100
  22. slave_read_only:1
  23. connected_slaves:0
  24. master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
  25. master_replid2:0000000000000000000000000000000000000000
  26. master_repl_offset:4545
  27. second_repl_offset:-1
  28. repl_backlog_active:1
  29. repl_backlog_size:1048576
  30. repl_backlog_first_byte_offset:4420
  31. repl_backlog_histlen:126
  32. 192.168.88.63:6379>

2)在host62查看复制信息

  1. [root@host62 ~]# redis-cli -h 192.168.88.62 -p 6379
  2. 192.168.88.62.:6379> info replication 查看复制信息
  3. # Replication
  4. role:slave 本身是从服务器
  5. master_host:192.168.88.61 主服务器ip
  6. master_port:6379 主服务器redis服务端口
  7. master_link_status:up 与主服务器连接状态
  8. master_last_io_seconds_ago:4
  9. master_sync_in_progress:0
  10. slave_repl_offset:4769
  11. slave_priority:100
  12. slave_read_only:1
  13. connected_slaves:1 本身有一个从服务器
  14. slave0:ip=192.168.88.63,port=6379,state=online,offset=4769,lag=0 从服务器信息
  15. master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
  16. master_replid2:0000000000000000000000000000000000000000
  17. master_repl_offset:4769
  18. second_repl_offset:-1
  19. repl_backlog_active:1
  20. repl_backlog_size:1048576
  21. repl_backlog_first_byte_offset:1
  22. repl_backlog_histlen:4769
  23. 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

命令操作如下所示:

  1. [root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379
  2. 192.168.88.61:6379> config get requirepass 查看密码,默认服务没有密码
  3. 1) "requirepass"
  4. 2) ""
  5. 192.168.88.61:6379> config set requirepass 123456 设置密码
  6. OK
  7. 192.168.88.61:6379> auth 123456 输入密码
  8. OK
  9. 192.168.88.61:6379> config rewrite 保存配置
  10. OK
  11. 192.168.88.61:6379> exit 退出
  12. [root@host61 ~]# tail -1 /etc/redis.conf 保存到文件的末尾
  13. requirepass "123456"
  14. [root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379 连接服务
  15. 192.168.88.61:6379> auth 123456 输入密码
  16. OK
  17. 192.168.88.61:6379> info replication 查看复制信息
  18. # Replication
  19. role:master
  20. connected_slaves:0 没有从服务器了 因为从没有输入连接密码连接不上主服务器
  21. master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
  22. master_replid2:0000000000000000000000000000000000000000
  23. master_repl_offset:5763
  24. second_repl_offset:-1
  25. repl_backlog_active:1
  26. repl_backlog_size:1048576
  27. repl_backlog_first_byte_offset:1
  28. repl_backlog_histlen:5763
  29. 192.168.88.61:6379>

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

命令操作如下所示:

  1. [root@host62 ~]# redis-cli -h 192.168.88.62 -p 6379 连接服务
  2. 192.168.88.62.:6379> info replication 查看复制信息
  3. # Replication
  4. role:slave
  5. master_host:192.168.88.61
  6. master_port:6379
  7. master_link_status:down 没设置密码 与master主机是断开状态
  8. master_last_io_seconds_ago:-1
  9. master_sync_in_progress:0
  10. slave_repl_offset:1
  11. master_link_down_since_seconds:274
  12. slave_priority:100
  13. slave_read_only:1
  14. connected_slaves:0
  15. master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
  16. master_replid2:0000000000000000000000000000000000000000
  17. master_repl_offset:7803
  18. second_repl_offset:-1
  19. repl_backlog_active:0
  20. repl_backlog_size:1048576
  21. repl_backlog_first_byte_offset:1
  22. repl_backlog_histlen:7803
  23. 192.168.88.62:6379> config set masterauth 123456 指定主服务器密码
  24. OK
  25. 192.168.88.62:6379> config rewrite 保存配置
  26. OK
  27. 192.168.88.62:6379> info replication 查看复制信息
  28. # Replication
  29. role:slave
  30. master_host:192.168.88.61
  31. master_port:6379
  32. master_link_status:up 设置连接密码后 状态为up
  33. master_last_io_seconds_ago:10
  34. master_sync_in_progress:0
  35. slave_repl_offset:5847
  36. slave_priority:100
  37. slave_read_only:1
  38. connected_slaves:1
  39. slave0:ip=192.168.88.63,port=6379,state=online,offset=5847,lag=1
  40. master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
  41. master_replid2:0000000000000000000000000000000000000000
  42. master_repl_offset:5847
  43. second_repl_offset:-1
  44. repl_backlog_active:1
  45. repl_backlog_size:1048576
  46. repl_backlog_first_byte_offset:5764
  47. repl_backlog_histlen:84
  48. 192.168.88.62.:6379>

3 案例3:哨兵服务

3.1 问题

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

3.2 方案

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

说明:

 

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

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

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

3.3 步骤

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

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

命令操作如下所示:

1)配置host67为主服务器

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

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

命令操作如下所示:

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

  1. [root@host68 ~]# yum -y install redis 安装软件
  2. [root@host68 ~]# vim /etc/redis.conf 修改配置文件
  3. 69 bind 192.168.88.68 设置服务使用Ip地址
  4. 92 port 6379 设置服务监听端口 默认即可
  5. :wq
  6. [root@host68 ~]# systemctl start redis 启动服务
  7. [root@host68 ~]# redis-cli -h 192.168.88.68 -p 6379 连接服务
  8. 192.168.88.68:6379> replicaof 192.168.88.67 6379 指定主服务器ip和端口
  9. OK
  10. 192.168.88.68:6379> config rewrite 永久保存配置
  11. OK
  12. 192.168.88.68:6379> exit 断开
  13. [root@host68 ~]# tail -1 /etc/redis.conf 保存到文件末尾
  14. replicaof 192.168.88.67 6379
  15. [root@host68 ~]# redis-cli -h 192.168.88.68 -p 6379 连接服务
  16. 192.168.88.68:6379> info replication 查看复制信息
  17. # Replication
  18. role:slave 角色 从服务器
  19. master_host:192.168.88.67 主服务器Ip
  20. master_port:6379 主服务端口
  21. master_link_status:up 与主连接状态
  22. master_last_io_seconds_ago:8
  23. master_sync_in_progress:0
  24. slave_repl_offset:14
  25. slave_priority:100
  26. slave_read_only:1
  27. connected_slaves:0
  28. master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
  29. master_replid2:0000000000000000000000000000000000000000
  30. master_repl_offset:14
  31. second_repl_offset:-1
  32. repl_backlog_active:1
  33. repl_backlog_size:1048576
  34. repl_backlog_first_byte_offset:1
  35. repl_backlog_histlen:14
  36. 192.168.88.68:6379>

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

命令操作如下所示:

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

查看日志获取监视信息

  1. [root@host69 ~]# tail -f /var/log/redis/sentinel.log
  2. 1651:X 03 Jun 2023 21:42:49.523 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  3. 1651:X 03 Jun 2023 21:42:49.523 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1651, just started
  4. 1651:X 03 Jun 2023 21:42:49.523 # Configuration loaded
  5. 1651:X 03 Jun 2023 21:42:49.523 * supervised by systemd, will signal readiness
  6. 1651:X 03 Jun 2023 21:42:49.525 * Running mode=sentinel, port=26379.
  7. 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.
  8. 1651:X 03 Jun 2023 21:42:49.530 # Sentinel ID is f9475074a53444ee81765646c105e04e73ac9ec8
  9. 1651:X 03 Jun 2023 21:42:49.530 # +monitor master mymaster 192.168.88.67 6379 quorum 1
  10. 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 服务

  1. [root@host67 ~]# systemctl stop redis

原slave角色会升级为主

  1. [root@host68 ~]# redis-cli -h 192.168.88.68 -p 6379
  2. 192.168.88.68:6379> info replication
  3. # Replication
  4. role:master 角色
  5. connected_slaves:0 没从服务器
  6. master_replid:e4d9399cdf19c724b032859e77316019735d391e
  7. master_replid2:bd1b8d193de170bedd8b40780ee3fb45f9590a5b
  8. master_repl_offset:35343
  9. second_repl_offset:32642
  10. repl_backlog_active:1
  11. repl_backlog_size:1048576
  12. repl_backlog_first_byte_offset:183
  13. repl_backlog_histlen:35161
  14. 192.168.88.68:6379>

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

  1. [root@host69 ~]# tail -f /var/log/redis/sentinel.log 查看日志文件
  2. 1651:X 03 Jun 2023 21:50:23.603 # +failover-state-select-slave master mymaster 192.168.88.67 6379
  3. 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
  4. 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
  5. 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
  6. 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
  7. 1651:X 03 Jun 2023 21:50:24.452 # +failover-state-reconf-slaves master mymaster 192.168.88.67 6379
  8. 1651:X 03 Jun 2023 21:50:24.502 # +failover-end master mymaster 192.168.88.67 6379
  9. 1651:X 03 Jun 2023 21:50:24.502 # +switch-master mymaster 192.168.88.67 6379 192.168.88.68 6379
  10. 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
  11. 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 主机恢复后自动配置为当前主的从服务器。

  1. [root@host67 ~]# systemctl start redis 启动服务
  2. [root@host67 ~]# redis-cli -h 192.168.88.67 -p 6379 连接服务
  3. 192.168.88.67:6379> info replication    查看角色
  4. # Replication
  5. role:slave 从服务器
  6. master_host:192.168.88.68 主服务器ip
  7. master_port:6379 主服务器端口
  8. master_link_status:up 连通状态
  9. master_last_io_seconds_ago:1
  10. master_sync_in_progress:0
  11. slave_repl_offset:54542
  12. slave_priority:100
  13. slave_read_only:1
  14. connected_slaves:0
  15. master_replid:e4d9399cdf19c724b032859e77316019735d391e
  16. master_replid2:0000000000000000000000000000000000000000
  17. master_repl_offset:54542
  18. second_repl_offset:-1
  19. repl_backlog_active:1
  20. repl_backlog_size:1048576
  21. repl_backlog_first_byte_offset:54379
  22. repl_backlog_histlen:164
  23. 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服务存储数据到硬盘的存盘频率

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

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

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

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

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

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

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

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

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

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

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

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

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

5 案例5:AOF

5.1 问题

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

5.2 步骤

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

步骤一:启用AOF

命令操作如下所示:

 
  1. [root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379
  2. 192.168.88.70:6379> config set appendonly yes 启用aof文件
  3. OK
  4. 192.168.88.70:6379> config get appendonly 查看是否启用
  5. 1) "appendonly"
  6. 2) "yes"
  7. 192.168.88.70:6379>
  8. 192.168.88.70:6379> config rewrite 保存配置
  9. OK
  10. 192.168.88.70:6379> exit 断开连接
  11. 数据库目录多了.aof文件
  12. [root@redis70 ~]# ls /var/lib/redis/
  13. appendonly.aof dump.rdb
  14. [root@redis70 ~]#wc –l /var/lib/redis/appendonly.aof 查看文件行数
  15. [root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379
  16. 192.168.88.70:6379> set x 1 存储变量x
  17. OK
  18. 192.168.88.70:6379> set y 2 存储变量y
  19. OK
  20. 192.168.88.70:6379> set z 3 存储变量z
  21. OK
  22. 192.168.88.70:6379>keys * 查看变量
  23. 1) "x"
  24. 2) "z"
  25. 3) "y"
  26. 192.168.88.70:6379> exit 断开连接
  27. [root@redis70 ~]#wc –l /var/lib/redis/ appendonly.aof 查看文件行数

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

1)备份aof文件

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

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

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

3)恢复数据

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

6 案例6:字符类型

6.1 问题

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

  • set getrange strlen append
  • decr decrby incr incrby incrbyfloat

6.2 方案

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

6.3 步骤

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

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

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

 
  1. 192.168.88.70:6379> set name plj ex 10 //变量10秒过期
  2. OK
  3. 192.168.88.70:6379>
  4. 192.168.88.70:6379> type name //查看类型
  5. string
  6. 192.168.88.70:6379>
  7. 192.168.88.70:6379> set class nsd px 10 //变量10毫秒过期
  8. OK
  9. 192.168.88.70:6379>
  10. NX 不覆盖赋值
  11. 192.168.88.70:6379> set name plj NX
  12. OK
  13. 192.168.88.70:6379> get name
  14. "plj"
  15. XX 覆盖赋值
  16. 192.168.88.70:6379> set name yaya XX
  17. OK
  18. 192.168.88.70:6379> get name
  19. "yaya"
  20. 192.168.88.70:6379>

set 命令完整格式演示

 
  1. 192.168.88.70:6379> set gender girl ex 20 NX
  2. OK
  3. 192.168.88.70:6379>

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

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

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

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

- 增加指定的整数

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

- 向尾部追加值

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

- 获取字符串长度

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

获取变量部分数据

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

7 案例7:列表类型

7.1 问题

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

  • lpush llen lrange lpop
  • lindex lset rpush rpop linsert

7.2 方案

在redis70主机做练习。

7.3 步骤

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

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

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

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

取出列表所有元素

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

统计元素个数

 
  1. 192.168.88.70:6379> llen letter
  2. (integer) 5

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

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

 
  1. 192.168.88.70:6379> lindex letter 0
  2. "e"
  3. 192.168.88.70:6379> lindex letter 2
  4. "C"
  5. 192.168.88.70:6379>
  6. 192.168.88.70:6379> lindex letter -1 //最后1个
  7. "A"
  8. 192.168.88.70:6379> lindex letter -2 //倒数第2个
  9. "B"
  10. 192.168.88.70:6379>

lset修改元素

 
  1. 192.168.88.70:6379> lrange letter 0 -1 修改前查看
  2. 1) "e"
  3. 2) "d"
  4. 3) "C"
  5. 4) "B"
  6. 5) "A"
  7. 192.168.88.70:6379> lset letter 0 E 修改第1元素
  8. OK
  9. 192.168.88.70:6379> lset letter -1 a 修改最后1个元素
  10. OK
  11. 192.168.88.70:6379> lrange letter 0 -1 修改后查看
  12. 1) "E"
  13. 2) "d"
  14. 3) "C"
  15. 4) "B"
  16. 5) "a"
  17. 192.168.88.70:6379>

弹出元素(删除元素)

 
  1. 192.168.88.70:6379> lrange letter 0 -1 修改前查看
  2. 1) "E"
  3. 2) "d"
  4. 3) "C"
  5. 4) "B"
  6. 5) "a"
  7. 192.168.88.70:6379> lpop letter 弹出头部元素
  8. "E"
  9. 192.168.88.70:6379> rpop letter 弹出尾部元素
  10. "a"
  11. 192.168.88.70:6379> lrange letter 0 -1 修改后查看
  12. 1) "d"
  13. 2) "C"
  14. 3) "B"
  15. 192.168.88.70:6379>

尾部追加元素

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

插入元素

 
  1. 192.168.88.70:6379> lrange letter 0 -1 插入前查看
  2. 1) "d"
  3. 2) "C"
  4. 3) "B"
  5. 4) "e"
  6. 5) "f"
  7. 192.168.88.70:6379>
  8. 192.168.88.70:6379> linsert letter before C C2 值C前插入C2
  9. (integer) 6
  10. 192.168.88.70:6379> lrange letter 0 -1 插入后查看
  11. 1) "d"
  12. 2) "C2"
  13. 3) "C"
  14. 4) "B"
  15. 5) "e"
  16. 6) "f"
  17. 192.168.88.70:6379>
  18. 192.168.88.70:6379> linsert letter after C C3 值C后插入C3
  19. (integer) 7
  20. 192.168.88.70:6379> lrange letter 0 -1 插入后查看
  21. 1) "d"
  22. 2) "C2"
  23. 3) "C"
  24. 4) "C3"
  25. 5) "B"
  26. 6) "e"
  27. 7) "f"
  28. 192.168.88.70:6379>

8 案例8:散列类型

8.1 问题

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

  • hset hmset hgetall hkeys hvals
  • hget hmget hdel

8.2 方案

在redis70主机做练习。

8.3 步骤

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

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

赋值与取值

 
  1. 192.168.88.70:6379> HSET user1 name bob 创建变量
  2. (integer) 1
  3. 192.168.88.70:6379> type user1 查看类型
  4. hash
  5. 192.168.88.70:6379>
  6. 192.168.88.70:6379> HSET user1 gender man 赋新值
  7. (integer) 1
  8. 192.168.88.70:6379> HGET user1 name 查看name列的值
  9. "bob"

设置多个字段

 
  1. 192.168.88.70:6379> HMSET user1 email bob@tedu.cn phone 13412345678
  2. OK
  3. 192.168.88.70:6379> HMGET user1 email phone
  4. 1) "bob@tedu.cn"
  5. 2) "13412345678"

获取所有列名及对应的值

 
  1. 192.168.88.70:6379> HGETALL user1
  2. 1) "name"
  3. 2) "bob"
  4. 3) "gender"
  5. 4) "male"
  6. 5) "email"
  7. 6) "bob@tedu.cn"
  8. 7) "phone"
  9. 8) "13412345678"

删除列

 
  1. 192.168.88.70:6379> HDEL user1 age
  2. (integer) 1

只获取列名

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

只获取值

 
  1. 192.168.88.70:6379> HVALS user1
  2. 1) "bob"
  3. 2) "male"
  4. 3) "bob@tedu.cn"
  5. 4) "13412345678"
  6. 5) "beijing"

获得列数量

 
  1. 192.168.88.70:6379> HLEN user1
  2. (integer) 5

9 案例9:集合类型

9.1 问题

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

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

9.2 方案

在redis70主机做练习。

9.3 步骤

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

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

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

创建/追加/删除/查看

 
  1. 192.168.88.70:6379> sadd mylike film muisc game 创建
  2. (integer) 3
  3. 192.168.88.70:6379> type mylike 查看数据类型
  4. set
  5. 192.168.88.70:6379> sadd mylike sleep game it 追加,自动删除重复的值
  6. (integer) 2
  7. 192.168.88.70:6379> srem mylike sleep game 删除成员
  8. (integer) 2
  9. 192.168.88.70:6379> SMEMBERS mylike 查看成员
  10. 1) "film"
  11. 2) "it"
  12. 3) "muisc"
  13. 192.168.88.70:6379>

判断元素是否在集合中

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

输出成员个数

 
  1. 192.168.88.70:6379> SCARD mylike
  2. (integer) 3
  3. 192.168.88.70:6379>

集合运算

 
  1. 192.168.88.70:6379> SMEMBERS mylike
  2. 1) "film"
  3. 2) "it"
  4. 3) "muisc"
  5. 192.168.88.70:6379> sadd helike film music game sleep
  6. (integer) 4
  7. 192.168.88.70:6379>
  8. 合集 重复的只显示一次
  9. 192.168.88.70:6379> SUNION mylike helike
  10. 1) "game"
  11. 2) "it"
  12. 3) "muisc"
  13. 4) "film"
  14. 5) "sleep"
  15. 6) "music"
  16. 192.168.88.70:6379>
  17. 交集
  18. 192.168.88.70:6379> SINTER mylike helike
  19. 1) "film"
  20. 192.168.88.70:6379>
  21. 差集: 用第1列的变量和第2列的变量比
  22. 192.168.88.70:6379> SDIFF mylike helike
  23. 1) "it"
  24. 2) "muisc"
  25. 192.168.88.70:6379> SDIFF helike mylike
  26. 1) "game"
  27. 2) "sleep"
  28. 3) "music"
  29. 192.168.88.70:6379>

随机获得集合中的元素

 
  1. # 在集合helike中随机取出两个不同元素。
  2. 192.168.88.70:6379> SRANDMEMBER helike 2
  3. 1) "sleep"
  4. 2) "music"
  5. 192.168.88.70:6379> SRANDMEMBER helike 2
  6. 1) "game"
  7. 2) "music"
  8. 192.168.88.70:6379>
  9. # 在集合helike中随机取出两个有可能相同元素。
  10. 192.168.88.70:6379> SRANDMEMBER helike -2
  11. 1) "film"
  12. 2) "music"
  13. 192.168.88.70:6379> SRANDMEMBER helike -2
  14. 1) "music"
  15. 2) "music"
  16. 192.168.88.70:6379>

集合中随机弹出一个元素

 
  1. 192.168.88.70:6379> spop helike 第1次弹出
  2. "music"
  3. 192.168.88.70:6379> spop helike 第2次弹出
  4. "game"
  5. 192.168.88.70:6379> SMEMBERS helike 查看
  6. 1) "film"
  7. 2) "sleep"
  8. 192.168.88.70:6379>

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

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

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

获得某个成员的值

 
  1. 192.168.88.70:6379> ZSCORE scores tom
  2. "88"

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

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

- 增加某个元素的分数

 
  1. 192.168.88.70:6379> ZINCRBY scores 3 bob
  2. "78"
  3. 192.168.88.70:6379> ZSCORE scores bob
  4. "78"

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

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

- 删除元素

 
  1. 192.168.88.70:6379> ZREM scores bob
  2. (integer) 1

- 获得元素的排名

 
  1. 192.168.88.70:6379> ZRANK scores tom # 获取tom的排名
  2. (integer) 1 # 升序排列,从0开始计数
  3. 192.168.88.70:6379> ZREVRANK scores alice # 获取alice的排名
  4. (integer) 0 # 降序排列,从0开始计数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值