主从复制

主从复制概述

主从复制结构模式

主从复制工作原理
  • slave向master发送sync命令
  • master启动后台存盘进程,并收集所有数据命令
  • master完成后台存盘后,传送整个数据文件到slave
  • slave接收数据文件,加载到内存中完成首次完全同步
  • 后续有新数据产生时,master继续收集数据修改命令依次传给slave,完成同步

配置主从复制

拓扑结构

redis主从复制
  • redis服务运行后,默认都是master服务器
命令行配置(直接生效,重启失效)>info   replication           ##查看复制信息,默认所有的主机创建完成后即为master主机>slaveof  主服务器IP  端口号   ##指定主服务器>slaveof  no  one
永久配置(/etc/redis/6379.cnf)将51主机配置为主服务器,52为从服务器第一步,将虚拟机还原成独立的redis服务器的状态
[root@host51 ~]# ss  -nutlp |  grep redis-server     #首先查看主机是否处于集群中的状态
tcp    LISTEN     0      128    192.168.4.51:6351                  *:*                   users:(("redis-server",pid=1121,fd=6))[root@host51 ~]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> info replication   ##查看复制信息
# Replication
role:master            #角色
connected_slaves:0     #从服务器个数0台
master_replid:d5d3288a6a2101dc58a4c68004744316222bdfcb
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第二步,连接52主机,将52主机作为51主机的从服务器
[root@host52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> info replication    #先查看一下复制信息,此时52主机是主服务器
# Replication
role:master
connected_slaves:0
master_replid:f0f81003d86728f35ab94da3d416c285df8e5a3e
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.4.52:6352> set  aa 456      #可以先写一点数据
OK
192.168.4.52:6352> keys *
1) "aa"
192.168.4.52:6352> slaveof 192.168.4.51 6351    #指定主服务器,slaveof  主库的IP地址  端口号(临时配置)
OK
192.168.4.52:6352> info replication    #再次查看信息,此时,52主机的角色变为从
# Replication
role:slave      #角色,从服务器
master_host:192.168.4.51    #主库IP地址
master_port:6351            #主库端口号
master_link_status:up       #与主库连接状态开启
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:cae73fe71d7dd25494e540cc9d90776efbf321f5
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:14192.168.4.52:6352> keys *      #原本52主机的数据也会被51主机的数据覆盖
(empty list or set)
192.168.4.51:6351> mset a ddd  b sss    #此时我们可以回到51主机上写一点数据,在52主机上面查看,数据自动同步
OK
192.168.4.52:6352> keys *   #在52主机上可以看得到51主机上刚写入的数据,说明主从结构成功
1) "b"
2) "a"192.168.4.51:6351> info replication   #再次在51主机上查看状态信息,发现有一个从,IP地址为192.168.4.52,端口号为6352
# Replication
role:master      #角色,主服务器
connected_slaves:1   #从服务器个数,1台
slave0:ip=192.168.4.52,port=6352,state=online,offset=181,lag=1     #从服务器信息
master_replid:cae73fe71d7dd25494e540cc9d90776efbf321f5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:195
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:195
192.168.4.52:6352> slaveof no one       #在52主机上将从库还原成主库
OK
192.168.4.52:6352> info replication
# Replication
role:master
connected_slaves:0
master_replid:7dd2f582d1ae36b2d88a6cd859cc8dc70f5afb9b
master_replid2:cae73fe71d7dd25494e540cc9d90776efbf321f5
master_repl_offset:265
second_repl_offset:266
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:265192.168.4.51:6351> set  hhh  kkkk   #再次向51主机写入数据,在52主机上查看
OK
192.168.4.51:6351> set bbb  ddd
OK
192.168.4.51:6351> keys *
1) "bbb"
2) "hhh"
3) "b"
4) "a"
192.168.4.52:6352> keys *     #此时52主机没有同步新的数据
1) "b"
2) "a"192.168.4.52:6352> slaveof  192.168.4.51  6351   #再次将52主机配置为51主机的从
OK
192.168.4.52:6352> keys *
1) "bbb"
2) "hhh"
3) "b"
4) "a"[root@host52 ~]# redis-cli -h 192.168.4.52 -p 6352  shutdown    #将从库重启
[root@host52 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> info replication     #查看复制信息,52主机已经不再是51主机的从库
# Replication
role:master
connected_slaves:0
master_replid:f4cc998d850e680fbbb4bdc4e1a9ff3d04bafbba
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.4.52:6352> keys *        #但主机中还有刚刚同步过的数据,重启时会自动将内存里的数据保存到硬盘
1) "b"
2) "hhh"
3) "a"
4) "bbb"*********************************
永久配置:
[root@host52 ~]# redis-cli -h 192.168.4.52 -p 6352  shutdown
[root@host52 ~]# vim /etc/redis/6379.conf    #配置52主机永久为51主机的从服务器282 slaveof 192.168.4.51 6351
[root@host52 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> info replication      #查看主从复制信息
# Replication
role:slave                       #角色,从服务器
master_host:192.168.4.51         #主库IP地址
master_port:6351                 #主库端口
master_link_status:up            #与主库连接状态开启
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:1658
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:cae73fe71d7dd25494e540cc9d90776efbf321f5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1658
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1645
repl_backlog_histlen:14ps:主库执行flushall,从库也会自动清空所有数据
192.168.4.52:6352> keys *
1) "a"
2) "hhh"
3) "b"
4) "bbb"
192.168.4.51:6351> flushall
OK
192.168.4.51:6351> keys *
(empty list or set)
192.168.4.52:6352> keys *
(empty list or set)
添加一台新的从库服务器
[root@host53 ~]# redis-cli  -h 192.168.4.53  -p 6353  shutdown
[root@host53 ~]# vim +282 /etc/redis/6379.conf 282 slaveof 192.168.4.51  6351
[root@host53 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host53 ~]# redis-cli  -h 192.168.4.53  -p 6353
192.168.4.53:6353> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:2119
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:cae73fe71d7dd25494e540cc9d90776efbf321f5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2119
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2106
repl_backlog_histlen:14192.168.4.51:6351> info replication    #在51主机上查看,有两个从服务器
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.4.52,port=6352,state=online,offset=2231,lag=0
slave1:ip=192.168.4.53,port=6353,state=online,offset=2231,lag=0
master_replid:cae73fe71d7dd25494e540cc9d90776efbf321f5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2245
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2245
配置带验证的主从复制
- 配置 master,设置连接密码,重启密码
[root@host51 ~]# redis-cli -h 192.168.4.51 -p 6351  shutdown
[root@host51 ~]# vim  +501  /etc/redis/6379.conf      #把51主机配置密码501 requirepass 123456
[root@host51 ~]# /etc/init.d/redis_6379 start    #启动服务
Starting Redis server...
[root@host51 ~]# redis-cli -h 192.168.4.51 -p 6351  -a 123456
192.168.4.51:6351> info replication    #此时查看主从复制信息,发现51主机没有从服务器,因为在设置的时候,从服务器不知道主服务需要密码
# Replication
role:master
connected_slaves:0
master_replid:f1e42fe68a0d21458128290c548e7fe87a44ea66
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- 配置slave,设置连接密码,重启服务
[root@host52 ~]# redis-cli -h 192.168.4.52 -p 6352  shutdown  #将52主机服务关闭[root@host52 ~]# vim  +289  /etc/redis/6379.conf    #修改配置文件,让52主机知道主服务器的验证密码289 masterauth 123456[root@host52 ~]# /etc/init.d/redis_6379 start     #再次重启
Starting Redis server...
[root@host52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> info replication      #查看主从复制信息,此时可以看到51主的信息了
# Replication
role:slave      #角色,从服务器
master_host:192.168.4.51    #主库IP地址
master_port:6351           #主库端口
master_link_status:up      #连接状态开启
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:8ea70d98c6e9e80b7e334544a4ef3ea2bb0b2ec6
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:1453主机也做同样的操作[root@host53 ~]# redis-cli  -h 192.168.4.53  -p 6353  shutdown     #关闭53主机的服务
[root@host53 ~]# vim  +289  /etc/redis/6379.conf     #设置密码289 masterauth 123456
[root@host53 ~]# /etc/init.d/redis_6379 start      #启动服务
Starting Redis server...
[root@host53 ~]# redis-cli  -h 192.168.4.53  -p 6353
192.168.4.53:6353> info replication   #查看复制信息
# Replication
role:slave                #角色,从服务器
master_host:192.168.4.51  #主库IP地址
master_port:6351          #主库端口号
master_link_status:up     #与主库连接状态开启
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:140
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:8ea70d98c6e9e80b7e334544a4ef3ea2bb0b2ec6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:127
repl_backlog_histlen:14此时再回到51主机查看主从信息,就会发现,两个从服务器的信息又回来了192.168.4.51:6351> info replication
# Replication
role:master     #角色,主服务器
connected_slaves:2     #从服务器,2台
slave0:ip=192.168.4.52,port=6352,state=online,offset=154,lag=0   #从服务器52信息
slave1:ip=192.168.4.53,port=6353,state=online,offset=154,lag=0    #从服务器53信息
master_replid:8ea70d98c6e9e80b7e334544a4ef3ea2bb0b2ec6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:154
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:154

哨兵服务

哨兵服务介绍
  • 节省运维成本
  • 监视master服务器
  • 发现master宕机后,将从服务器升级为主服务器
  • 主配置文件 sentinel.conf
  • 模板文件:redis-4.0.8/sentinel.conf
sentinel  monitor  主机名   ip地址  端口  票数
- 主机名:自定义
- IP地址:master主机的IP地址
- 端口:master主机redis服务使用的端口
- 票数:发现主机宕机的哨兵服务器台数
拓扑结构

配置哨兵服务
54主机:
[root@host54 ~]# redis-cli  -h 192.168.4.54  -p 6354
192.168.4.54:6354> info  replication          #查看当前主从信息,此时是一个独立的服务器,默认为主服务器
# Replication
role:master
connected_slaves:0
master_replid:109967e8e7e63cc0a7bb33c4dd92177496dced3f
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:055主机:[root@host55 ~]# redis-cli  -h 192.168.4.55  -p 6355  shutdown
[root@host55 ~]# vim  +282  /etc/redis/6379.conf       #修改配置文件,让55主机作为54主机的从服务器282 slaveof 192.168.4.54 6354
[root@host55 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host55 ~]# redis-cli  -h 192.168.4.55  -p 6355
192.168.4.55:6355> info replication            #在55主机查看主从信息状态,此时55主机是从的状态
# Replication
role:slave
master_host:192.168.4.54
master_port:6354
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:2f89b8c40607cad01757fce504a876f5fc27e488
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:14192.168.4.54:6354> info  replication                    #在54主机再次查看主从信息状态,发现54主机多了一个从服务器
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.4.55,port=6355,state=online,offset=336,lag=1
master_replid:2f89b8c40607cad01757fce504a876f5fc27e488
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:336
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:33656主机:
[root@host56 ~]# redis-cli -h 192.168.4.56 -p 6356 shutdown
[root@host56 ~]# vim  +282  /etc/redis/6379.conf      #修改配置文件,让56主机作为55主机的从服务器282 slaveof 192.168.4.55 6355
[root@host56 ~]# /etc/init.d/redis_6379  start
Starting Redis server...
[root@host56 ~]# redis-cli -h 192.168.4.56 -p 6356
192.168.4.56:6356> info replication                #查看主从信息,56主机为从服务器
# Replication
role:slave
master_host:192.168.4.55
master_port:6355
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:140
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:2f89b8c40607cad01757fce504a876f5fc27e488
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:127
repl_backlog_histlen:14192.168.4.55:6355> info replication                     #在55主机查看状态,发现55主机多了一个从服务器IP为192.168.4.56
# Replication
role:slave
master_host:192.168.4.54
master_port:6354
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:154
slave_priority:100
slave_read_only:1
connected_slaves:1
slave0:ip=192.168.4.56,port=6356,state=online,offset=154,lag=1
master_replid:2f89b8c40607cad01757fce504a876f5fc27e488
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:154
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:154测试:
在54主机上写入数据,则55 56主机都可以看到相应的数据54主机:
192.168.4.54:6354> set  tian 111222
OK
192.168.4.54:6354> set haha  555
OK
192.168.4.54:6354> keys  *
1) "haha"
2) "tian"55主机:
192.168.4.55:6355> keys *
1) "haha"
2) "tian"
192.168.4.55:6355> get tian
"111222"
192.168.4.55:6355> get haha
"555"56主机:
192.168.4.56:6356> keys  *
1) "tian"
2) "haha"
192.168.4.56:6356> get tian
"111222"
192.168.4.56:6356> get haha
"555"---------------------------------------------
配置哨兵服务器192.168.4.57- 安装哨兵服务
- 创建主配置文件
- 启动哨兵服务[root@host57 ~]# cd  /opt
[root@host57 opt]# ls
mha  redis-3.2.1.gem  redis-4.0.8  redis-4.0.8.tar.gz
[root@host57 opt]# rpm  -q  gcc
未安装软件包 gcc
[root@host57 opt]# yum  -y  install  gcc
[root@host57 opt]# tar  -zvxf  redis-4.0.8.tar.gz
[root@host57 opt]# cd  redis-4.0.8/
[root@host57 redis-4.0.8]# make  &&  make  install
[root@host57 redis-4.0.8]# ls
00-RELEASENOTES  COPYING  Makefile   redis.conf       runtest-sentinel  tests
BUGS             deps     MANIFESTO  runtest          sentinel.conf     utils
CONTRIBUTING     INSTALL  README.md  runtest-cluster  src创建哨兵服务的主配置文件并编辑[root@host57 redis-4.0.8]# vim  /etc/sentinel.conf      #创建主配置文件
bind 192.168.4.57    #哨兵服务地址,表示监听本机地址(0.0.0.0代表本机所有网络接口)
sentinel monitor host54 192.168.4.54    6354 1    #监视主服务器启动哨兵服务,会占用一个终端
[root@host57 redis-4.0.8]# redis-sentinel /etc/sentinel.conf     #启动哨兵服务
4711:X 29 Feb 19:23:51.779 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4711:X 29 Feb 19:23:51.779 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=4711, just started
4711:X 29 Feb 19:23:51.779 # Configuration loaded
4711:X 29 Feb 19:23:51.780 * Increased maximum number of open files to 10032 (it was originally set to 1024)._._                                                  _.-``__ ''-._                                             _.-``    `.  `_.  ''-._           Redis 4.0.8 (00000000/0) 64 bit.-`` .-```.  ```\/    _.,_ ''-._                                   (    '      ,       .-`  | `,    )     Running in sentinel mode|`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379|    `-._   `._    /     _.-'    |     PID: 4711`-._    `-._  `-./  _.-'    _.-'                                   |`-._`-._    `-.__.-'    _.-'_.-'|                                  |    `-._`-._        _.-'_.-'    |           http://redis.io        `-._    `-._`-.__.-'_.-'    _.-'                                   |`-._`-._    `-.__.-'    _.-'_.-'|                                  |    `-._`-._        _.-'_.-'    |                                  `-._    `-._`-.__.-'_.-'    _.-'                                   `-._    `-.__.-'    _.-'                                       `-._        _.-'                                           `-.__.-'                                               4711:X 29 Feb 19:23:51.785 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
4711:X 29 Feb 19:23:51.787 # Sentinel ID is 714d4a5b97456538f19d3d822bd020ebc046d7ea
4711:X 29 Feb 19:23:51.787 # +monitor master host54 192.168.4.54 6354 quorum 1
4711:X 29 Feb 19:23:51.793 * +slave slave 192.168.4.55:6355 192.168.4.55 6355 @ host54 192.168.4.54 6354
##提示54主机是master主服务器,55主机是slave从服务器-------------------------------------------------
测试哨兵服务的配置1.停止54主机的redis服务
192.168.4.54:6354> shutdown
not connected> exit2.在55主机查看复制信息
[root@host55 ~]# redis-cli  -h 192.168.4.55  -p 6355
192.168.4.55:6355> info replication
# Replication
role:master      #角色是master
connected_slaves:1
slave0:ip=192.168.4.56,port=6356,state=online,offset=19475,lag=1
master_replid:0172cc9b61ee406e8539bf6b6a23f1614a321099
master_replid2:2f89b8c40607cad01757fce504a876f5fc27e488
master_repl_offset:19475
second_repl_offset:18891
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:19475在管理主机查看哨兵服务的状态
[root@host57 ~]# cat /etc/sentinel.conf
bind 192.168.4.57
sentinel myid 714d4a5b97456538f19d3d822bd020ebc046d7ea
# Generated by CONFIG REWRITE
port 26379
dir "/opt/redis-4.0.8"
sentinel monitor host54 192.168.4.55 6355 1           #此时,监控的主机依旧是自定义主机名host54,但监视的主服务器已经变成了55主机
sentinel config-epoch host54 1
sentinel leader-epoch host54 1
sentinel known-slave host54 192.168.4.54 6354
sentinel known-slave host54 192.168.4.56 6356
sentinel current-epoch 1此时,如果再次将54主机服务开启,则54主机自动变为55主机的从服务器
[root@host54 ~]# /etc/init.d/redis_6379  start
Starting Redis server...
[root@host54 ~]# redis-cli  -h 192.168.4.54 -p 6354
192.168.4.54:6354> info replication
# Replication
role:slave
master_host:192.168.4.55
master_port:6355
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:51529
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:0172cc9b61ee406e8539bf6b6a23f1614a321099
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:51529
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:48985
repl_backlog_histlen:2545[root@host55 ~]# redis-cli  -h 192.168.4.55  -p 6355
192.168.4.55:6355> info  replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.4.56,port=6356,state=online,offset=57957,lag=1
slave1:ip=192.168.4.54,port=6354,state=online,offset=57957,lag=1
master_replid:0172cc9b61ee406e8539bf6b6a23f1614a321099
master_replid2:2f89b8c40607cad01757fce504a876f5fc27e488
master_repl_offset:57957
second_repl_offset:18891
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:57957模拟55主机宕机,查看是54主机还是56主机作为主
192.168.4.55:6355> shutdown     #将55主机服务关闭
not connected> exit
[root@host54 ~]# redis-cli  -h 192.168.4.54 -p 6354
192.168.4.54:6354> info replication      #54主机变成新的主服务器,56主机就自动变成54主机的从服务器,谁的数据最新,谁就成为新的主
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.4.56,port=6356,state=online,offset=94588,lag=0
master_replid:e24bbd33ce00c4194baeb5c26e773e4fb7b32a6b
master_replid2:0172cc9b61ee406e8539bf6b6a23f1614a321099
master_repl_offset:94588
second_repl_offset:94141
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:48985
repl_backlog_histlen:45604192.168.4.56:6356> info replication
# Replication
role:slave
master_host:192.168.4.54
master_port:6354
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:105073
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:e24bbd33ce00c4194baeb5c26e773e4fb7b32a6b
master_replid2:0172cc9b61ee406e8539bf6b6a23f1614a321099
master_repl_offset:105073
second_repl_offset:94141
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:127
repl_backlog_histlen:104947[root@host57 ~]# cat /etc/sentinel.conf
bind 192.168.4.57
sentinel myid 714d4a5b97456538f19d3d822bd020ebc046d7ea
# Generated by CONFIG REWRITE
port 26379
dir "/opt/redis-4.0.8"
sentinel monitor host54 192.168.4.54 6354 1     #查看监控情况,此时又重新监控54主机
sentinel config-epoch host54 2
sentinel leader-epoch host54 2
sentinel known-slave host54 192.168.4.55 6355
sentinel known-slave host54 192.168.4.56 6356
sentinel current-epoch 2

持久化

RDB
  • RDB介绍
  • 数据库文件,全称Redis DataBase
  • 数据持久化方式之一
  • 数据持久化默认方式
  • 按照指定时间间隔,将内存中的数据集快照写入硬盘
  • 定义RDB文件名
  • dbfilename “dump.rdb” #文件名
使用RDB文件恢复数据
  • 备份数据
  • 备份dump.rdb文件到其他位置
  • [root@localhost ~]# cp 数据库目录/dump.rdb 备份目录
  • 恢复数据
  • 拷贝备份文件到数据库目录,启动redis服务
 [root@localhost ~]# cp  备份目录/dump.rdb   数据库目录
  • RDB的优点与缺点
  • RDB的优点
  • 高性能的持久化实现——创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程结束后,再用这个临时文件替换上次持久化好的文件;过程中主进程不作任何IO操作
  • 比较适合大规模数据恢复,且对数据完整性要求不是非常高的场合
  • RDB的缺点
  • 意外宕机时,丢失最后一次持久化的所有数据
  • 优化设置
  • 数据从内存保存到硬盘的频率
- save    900     1          #15分钟且有一个key改变即存盘
- save    300     10         #5分钟且有10个key改变即存盘
- save     60     10000      #1分钟且有10000个key改变即存盘
  • 手动存盘
- save                        #阻塞写存盘
- bgsave                      #不阻塞写存盘
使用RDB文件恢复数据
  • 要求:
  1. 启用RDB
  2. 设置存盘间隔为120秒且10个key改变数据自动存盘
  3. 备份RDB文件
  4. 删除数据
  5. 使用RDB文件恢复数据
使用51主机备份数据,用52主机恢复数据
[root@host51 ~]# redis-cli  -h 192.168.4.51 -p 6351
192.168.4.51:6351> set a nnn      #在51主机写入数据
OK
192.168.4.51:6351> set b aaa
OK
192.168.4.51:6351> set c kkk
OK
192.168.4.51:6351> keys *         #查看所有的变量
1) "c"
2) "a"
3) "b"
192.168.4.51:6351> save     #确保内存里的数据存到硬盘
OK[root@host51 ~]# ls  /var/lib/redis/6379/
dump.rdb
[root@host51 ~]# cp  /var/lib/redis/6379/dump.rdb   /root/     #将rdb文件做备份
[root@host51 ~]# ls
dump.rdb用52主机进行恢复[root@host52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> keys  *               #在进行查看一下52主机当前的数据
(empty list or set)
[root@host52 ~]# redis-cli  -h 192.168.4.52 -p 6352  shutdown
[root@host52 ~]# cd /var/lib/redis/6379/
[root@host52 6379]# rm  -rf  dump.rdb     #删除52主机原有的rdb文件
[root@host51 ~]# scp /root/dump.rdb   root@192.168.4.52:/var/lib/redis/6379/    #把51主机的rdb文件传给52主机
[root@host52 6379]# ls
dump.rdb
[root@host52 6379]# ll
总用量 4
-rw-r--r--. 1 root root 118 2月  29 22:24 dump.rdb
[root@host52 6379]# /etc/init.d/redis_6379 start    #重启服务
Starting Redis server...
[root@host52 6379]# redis-cli  -h 192.168.4.52 -p 6352
192.168.4.52:6352> keys *            #再次查看数据,与51主机的数据相同
1) "a"
2) "b"
3) "c"设置存盘间隔时间为120秒10个key改变数据自动存盘
[root@host51 ~]# redis-cli  -h 192.168.4.51 -p 6351 shutdown
[root@host51 ~]# rm  -rf /var/lib/redis/6379/*
[root@host51 ~]# ls /var/lib/redis/6379/
[root@host51 ~]# vim /etc/redis/6379.conf219 save 900 1220 save 120 10    #120秒内存入10个变量就存入硬盘221 save 60 10000[root@host51 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host51 ~]# redis-cli  -h 192.168.4.51 -p 6351
192.168.4.51:6351> keys *
(empty list or set)
192.168.4.51:6351> set a 1
OK
192.168.4.51:6351> set z 1
OK
192.168.4.51:6351> set x 1
OK
192.168.4.51:6351> set c 1
OK
192.168.4.51:6351> set v 1
OK
192.168.4.51:6351> set b 1
OK
192.168.4.51:6351> set n 1
OK
192.168.4.51:6351> set d 1
OK
192.168.4.51:6351> set s 1
OK
192.168.4.51:6351> set f 1
OK
[root@host51 ~]# cd /var/lib/redis/6379/
[root@host51 6379]# ls
dump.rdb
[root@host51 6379]# ll
总用量 4
-rw-r--r--. 1 root root 147 2月  29 22:13 dump.rdb在52主机恢复数据
[root@host52 ~]# cd /var/lib/redis/6379/
[root@host52 6379]# redis-cli  -h 192.168.4.52 -p 6352  shutdown
[root@host52 6379]# rm  -rf  /var/lib/redis/6379/*
[root@host52 6379]# ls  /var/lib/redis/6379/
[root@host52 6379]# ls  /var/lib/redis/6379/
dump.rdb
[root@host52 6379]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host52 6379]# redis-cli  -h 192.168.4.52 -p 6352
192.168.4.52:6352> keys  *1) "d"2) "c"3) "z"4) "x"5) "a"6) "v"7) "n"8) "s"9) "f"
10) "b"(ps:恢复数据失败的原因:
1.51主机的dump.rbd没有数据,51主机keys *查看没有任何数据,如果此时将没有任何数据的dump.rdb传给任何主机,恢复数据也会没有任何数据,停服务时会将当前内存的数据写入硬盘,关服务会存盘 即使以前有数据也会被覆盖为空
2.52主机恢复数据之前没有停掉服务,先拷贝了文件后停了服务
3.没到存盘时间就直接拷贝数据
)
AOF
  • AOF介绍
  • Append Only File
  • 追加方式记录写操作的文件
  • 记录redis服务所有写操作
  • 不断的将新的写操作,追加到文件的末尾
  • 默认没有启动
  • 使用cat命令可以查看文件内容
  • AOF的优点与缺点
  • AOF的优点
  • 可以灵活设置持久化方式
  • 出现意外宕机时,仅可能丢失一秒的数据
  • AOF的缺点
  • 持久化文件的体积通常会大于RDB方式
  • 执行fsync策略时的速度可能会比RDB方式慢
  • 启用AOF
> config   set   appendonly  yes    #启用
> config   rewrite    #写进配置文件
  • 备份数据
  • 备份appendonly.aof文件到其他位置
[root@localhost ~]# cp    数据库目录/appendonly.aof    备份目录
  • 恢复数据
  • 拷贝备份文件到数据库目录
  • 启动redis服务
[root@localhost ~]#  cp  备份目录/appendonly.aof     数据库目录
[root@localhost ~]# /etc/redis/redis_端口   start
  • 优化配置
  • 定义文件名
appendonly   yes     #启用aof,默认no
appendfilename     "appendonly.aof"    #指定文件名
  • AOF文件记录写操作的方式
appendfsync   always     #实时记录,并完成磁盘同步
appendfsync    everysec    #每秒记录一次,并完成磁盘同步
appendfsync    no         #写入aof,不执行磁盘同步
  • 日志文件会不断增大,何时出发日志重写?
- auto-aof-rewrite-min-size    64mb      #首次重写触发值
- auto-aof-rewrite-percentage   100     #再次重写,增长百分比
  • 修复AOF文件
  • 把文件恢复到最后一次的正确操作
[root@localhost ~]# redis-check-aof --fix  appendonly.aof   #修复aof文件
0x             20d: Expected prefix '*', got: 'k'
AOF analyzed: size=543, ok_up_to=525, diff=18
This will shrink the AOF from 543 bytes, with 18 bytes, to 525 bytes
Continue? [y/N]: y
Successfully truncated AOF   #修复成功
使用AOF文件恢复数据
  • 要求:
  1. 启用AOF
  2. 备份AOF文件
  3. 删除数据
  4. 使用AOF文件恢复数据
启用AOF:192.168.4.51:6351> keys  *     #看查看当前变量1) "s"2) "n"3) "d"4) "z"5) "a"6) "x"7) "b"8) "c"9) "v"
10) "f"
192.168.4.51:6351> save      #将数据存到硬盘
OK
192.168.4.51:6351> exit
[root@host51 ~]# cd /var/lib/redis/6379/
[root@host51 6379]# ls                 #查看数据库目录下的文件
dump.rdb
[root@host51 6379]# redis-cli  -h 192.168.4.51 -p 6351
192.168.4.51:6351> config set appendonly  yes      #启用AOF
OK
192.168.4.51:6351> config rewrite     #写进配置文件
OK
192.168.4.51:6351> exit
[root@host51 6379]# ls           #再次查看数据库目录
appendonly.aof  dump.rdb
[root@host51 6379]# wc  -l  appendonly.aof    #查看aof文件的行数,记录的是写操作的记录
75 appendonly.aof
[root@host51 6379]# cat  appendonly.aof     #查看文件内容备份AOF文件
51主机:
192.168.4.51:6351> keys  *1) "s"2) "n"3) "d"4) "z"5) "a"6) "x"7) "b"8) "c"9) "v"
10) "f"
192.168.4.51:6351> set  k 333    #新存入数据
OK
192.168.4.51:6351> set  k1 333
OK
192.168.4.51:6351> set  k2 333
OK
192.168.4.51:6351> set  k3 333
OK
192.168.4.51:6351> set  k4 333
OK
192.168.4.51:6351> set  k5 333
OK
192.168.4.51:6351> set  k6 333
OK
192.168.4.51:6351> keys  *1) "s"2) "n"3) "a"4) "k6"5) "k"6) "c"7) "v"8) "d"9) "k3"
10) "k1"
11) "z"
12) "x"
13) "k2"
14) "b"
15) "k4"
16) "k5"
17) "f"
[root@host51 ~]# cd  /var/lib/redis/6379/
[root@host51 6379]# ls
appendonly.aof  dump.rdb
[root@host51 6379]# cp  appendonly.aof   /root
[root@host51 6379]# ls /root
appendonly.aof
[root@host51 6379]# scp  /root/appendonly.aof  root@192.168.4.52:/root52主机:[root@host52 ~]# redis-cli  -h 192.168.4.52 -p 6352  shutdown
[root@host52 ~]# cd /var/lib/redis/6379/
[root@host52 6379]# ls
dump.rdb
[root@host52 6379]# rm  -rf *    #为了让实验看的更加清晰,可以先删除rdb文件,清空数据库目录
[root@host52 6379]# ls
[root@host52 6379]# vim  /etc/redis/6379.conf 673 appendonly yes677 appendfilename "appendonly.aof"    AOF文件默认名称
[root@host52 6379]# cp  /root/appendonly.aof  ./
[root@host52 6379]# ls
appendonly.aof
[root@host52 6379]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host52 6379]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> keys  *1) "c"2) "k"3) "s"4) "b"5) "z"6) "k2"7) "k1"8) "v"9) "x"
10) "f"
11) "k5"
12) "a"
13) "k6"
14) "d"
15) "n"
16) "k4"
17) "k3"
192.168.4.52:6352> save
OK[root@host52 6379]# ls
appendonly.aof(记录写操作)  dump.rdb(实现数据永久存储)使用aof文件恢复数据[root@host51 6379]# vim appendonly.aof    #手动在aof文件结尾添加几行
ks
1111
[root@host51 6379]# redis-cli  -h 192.168.4.51  -p 6351  shutdown    #重启
[root@host51 6379]# /etc/init.d/redis_6379  start
Starting Redis server...
[root@host51 6379]# redis-cli  -h 192.168.4.51  -p 6351   #进入数据库失败
Could not connect to Redis at 192.168.4.51:6351: Connection refused
Could not connect to Redis at 192.168.4.51:6351: Connection refused
not connected> exit
[root@host51 6379]# ss  -nutlp |  grep  redis-server    #此时查看端口也失败
[root@host51 6379]# redis-check-aof --fix  appendonly.aof   #修复aof文件
0x             20d: Expected prefix '*', got: 'k'
AOF analyzed: size=543, ok_up_to=525, diff=18
This will shrink the AOF from 543 bytes, with 18 bytes, to 525 bytes
Continue? [y/N]: y
Successfully truncated AOF   #修复成功
[root@host51 6379]# cat appendonly.aof  #再次查看aof文件,发现手写的几行被删除
[root@host51 6379]# /etc/init.d/redis_6379 start   #再次启动服务,此时可能会报错,已经存在了pid文件,只要删除再重新启动即可
/var/run/redis_6379.pid exists, process is already running or crashed
[root@host51 6379]# rm  -rf  /var/run/redis_6379.pid
[root@host51 6379]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host51 6379]# redis-cli  -h 192.168.4.51  -p 6351
192.168.4.51:6351> keys  *1) "z"2) "d"3) "n"4) "k"5) "k5"6) "c"7) "k4"8) "k3"9) "v"
10) "k2"
11) "b"
12) "x"
13) "s"
14) "k6"
15) "f"
16) "a"
17) "k1"

数据类型

string字符串

  • 字符串操作

设置key及值,过期时间可以使用秒或毫秒为单位

-  set  key  value [ex  seconds] [px  milliseconds] [nx|xx]

从偏移量开始复写key的特定位的值

- setrange  key  offset   value
- >set first  "hello world"
- >setrange  first  6  "Redis"    #改写为hello Redis

统计字串长度

- strlen  key
- >strlen first

存在则追加,不存在则创建key以及value,返回key长度

- append  key  value
- >append  myname  tian

对key所存储字串,设置或清除特定偏移量上的位(bit)
value值可以为1或者0,offset为0~2^32之间
key不存在,则创建新key

- setbit  key offset  value
- >setbit  bit  0  1   #设置bit第0位为1
- >setbit  bit  1  0   #设置bit第1位为0

统计字串中被设置为1的比特位数量

- bitcount  key
- >setbit  bits  0  1          #0001
- >setbit  bits  3  1          #1001
- >bitcount   bits             #结果为2- >setbit   peter   100  1   #网站上线100天用户登录了一次
- >setbit   peter    105  1   #网站上线105天用户登录了一次
- >bitcount   peter
  • 场景说明
  • 记录网站用户上线频率,例如用户A上线了多少天等类似的数据
  • 如用户在某天上线,则使用setbit,以用户名为key,将网站上线日为offset,并在该offset上设置为1,最后计算用户总上线次数时,使用bitcount用户名即可。
  • 这样,即使网站运行10年,每个用户仅占用10*365比特位即456字节。

将key中的值减1,key不存在则先初始化为0,再减1

- decr  key
- >set   test   10
- >decr   test

将key中的值,减去decrement

- decrby    key   decrement
- >set count  100
- >decrby   count   20

返回key存储的字符串值,若key不存在则返回null
若key的值不是字串,则返回错误,get只能处理字串

- get   key

返回字串值中的子字串,截取范围为start和end
负数偏移量表示从末尾开始计数,-1表示最后一个字符,-2表示倒数第二个字符

- >set   first   "hello,the  world"
- >getrange   first   -5  -1
- >getrange   first    0   4

将key的值加1,如果key不存在,则初始化为0后再加1
主要应用为计数器

- >set  page   20
- >incr  page

将key的值增加increment

- incrby  key  increment

为key中所存储的值加上浮点数增量increment

- incrbyfloat   key   increment
- >set    num   16.1
- >incrbyfloat  num  1.1

获取一个或者多个key的值,空格分隔,具有原子性

- mget  key [key...]

设置多个key及值,空格分隔,具有原子性

- mset   key   value  [key  value...]
字符类型string相关命令对存入的数据进行修改例:
192.168.4.51:6351> set x 11
OK
192.168.4.51:6351> ttl x
(integer) -1
192.168.4.51:6351> set y 99 ex 10   #ex秒
OK
192.168.4.51:6351> ttl y
(integer) 5
192.168.4.51:6351> ttl y
(integer) -2
192.168.4.51:6351> set y 99 px 10  #px毫秒
OK
192.168.4.51:6351> ttl y
(integer) -2
192.168.4.51:6351> set x 33
OK
192.168.4.51:6351> get x
"33"
192.168.4.51:6351> set x 22 nx      #新存入的变量不存在就赋值
(nil)
192.168.4.51:6351> set x 22 xx      #变量存在就赋新的值,不存在就不赋值
OK
192.168.4.51:6351> get x
"22"修改变量的值
192.168.4.51:6351> set tel ascdef
OK
192.168.4.51:6351> get tel
"ascdef"
192.168.4.51:6351> SETRANGE tel 0 ABC   #从第一个字符开始替换
(integer) 6
192.168.4.51:6351> get tel
"ABCdef"
192.168.4.51:6351> SETRANGE tel 1 **
(integer) 6
192.168.4.51:6351> get tel
"A**def"统计变量值的个数
192.168.4.51:6351> STRLEN tel
(integer) 6
192.168.4.51:6351> get tel
"A**def"添加新值
192.168.4.51:6351> get  tel
"A**def"
192.168.4.51:6351> APPEND tel cc
(integer) 8
192.168.4.51:6351> get tel
"A**defcc"
192.168.4.51:6351> APPEND  telb cc    #没有该变量就创建新的变量并赋值
(integer) 2
192.168.4.51:6351> get telb
"cc"位存储方式存储数据,目的节省存储空间
1G=1024M
1M=1024K
1K=1024bytes
1byte=8位
1位=0或1192.168.4.51:6351> setbit tian 1 1
(integer) 0
192.168.4.51:6351> setbit tian 2 0
(integer) 0
192.168.4.51:6351> setbit tian 3 1
(integer) 0
192.168.4.51:6351> setbit tian 4 1
(integer) 0
192.168.4.51:6351> setbit tian 5 0
(integer) 0
192.168.4.51:6351> setbit tian 6 1
(integer) 0
192.168.4.51:6351> setbit tian 7 1
(integer) 0
192.168.4.51:6351> setbit tian 8 0
(integer) 0
192.168.4.51:6351> setbit tian 9 0
(integer) 0
192.168.4.51:6351> bitcount  tian
(integer) 5自减
192.168.4.51:6351> get x
"22"
192.168.4.51:6351> type x
string
192.168.4.51:6351> DECR x
(integer) 21
192.168.4.51:6351> DECR x
(integer) 20
192.168.4.51:6351> DECR x
(integer) 19
192.168.4.51:6351> DECR x
(integer) 18
192.168.4.51:6351> get x
"18"自加
192.168.4.51:6351> get x
"18"
192.168.4.51:6351> INCR x
(integer) 19
192.168.4.51:6351> INCR x
(integer) 20
192.168.4.51:6351> INCR x
(integer) 21
192.168.4.51:6351> incrby x 11
(integer) 32
192.168.4.51:6351> INCRBYFLOAT x 5.2
"37.2"获取变量值的部分数据
192.168.4.51:6351> get tel
"A**defcc"
192.168.4.51:6351> GETRANGE  tel -2 -1
"cc"
192.168.4.51:6351> GETRANGE  tel 0 2
"A**"

list列表

  • list列表简介
  • Redis的list是一个字符队列
  • 先进后出
  • 一个key可以有多个值
  • list列表操作
    将一个或多个值value插入到列表key的表头
    key不存在,则创建key
- lpush  key  value  [value...]
- >lpush  list  a  b  c    #list值依次为c、b、a

从开始位置读取key的值到stop结束

-  lrange    key  start   stop
- >lrange   list    0    2         #从0位开始,读到2位为止
- >lrange   list    0    -1       #从开始读到结束为止
- >lrange   list    0    -2       #从开始读到倒数第2位为止

移除并返回列表头元素数据,key不存在则返回nil

- lpop   key
- >lpop  list          #删除表头元素,可以多次执行

返回列表key的长度

- llen  key

返回列表中第index个值

- lindex  key  index
- >lindex  key   0;  lindex  key   2;  lindex  key  -2

将key中index位置的值修改为value

- lset  key   index  value
- >lset  list   3   test      #将list中第3个值修改为test

将value插入到key的末尾

- rpush    key   value  [value...]
- >rpush   list3   a  b  c          #list3值为a  b   c
- >rpush   list3   d                  #末尾插入d

删除并返回key末尾的值

- rpop   key
- >rpush  list4    a  b   c     #list4值为a   b   c
- >rpop    list4            #删除末尾的c,并返回删除的值
lpush:192.168.4.51:6351> lpush hostname  tian haha  aaa  heihei
(integer) 4
192.168.4.51:6351> keys *
1) "hostname"
192.168.4.51:6351> type  hostname
list
192.168.4.51:6351> get  hostname
(error) WRONGTYPE Operation against a key holding the wrong kind of value
192.168.4.51:6351> LRANGE  hostname  0 -1
1) "heihei"
2) "aaa"
3) "haha"
4) "tian"
192.168.4.51:6351> LRANGE  hostname  0 2         #输出前三个
1) "heihei"
2) "aaa"
3) "haha"
192.168.4.51:6351> LRANGE  hostname  -2 -1      #输出后两个
1) "haha"
2) "tian"lpop:192.168.4.51:6351> lpop hostname           #删除变量,默认删除当前第一个,不能指定移除的变量
"heihei"
192.168.4.51:6351> LRANGE  hostname  0 -1
1) "aaa"
2) "haha"
3) "tian"llen: 192.168.4.51:6351> llen  hostname         #查看变量长度
(integer) 3
192.168.4.51:6351> LRANGE  hostname  0 -1   #查看list的变量,0代表第一个变量值,-1代表最后一个变量值,-2代表倒数第二个变量值,0 -1代表所有的变量值
1) "aaa"
2) "haha"
3) "tian"
192.168.4.51:6351> lpush hostname  AAA  BBB
(integer) 5
192.168.4.51:6351> LRANGE  hostname  0 -1
1) "BBB"
2) "AAA"
3) "aaa"
4) "haha"
5) "tian"lset:192.168.4.51:6351> lset  hostname 0 ZZZ
OK
192.168.4.51:6351> LRANGE  hostname  0 -1
1) "ZZZ"
2) "AAA"
3) "aaa"
4) "haha"
5) "tian"
192.168.4.51:6351> lset  hostname -1 XXX
OK
192.168.4.51:6351> LRANGE  hostname  0 -1
1) "ZZZ"
2) "AAA"
3) "aaa"
4) "haha"
5) "XXX"lindex:192.168.4.51:6351> lindex hostname  2
"aaa"
192.168.4.51:6351> lindex hostname  -2
"haha"rpush:192.168.4.51:6351> LRANGE  hostname  0 -1
1) "ZZZ"
2) "AAA"
3) "aaa"
4) "haha"
5) "XXX"
192.168.4.51:6351> rpush hostname  111  444  333
(integer) 8
192.168.4.51:6351> LRANGE  hostname  0 -1
1) "ZZZ"
2) "AAA"
3) "aaa"
4) "haha"
5) "XXX"
6) "111"
7) "444"
8) "333"rpop:192.168.4.51:6351> rpop  hostname        #默认删除最后一个变量
"333"
192.168.4.51:6351> LRANGE  hostname  0 -1
1) "ZZZ"
2) "AAA"
3) "aaa"
4) "haha"
5) "XXX"
6) "111"
7) "444"
192.168.4.51:6351> lpop  hostname
"ZZZ"
192.168.4.51:6351> LRANGE  hostname  0 -1
1) "AAA"
2) "aaa"
3) "haha"
4) "XXX"
5) "111"
6) "444"

hash表

  • hash表简介
  • 是一个string类型的filed和value的映射表
  • 一个key可以对应多个filed,一个filed对应一个value
  • 将一个对象存储为hash类型,较于每个字段都存储成string类型更能节省内存
  • hash表操作
    将hash表中filed值设置为value
- hset    key   filed  value
- >hset  site  google  'www.g.cn'
- >hset   site  baidu    'www.baidu.com'

获取hash表中filed的值

- hget  key   filed
- >hget   site    google

同时给hash表中的多个filed赋值

- hmset  key  filed   value  [filed  value...]
- >hmset    site   google   www.g.cn   baidu   www.baidu.cn

返回hash表中多个filed的值

- hmget  key   filed  [filed...]
- >hmget   site   google   baidu

返回hash表中所有filed名称

- hkeys      key
- >hmset  site   google   www.g.cn    baidu    www.baidu.com
- >hkeys   site

返回hash表中所有key名和对应的值列表

- hgetall    key

返回hash表中所有key的值

-  hvals     site

删除hash表中多个filed的值,不存在则忽略

- hdel   key   filed  [filed...]
- >hdel  site   google   baidu
hset,hget,hkeys:192.168.4.51:6351> hset site  tian  www.tian.com
(integer) 1
192.168.4.51:6351> keys *
1) "site"
192.168.4.51:6351> type  site
hash
192.168.4.51:6351> hkeys site
1) "tian"
192.168.4.51:6351> hget site tian
"www.tian.com"hmset,hmget:192.168.4.51:6351> hmset  site aa www.aaa.com qq www.qq.com  ss  www.ss.com
OK
192.168.4.51:6351> hkeys  site
1) "tian"
2) "aa"
3) "qq"
4) "ss"
192.168.4.51:6351> hget  site qq
"www.qq.com"
192.168.4.51:6351> hmget  site tian aa
1) "www.tian.com"
2) "www.aaa.com"hvals:192.168.4.51:6351> hvals  site
1) "www.tian.com"
2) "www.aaa.com"
3) "www.qq.com"
4) "www.ss.com"hgetall:192.168.4.51:6351> hgetall  site
1) "tian"
2) "www.tian.com"
3) "aa"
4) "www.aaa.com"
5) "qq"
6) "www.qq.com"
7) "ss"
8) "www.ss.com"hdel:192.168.4.51:6351> hdel site qq
(integer) 1
192.168.4.51:6351> hkeys  site
1) "tian"
2) "aa"
3) "ss"

NoSQL(三):主从复制相关推荐

  1. 常见的NoSQL数据库介绍

    目录 一.NoSQL概述 二.为什么用NoSQL 三.NoSQL特点 四.NoSQL的分类 五.NoSQL适用场景 六.NoSQL不适用场景 一.NoSQL概述 NoSQL(NoSQL = Not O ...

  2. mysql主从复制(一):一主多从

    一  应用背景 MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展.多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能.下图就描 ...

  3. NoSQL数据库详细介绍

    一.NoSQL发展历史 二.什么是NoSQL 三.为什么使用NoSQL 四.NoSQL vs. RDBMS 五.常见的数据库 六.NoSQL的四种类型 1.键值(Key-Value)存储 2.文档(D ...

  4. 2.6_2 NoSQL概述

    相关链接 Excel目录 目录 一.单机MySQL的演化 二.什么是NoSQL 三.NoSQL的四大分类 一.单机MySQL的演化 1.单机Mysql的年代     90年代,基本上一个网站的访问量不 ...

  5. 移动互联网系统架构特点及实践--手机凤凰网

    本文整理自:http://www.cnblogs.com/sunli/archive/2011/02/19/mobile_architecture.html 今天参加了InfoQ组织的百度技术沙龙活动 ...

  6. 主流关系型分布式数据库选型与设计实战

    一.数据库从集中式到分布式的演进 1.1.传统单机数据库 从狭义概念来讲,"数据库"就是OLTP场景的关系型单机数据库,诸如老牌的Oracle.DB2等商业数据库以及开源产品MyS ...

  7. 检查集群状态命令_巨杉数据库SequoiaDB巨杉Tech | 四步走,快速诊断数据库集群状态...

    1.背景 SequoiaDB 巨杉数据库是一款金融级分布式数据库,包括了分布式 NewSQL.分布式文件系统与对象存储.与高性能 NoSQL 三种存储模式,分别对应分布式在线交易.非结构化数据和内容管 ...

  8. 独家专访:SequoiaDB 3.0 版本正式发布!协议级完整兼容MySQL!

    SequoiaDB 3.0 版本正式发布!协议级完整兼容MySQL! 标签:SequoiaDB 3.0,MySQL,OLTP SequoiaDB巨杉数据库 3.0,在产品GA发布后,经过近半年在金融级 ...

  9. IT知识架构和操作系统简介1

    一.IT知识架构 数据存储:磁盘--|--SAN.NAS.DAS(专门将数据存储于磁盘阵列) |--分布式存储架构(HDFS Hadoop分布式文件系统)--集群(应用) + 系统:Linux + 算 ...

  10. Redis 源码分析之故障转移

    在 Redis cluster 中故障转移是个很重要的功能,下面就从故障发现到故障转移整个流程做一下详细分析. 故障检测 PFAIL 标记 集群中每个节点都会定期向其他节点发送 PING 消息,以此来 ...

最新文章

  1. 企业区块链应用程序的两个关键问题
  2. element ui 红点_element-ui 自定义表单验证 , 但是不出现小红心了
  3. erp框架 saas_【观察】一周之后,浪潮云ERP将直面数字化转型2.0四大攻坚战
  4. JSON.parse()和eval()的区别
  5. PAL算法原理及代码实现
  6. 名企程序员被裁实录:早上还在改 Bug,晚上就成下岗工
  7. 第二专业 计算机考试成绩查询系统,2021年上半年信息系统项目管理师成绩查询时间公布(7月12日),查询入口已开通!...
  8. webpack2 实践系列(二)— entry 和 output
  9. 【Linux】【MySQL】CentOS7安装最新版MySQL8.0.13(最新版MySQL从安装到运行)
  10. Navicat连接出现了2003-Can’t connect to MySQL server on ‘localhost’…(已解决)
  11. bat导出远程oracle数据,windows 任务计划 实现oracle远程 数据库备份
  12. 百度地图如何获取国内行政区的边界,同时添加覆盖物并且填充颜色
  13. UCOSII操作系统(一)--基础知识
  14. HTML如何下载文件
  15. 联想SR158 安装CentOS7系统
  16. xshell 基本操作
  17. python 做行转列通过enbid对应多个cell一行显示
  18. Linux搭建samba服务及使用案例
  19. 分布式计算的详细笔记
  20. 美国第一个设置计算机学科的学校,美国普渡大学希拉法叶校区

热门文章

  1. javaweb学习总结(三十一)——国际化(i18n)
  2. [caffe]深度学习之图像分类模型AlexNet解读
  3. 线性代数:第三章 矩阵的初等变换与线性方程组(2)线性方程组的解 初等方阵
  4. 图像处理(四)图像分割(2)测地距离Geodesic图割
  5. 深度学习(五)caffe环境搭建
  6. Machine Learning课程 by Andrew Ng
  7. Android组件化专题 - 组件化配置
  8. Spring Boot集成CKEditor
  9. Leetcode:371.Sum Of Two Integer
  10. ucos内存管理笔记