Redis主从复制,RDB/AOF持久化,数据类型

主从复制结构模式

  • 结构模式:一主一从、一主多从、主从从
主从复制工作原理

工作原理

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

缺点

  • 网络繁忙,会产生数据同步延时问题
  • 系统繁忙,会产生数据同步延时问题

配置主从复制

一、查看主从复制信息,redis服务运行后,默认都是master服务器

[root@ip51 ~]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> info replication

二、给51配置从库

  1. 命令行配置,临时有效,服务重启消失
[root@ip52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> SLAVEOF 192.168.4.51 6351   //将51设置为52的主库
192.168.4.52:6352> INFO replication
  1. 永久配置,修改配置文件
[root@ip52 ~]# vim /etc/redis/6379.conf
... ...
slaveof 192.168.4.51 6351
... ...

三、数据测试

[root@ip50 ~]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> set sex boy

四、配置53主机为51的从库

[root@ip53 ~]# /etc/init.d/redis_6379 stop

[root@ip53 ~]# vim /etc/redis/6379.conf 

... ...
slaveof 192.168.4.51 6351
... ...

[root@ip53 ~]# /etc/init.d/redis_6379 start

[root@ip53 ~]# redis-cli -h 192.168.4.53 -p 6353
192.168.4.53:6353> INFO replication

五、将54配置为53的从的库(主从从)

[root@ip54 ~]# /etc/init.d/redis_6379 stop

[root@ip54 ~]# vim /etc/redis/6379.conf 

... ...
slaveof 192.168.4.53 6353
... ...

[root@ip54 ~]# /etc/init.d/redis_6379 start

[root@ip54 ~]# redis-cli -h 192.168.4.54 -p 6354
192.168.4.54:6354> INFO replication

六、把从服务器恢复为独立的服务器

  1. 命令行恢复(临时)

从服务器上

192.168.4.52:6352> slaveof no one
  1. 永久配置

注释掉从服务器配置

[root@ip52 ~]# vim /etc/redis/6379.conf 
... ...
#slaveof 192.168.4.53 6353
... ...

配置带验证的主从复制结构

一、给55主机上的redis服务配置密码

  1. 添加密码
[root@ip55 ~]# vim /etc/redis/6379.conf 
... ...
requirepass 123456
... ...
[root@ip55 ~]# /etc/init.d/redis_6379 stop
[root@ip55 ~]# /etc/init.d/redis_6379 start
  1. 给服务脚本添加密码设置
[root@ip55 ~]# vim /etc/init.d/redis_6379

... ...
$CLIEXEC -p 6355 -h 192.168.4.55 -a 123456 shutdown
... ...
  1. 连接55,添加数据
[root@ip55 ~]# redis-cli -h 192.168.4.55 -p 6355 -a 123456
192.168.4.55:6355> 

二、给55主机配置从库

  1. 修改56配置文件
[root@ip56 ~]# vim /etc/redis/6379.conf 

... ...
slaveof 192.168.4.55 6355
... ...
masterauth 123456
... ...
  1. 重启服务
[root@ip56 ~]# /etc/init.d/redis_6379 stop
[root@ip56 ~]# /etc/init.d/redis_6379 start
  1. 查看状态信息
192.168.4.56:6356> info replication

哨兵服务

哨兵模式

  • 主库宕机后,从库自动升级为主库
  • 在slave主机编辑sentinel.conf文件
  • 在slave主机运行哨兵程序

一、创建哨兵服务配置文件

[root@ip58 ~]# vim /etc/sentinel.conf

添加如下配置项

bind 0.0.0.0
port 26379
sentinel monitor redisser 192.168.4.55 6355 1
sentinel auth-pass redisser 123456

sentinel monitor redisser 192.168.4.55 6355 1
主机名 ip地址 端口 票数

主机名:自定义
IP地址:master主机的IP地址
端口:master主机redis服务使用的端口
票数:有几台哨兵主机连接不上主库时,切换主库

二、运行哨兵服务

[root@ip58 ~]# redis-sentinel /etc/sentinel.conf

三、停掉55主机,查看监控信息

[root@ip55 ~]# /etc/init.d/redis_6379 stop

等待一会,监控信息就会显示55宕机,56主动升级为主

往56主机上存入新的数据

再打开55主机,55主机就会主动变为56的从库

[root@ip55 ~]# /etc/init.d/redis_6379 start

登录55主机查看数据,就会看到56主机上新添加的数据

持久化之RDB

RDB介绍

Redis数据库文件,全称Redis DataBase

  • 数据持久化方式之一
  • 依照指定时间间隔,将内存中的数据集快照写入磁盘
  • 术语叫Snapshot快照
  • 恢复时,将快照文件直接读如到内存

相关配置参数

文件名

  • dbfilename “dump.rdb” //文件名
  • save “” //禁用RDB

数据从内存保存到硬盘的频率

  • save 900 1 //900秒内且有一次修改
  • save 300 10 //300秒内且有10次修改
  • save 60 10000 //60秒内且有10000次修改

手动立刻存盘

  • save //阻塞写存盘
  • bgsave //不阻塞写存盘

压缩

  • rdbcompression yes|no

在存储快照后,使用crc16算法做数据校验

  • rdbchecksum yes|no

bgsave出错时停止写操作

  • stop-writes-on-bgsave-error yes|no

使用RDB文件恢复数据

  • 备份数据
    备份dump.rdb文件到其他为值
    #cp 数据库目录/dump.rdb 备份目录

  • 恢复数据
    拷贝备份文件到数据库目录,重启redis服务

#cp 备份目录/dump.rdb  数据库目录/
#/etc/redis/redis_端口  start
RDB优点/缺点

RDB优点

  • 高性能的持久化实现----创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程结束后,再用这个临时文件替换上次持久化好的文件,过程中主进程不做任何IO操作
  • 比较适合大规模数据恢复,且对数据完整性要求不是非常高的场合

RDB的缺点

  • 意外宕机时,最后一次持久化的数据会丢失

备份恢复操作

[root@ip51 ~]# scp /var/lib/redis/6379/dump.rdb root@192.168.4.52:/root/
[root@ip52 ~]# /etc/init.d/redis_6379 stop
[root@ip52 ~]# rm -rf /var/lib/redis/6379/*
[root@ip52 ~]# mv /root/dump.rdb /var/lib/redis/6379/
[root@ip52 ~]# /etc/init.d/redis_6379 start

持久化之AOF

只做追加操作的文件,Append Only File

  • 记录redis服务所有写操作
  • 不断的将新的写操作,追加到文件的末尾
  • 使用cat命令可以查看文件内容

相关配置参数

文件名

  • appendfilename “appendonly.aof” //指定文件名
  • appendonly yes //启用aof,默认为no

AOF文件记录写操作的方式

  • appendfsync always //有新写操作立即记录
  • appendfsync everysec //每秒记录一次
  • appendfsync no //从不记录

开启aof日志

[root@ip51 ~]# vim /etc/redis/6379.conf 
... ...
appendonly yes         //启用日志
appendfilename "appendonly.aof"    //定义文件名,一般采用默认
appendfsync everysec			  //配置记录写操作的方式
... ...
使用AOF文件恢复数据

备份数据

  • 备份appendonly.aof文件到其他位置
    #cp 数据库目录/appendonly.aof 备份目录

恢复数据

  • 拷贝备份文件到数据库目录,重启redis服务
#cp 备份目录/appendonly.aof 数据库目录/
#/etc/redis/redis_端口  start
[root@ip52 ~]# /etc/init.d/redis_6379 stop
[root@ip52 ~]# rm -rf /var/lib/redis/6379/*
[root@ip52 ~]# vim /etc/redis/6379.conf 
... ...
appendonly yes         //启用日志
appendfilename "appendonly.aof"    //定义文件名,一般采用默认
appendfsync everysec			  //配置记录写操作的方式
... ...
[root@ip51 ~]# scp /var/lib/redis/6379/appendonly.aof root@192.168.4.52:/var/lib/redis/6379/
[root@ip52 ~]# /etc/init.d/redis_6379 start

在命令行启用aof文件不会覆盖已有的数据

[root@ip53 ~]# redis-cli -h 192.168.4.53 -p 6353
192.168.4.53:6353> CONFIG SET appendonly yes   //设置这个配置项的值
192.168.4.53:6353> CONFIG REWRITE       //永久修改配置文件
192.168.4.53:6353> save

修复AOF文件

  • 把文件恢复到最后一次的正确操作
[root@ip53 ~]# redis-check-aof --fix /var/lib/redis/6379/appendonly.aof
[root@ip53 ~]# rm -rf /var/run/redis_6379.pid
[root@ip53 ~]# /etc/init.d/redis_6379 start

日志文件不断增大,何时触发日志重写

  • redis会记录上次重写时AOF文件的大小
  • 默认配置当aof文件是上次rewrite后大小的一倍且文件大于64M时触发
>auto-aof-rewrite-percentage 100
>auto-aof-rewrite-min-size 64mb
AOF优点/缺点

AOF优点

  • 可以灵活设置持久化方式,同步持久化appendfsync always 或异步持久化appendfsync everysec
  • 出现意外宕机时,仅可能丢失1秒的数据
    AOF缺点
  • 持久化文件的体积通常会大于RDB方式
  • 执行fsync策略时的速度可能会比RDB方式慢

数据类型

String字符串

字符串操作

  • set key value [ex seconds] [px milliseconds] [nx|xx] //加nx表示变量存在时不存,xx表示直接覆盖

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

  • setrange key offset value

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

  • strlen key,统计字串长度

192.168.4.51:6351> set tel 19999999444455
OK
192.168.4.51:6351> get tel
"19999999444455"
192.168.4.51:6351> SETRANGE tel 4 "****"
(integer) 14
192.168.4.51:6351> get tel
"1999****444455"
192.168.4.51:6351> strlen tel
(integer) 14
  • append key value
    存在则追加,不存在则创建key及value,返回key长度
192.168.4.51:6351> append tel  ****
(integer) 18
  • setbit key offset value
    对key所存储字串,设置或清除特定偏移量上的位(bit)
    value值可以为1或0,offset为0~2^32之间
    key不存在,则创建新key

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

192.168.4.51:6351>setbit bits 0 1    //0001
192.168.4.51:6351>setbit bits 3 1    //1001
192.168.4.51:6351>bitcount bits     //结果为2
 
192.168.4.51:6351>setbit peter 100 1   //网站上线100天用户登录了一次
192.168.4.51:6351>setbit peter 105 1   //网站上线105天用户登录了一次
192.168.4.51:6351>bitcount peter  

场景说明:
记录网站用户上线频率,如用户A上线了多少天等类似的数据
如用户再某天上线,则使用setbit,以用户名为key,将网站上线日为offset,并在该offset上设置1,最后计算用户总上线次数时。使用bitcount用户名即可,这样,即使网站运行10年,每个用户仅占用10*365比特位即456字节

  • decr key
    将key中的值减1,key不存在则先初始化为0,再减1
192.168.4.51:6351> set test 10
OK
192.168.4.51:6351> decr test
(integer) 9
  • decrby key decrement
    将key中的值,减去decrement
192.168.4.51:6351> set count 100
OK
192.168.4.51:6351> DECRBY count 20
(integer) 80
  • get key
    返回key存储的字符串值,若key不存在则返回null
    若key的值不是字串,则返回错误,get只能处理字串

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

192.168.4.51:6351> GETRANGE tel -5 -1
"5****"
192.168.4.51:6351> GETRANGE tel 0 4
"1999*"
  • incr key
    将key的值加1,如果key不存在,则初始为0后再加1
    主要应用为计数器
192.168.4.51:6351> set page 20
OK
192.168.4.51:6351> incr page
(integer) 21
  • incrby key increment
    将key的值增加increment
192.168.4.51:6351> INCRBY page 20
(integer) 41
  • incrbyfloat key increment
    为key中所存储的值加上浮点数增量 increment
192.168.4.51:6351> set num 16.1
OK
192.168.4.51:6351> incrbyfloat num 1.1
"17.2"
  • mget key [key…]
    获取一个或者多个key的值,空格分割,具有原子性
192.168.4.51:6351> mget count tel page
1) "80"
2) "1999****444455****"
3) "41"
  • mset key value [key value…]
    设置多个key及值,空格分隔,具有原子性
192.168.4.51:6351> MSET q w e r t y u i
OK
192.168.4.51:6351> mget q e t u
1) "w"
2) "r"
3) "y"
4) "i"
List列表

List列表简介

  • Redis的list是一个字符队列
  • 先进后出
  • 一个key可以有多个值

List列表操作

  • lpush key value [value…]
    将一个或多个值value插入到列表key的表头
    key不存在,则创建key
192.168.4.51:6351> LPUSH list a b c
(integer) 3
  • lrange key start stop
    从开始位置读取key值到stop结束
192.168.4.51:6351> lrange list 0 2   //从0位开始,读到2位为止
1) "c"
2) "b"
3) "a"

192.168.4.51:6351> lrange list 0 -1  //从开始读到结束为止
1) "c"
2) "b"
3) "a"

192.168.4.51:6351> LRANGE list 0 -2  //从开始读到倒数第2位为止
1) "c"
2) "b"
  • lpop key
    移除并返回列表头元素数据,key不存在则返回nil
192.168.4.51:6351> lpop list   //删除表头元素,可以多次执行
"c"
  • llen key
    返回列表key的长度
192.168.4.51:6351> llen list
(integer) 2
  • lindex key index
    返回列表中第index个值
192.168.4.51:6351> lindex list 0
"b"
192.168.4.51:6351> lindex list 1
"a"
  • lset key index value
    将key中index位置的值修改为value
192.168.4.51:6351> lset list 0 test   //将列表list中的第一个值修改为test
OK
192.168.4.51:6351> LRANGE list 0 4
1) "test"
2) "a"
  • rpush key value [value…]
    将value插入到key的末尾
192.168.4.51:6351> RPUSH list3 a b c  //list3值为a b c
(integer) 3
192.168.4.51:6351> RPUSH list3 d      //末尾插入d
(integer) 4
  • rpop key
    删除并返回key末尾的值
192.168.4.51:6351> rpush list4 a b c
(integer) 3
192.168.4.51:6351> rpop list4
"c"

Hash表

Hash表简介

  • Redis hash
  • 是一个string类型的field和value映射表
  • 一个key可以对应多个field,一个field对应一个value
  • 将一个对象存储为hash类型,较于每个字段都存储成string类型更能节省内存

Hash表操作

  • hset key field value
    将hash表中field值设置为value
192.168.4.51:6351> hset site google 'www.g.cn'
(integer) 1
192.168.4.51:6351> hset site baidu 'www.baidu.com'
(integer) 1

-hget key field
获取hash表中field的值

192.168.4.51:6351> hget site google
"www.g.cn"
192.168.4.51:6351> hget site baidu
"www.baidu.com"
  • hmset key field value [field value…]
    同时给hash表中的多个field赋值
192.168.4.51:6351> hmset site google www.g.cn baidu www.baidu.com
OK
  • hmget key field [field…]
    返回hash表中多个field的值
192.168.4.51:6351> hmget site google baidu
1) "www.g.cn"
2) "www.baidu.com"
  • hkeys key
    返回hash表中所有的field名称
192.168.4.51:6351> hkeys site
1) "google"
2) "baidu"
  • hgetall key
    返回hash表中所有key名和对应的值列表

  • hvals key
    返回hash表中所有key的值

  • hdel key field [field…]
    删除hash表中多个field的值,不存在则忽略

192.168.4.51:6351> hdel site goodle baidu
(integer) 1
管理命令总结
  • del key [key…]
    删除一个或者多个key
  • exists key
    测试一个key是否存在
  • expire key seconds
    设置key的生存周期
  • persist key
    设置一个key永不过期
  • ttl key
    查看key的生存周期
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值