NoSQL(三):主从复制
主从复制
主从复制概述
主从复制结构模式
主从复制工作原理
- 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文件恢复数据
- 要求:
- 启用RDB
- 设置存盘间隔为120秒且10个key改变数据自动存盘
- 备份RDB文件
- 删除数据
- 使用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文件恢复数据
- 要求:
- 启用AOF
- 备份AOF文件
- 删除数据
- 使用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(三):主从复制相关推荐
- 常见的NoSQL数据库介绍
目录 一.NoSQL概述 二.为什么用NoSQL 三.NoSQL特点 四.NoSQL的分类 五.NoSQL适用场景 六.NoSQL不适用场景 一.NoSQL概述 NoSQL(NoSQL = Not O ...
- mysql主从复制(一):一主多从
一 应用背景 MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展.多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能.下图就描 ...
- NoSQL数据库详细介绍
一.NoSQL发展历史 二.什么是NoSQL 三.为什么使用NoSQL 四.NoSQL vs. RDBMS 五.常见的数据库 六.NoSQL的四种类型 1.键值(Key-Value)存储 2.文档(D ...
- 2.6_2 NoSQL概述
相关链接 Excel目录 目录 一.单机MySQL的演化 二.什么是NoSQL 三.NoSQL的四大分类 一.单机MySQL的演化 1.单机Mysql的年代 90年代,基本上一个网站的访问量不 ...
- 移动互联网系统架构特点及实践--手机凤凰网
本文整理自:http://www.cnblogs.com/sunli/archive/2011/02/19/mobile_architecture.html 今天参加了InfoQ组织的百度技术沙龙活动 ...
- 主流关系型分布式数据库选型与设计实战
一.数据库从集中式到分布式的演进 1.1.传统单机数据库 从狭义概念来讲,"数据库"就是OLTP场景的关系型单机数据库,诸如老牌的Oracle.DB2等商业数据库以及开源产品MyS ...
- 检查集群状态命令_巨杉数据库SequoiaDB巨杉Tech | 四步走,快速诊断数据库集群状态...
1.背景 SequoiaDB 巨杉数据库是一款金融级分布式数据库,包括了分布式 NewSQL.分布式文件系统与对象存储.与高性能 NoSQL 三种存储模式,分别对应分布式在线交易.非结构化数据和内容管 ...
- 独家专访:SequoiaDB 3.0 版本正式发布!协议级完整兼容MySQL!
SequoiaDB 3.0 版本正式发布!协议级完整兼容MySQL! 标签:SequoiaDB 3.0,MySQL,OLTP SequoiaDB巨杉数据库 3.0,在产品GA发布后,经过近半年在金融级 ...
- IT知识架构和操作系统简介1
一.IT知识架构 数据存储:磁盘--|--SAN.NAS.DAS(专门将数据存储于磁盘阵列) |--分布式存储架构(HDFS Hadoop分布式文件系统)--集群(应用) + 系统:Linux + 算 ...
- Redis 源码分析之故障转移
在 Redis cluster 中故障转移是个很重要的功能,下面就从故障发现到故障转移整个流程做一下详细分析. 故障检测 PFAIL 标记 集群中每个节点都会定期向其他节点发送 PING 消息,以此来 ...
最新文章
- 企业区块链应用程序的两个关键问题
- element ui 红点_element-ui 自定义表单验证 , 但是不出现小红心了
- erp框架 saas_【观察】一周之后,浪潮云ERP将直面数字化转型2.0四大攻坚战
- JSON.parse()和eval()的区别
- PAL算法原理及代码实现
- 名企程序员被裁实录:早上还在改 Bug,晚上就成下岗工
- 第二专业 计算机考试成绩查询系统,2021年上半年信息系统项目管理师成绩查询时间公布(7月12日),查询入口已开通!...
- webpack2 实践系列(二)— entry 和 output
- 【Linux】【MySQL】CentOS7安装最新版MySQL8.0.13(最新版MySQL从安装到运行)
- Navicat连接出现了2003-Can’t connect to MySQL server on ‘localhost’…(已解决)
- bat导出远程oracle数据,windows 任务计划 实现oracle远程 数据库备份
- 百度地图如何获取国内行政区的边界,同时添加覆盖物并且填充颜色
- UCOSII操作系统(一)--基础知识
- HTML如何下载文件
- 联想SR158 安装CentOS7系统
- xshell 基本操作
- python 做行转列通过enbid对应多个cell一行显示
- Linux搭建samba服务及使用案例
- 分布式计算的详细笔记
- 美国第一个设置计算机学科的学校,美国普渡大学希拉法叶校区
热门文章
- javaweb学习总结(三十一)——国际化(i18n)
- [caffe]深度学习之图像分类模型AlexNet解读
- 线性代数:第三章 矩阵的初等变换与线性方程组(2)线性方程组的解 初等方阵
- 图像处理(四)图像分割(2)测地距离Geodesic图割
- 深度学习(五)caffe环境搭建
- Machine Learning课程 by Andrew Ng
- Android组件化专题 - 组件化配置
- Spring Boot集成CKEditor
- Leetcode:371.Sum Of Two Integer
- ucos内存管理笔记