工作原理
slave向master发送sync命令master启动后台存盘进程,并收集所有修改数据命令master完成后台存盘后,传送整个数据文件到slaveslave接收数据文件,加载到内存中完成首次完全同步后续有新数据产生时,master继续将新的数据收集到的修改命令依次传给slave,完成同步缺点
网络繁忙,会产生数据同步延时问题系统繁忙,会产生数据同步延时问题一、查看主从复制信息,redis服务运行后,默认都是master服务器
[root@ip51 ~]# redis-cli -h 192.168.4.51 -p 6351 192.168.4.51:6351> info replication二、给51配置从库
命令行配置,临时有效,服务重启消失 [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 永久配置,修改配置文件 [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六、把从服务器恢复为独立的服务器
命令行恢复(临时)从服务器上
192.168.4.52:6352> slaveof no one 永久配置注释掉从服务器配置
[root@ip52 ~]# vim /etc/redis/6379.conf ... ... #slaveof 192.168.4.53 6353 ... ...一、给55主机上的redis服务配置密码
添加密码 [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 给服务脚本添加密码设置 [root@ip55 ~]# vim /etc/init.d/redis_6379 ... ... $CLIEXEC -p 6355 -h 192.168.4.55 -a 123456 shutdown ... ... 连接55,添加数据 [root@ip55 ~]# redis-cli -h 192.168.4.55 -p 6355 -a 123456 192.168.4.55:6355>二、给55主机配置从库
修改56配置文件 [root@ip56 ~]# vim /etc/redis/6379.conf ... ... slaveof 192.168.4.55 6355 ... ... masterauth 123456 ... ... 重启服务 [root@ip56 ~]# /etc/init.d/redis_6379 stop [root@ip56 ~]# /etc/init.d/redis_6379 start 查看状态信息 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 123456sentinel 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主机上新添加的数据
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|nobgsave出错时停止写操作
stop-writes-on-bgsave-error yes|no使用RDB文件恢复数据
备份数据 备份dump.rdb文件到其他为值 #cp 数据库目录/dump.rdb 备份目录
恢复数据 拷贝备份文件到数据库目录,重启redis服务
#cp 备份目录/dump.rdb 数据库目录/ #/etc/redis/redis_端口 startRDB优点
高性能的持久化实现----创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程结束后,再用这个临时文件替换上次持久化好的文件,过程中主进程不做任何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只做追加操作的文件,Append Only File
记录redis服务所有写操作不断的将新的写操作,追加到文件的末尾使用cat命令可以查看文件内容相关配置参数
文件名
appendfilename “appendonly.aof” //指定文件名appendonly yes //启用aof,默认为noAOF文件记录写操作的方式
appendfsync always //有新写操作立即记录appendfsync everysec //每秒记录一次appendfsync no //从不记录开启aof日志
[root@ip51 ~]# vim /etc/redis/6379.conf ... ... appendonly yes //启用日志 appendfilename "appendonly.aof" //定义文件名,一般采用默认 appendfsync everysec //配置记录写操作的方式 ... ...备份数据
备份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 64mbAOF优点
可以灵活设置持久化方式,同步持久化appendfsync always 或异步持久化appendfsync everysec出现意外宕机时,仅可能丢失1秒的数据 AOF缺点持久化文件的体积通常会大于RDB方式执行fsync策略时的速度可能会比RDB方式慢字符串操作
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) 18setbit 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) 80get 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列表简介
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表简介
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