Redis搭建
主从复制工作原理
• 工作原理
– Slave 向 maste 发送 sync 命令
– Master 启动后台存盘进程,同时收集所有修改数据命
令
– Master 执行完后台存盘进程后,传送整个数据文件到
slave 。
– Slave 接收数据文件后,将其存盘并加载到内存中完成
首次完全同步
– 后续有新数据产生时, master 继续将新的所以收集到
的修改命令依次传给 slave ,完成同步。
一主一从:50主 57从(因为每台redis服务器默认自己都为master,所以只需配置57)
[root@redis52 ~]# redis-cli -h 192.168.4.50
192.168.4.52:6379> info replication // 查看主从配置信息
命令: info replication //查看主从配置信息
命令行快速指定从库(重起失效)
命令: slaveof 主库ip 主库端口
192.168.4.57:6357> slaveof 192.168.4.50 6350
OK
57查看
192.168.4.57:6357> info replication
# Replication
role:slave
master_host:192.168.4.50
master_port:6350
50查看
192.168.4.50:6350> info replication
# Replication
role:master
connected_slaves:1 ###连接一个从库
要57恢复为单独服务器只需停掉重起(因为是命令行设置的)
主从从
再把58设为57从:
192.168.4.58:6358> keys *
(empty list or set)
192.168.4.58:6358> slaveof 192.168.4.57 6357
OK
192.168.4.58:6358> keys *
1) "name"
192.168.4.57:6357> slaveof no one
OK
192.168.4.57:6357> info replication
# Replication
role:master
connected_slaves:1
恢复为主库:
192.168.4.57:6357> slaveof no one
OK
192.168.4.57:6357> info replication
# Replication
role:master
connected_slaves:1
修改配置文件配置永久主从且带认证(密码):
配置50密码登陆,且设置脚本起停
[root@host50 ~]# redis-cli -h 192.168.4.50 -p 6350
192.168.4.50:6350> ping
(error) NOAUTH Authentication required.
192.168.4.50:6350> auth 123456
OK
或者[root@host50 ~]# redis-cli -h 192.168.4.50 -p 6350 -a 123456
修改57主配置文件
[root@host57 ~]# vim /etc/redis/6379.conf
282 slaveof 192.168.4.50 6350 ####主库ip 端口
283
284 # If the master is passwordprotected (using the "requirepass" configuratio n
285 # directive below) it ispossible to tell the slave to authenticate before
286 # starting the replicationsynchronization process, otherwise the master wi ll
287 # refuse the slave request.
288 #
289 masterauth 123456 ####主库密码
290
重起57登陆:
[root@host57 ~]# redis-cli -h 192.168.4.57 -p 6357
192.168.4.57:6357> info replication
# Replication
role:slave
master_host:192.168.4.50
master_port:6350
master_link_status:up
修改配置文件把58设置为57从:
[root@host58 6379]# vim /etc/redis/6379.conf
281 #
282 slaveof 192.168.4.57 6357
283
284 # If the master is passwordprotected (using the "requirepass" configuratio n
58查看
192.168.4.58:6358> info replication
# Replication
role:slave
master_host:192.168.4.57
master_port:6357
master_link_status:up
哨兵模式
主库宕机后,从库自动升级为主库
在 slave 主机编辑 sentinel.conf 文件
在 slave 主机运行哨兵程序
####手写哨兵配置文件(必须这个路径这个名)
####vim /etc/sentinel.conf
[root@host57 ~]# cat /etc/sentinel.conf
sentinel monitor redis50 192.168.4.50 6350 1
需把前面设置的50密码注释掉,并把57设置的50密码注释掉
如果不注释密码,50有密码设置/etc/sentinel.conf需加主库密码
sentinel monitor redis50 192.168.4.50 6350 1
sentinel auth_pass mymaster 123456
测试:
1)[root@host57 ~]#redis-sentinel /etc/sentinel.conf 启动哨兵设置,读配置文件
2)手动down掉50
3)在57查看状态是否变为主库
192.168.4.57:6357> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.4.58,port=6358,state=online,offset=7088,lag=0
sentinel monitor 主机名 ip 地址 端口 票数
主机名:自定义
IP 地址: master 主机的 IP 地址
端 口: master 主机 redis 服务使用的端口
票 数:主库宕机后, 票数大于 1 的主机被升级为主库
RDB 持久化介绍
数据持久化方式之一
– 在指定时间间隔内,将内存中的数据集快照写入硬盘。
– 术语叫 Snapshot 快照。
– 恢复时,将快照文件直接读到内存里。
相关配置参数
• 文件名
– dbfilename “dump.rdb” // 文件名
– save “” //禁用RDB
• 数据从内存保存到硬盘的频率
– save 900 1 // 900秒内且有 1 次修改存盘
– save 300 10
– save 60 10000
//300 秒内且有 10 次修改存盘
//60 秒内且有 10000 修改存盘
• 手动立刻存盘
– > save //阻塞写存盘
– > bgsave // 不阻塞写存盘
数据恢复:
1)[root@host58 6379]# pwd
/var/lib/redis/6379
[root@host58 6379]# cp dump.rdb dump.rdb.bak
要确定数据已经存入dump.rdb
2)关闭58redis(切忌一定要先关服务)
cp dump.rdb.bak dump.rdb
如果先cp dump.rdb.bak dump.rdb后关服务,dump.rdb.bak数据没拷贝到dump.rdb中去,因为关服务是会自动生成一个dump.rdb文件,会覆盖你已经拷贝过dump.rdb.bak的dump.rdb的内容,因为名字一样
3)起redis服务,查看数据恢复
因为起redis服务,redis会读取dump.rdb中的内容,dump.rdb中是dunm.rdb.bak中备份数据
RDB 优点 / 缺点
• RDB 优点
– 持久化时, Redis 服务会创建一个子进程来进行持久
化,会先将数据写入到一个临时文件中,待持久化过
程都结束了,再用这个临时文件替换上次持久化好的
文件;整个过程中主进程不做任何 IO 操作,这就确保
了极高的性能。
– 如果要进程大规模数据恢复,且对数据完整行要求不
是非常高,使用 RDB 比 AOF 更高效。
• RDB 的缺点
– 意外宕机,最后一次持久化的数据会丢失。
持久化之AOF
AOF 介绍
• 只追加操作的文件
– Append Only File
– 记录 redis 服务所有写操作。
– 不断的将新的写操作,追加到文件的末尾。
– 使用 cat 命令可以查看文件内容
相关配置参数
• 文件名
– appendfilename "appendonly.aof" // 文件名
– appendonly yes // 启用 aof ,默认no ####启用AOF
• AOF 文件记录,写操作的三种方式
– appendfsync always // 有新的写操作立即记录,
性能差,完整性好。
– appendfsync everysec // 每秒记录一次,宕机时会
丢失 1 秒的数据
– appendfsync no
// 从不记录
修复 AOF 文件,
– 把文件恢复到最后一次的正确操作
[root@redis53 6379]# redis-check-aof --fix appendonly.aof
AOF数据恢复
[root@host58 6379]# cp appendonly.aof.bak appendonly.aof 如果里面有flushall删除就可以了
日志重写 ( 日志文件会不断增大 ) ,何时会触发日志重写?
– redis 会记录上次重写时 AOF 文件的大小,默认配置
是当 aof 文件是上次 rewrite 后大小的 1 倍且文件大于
64M 时触发。
– auto-aof-rewrite-percentage 100
– auto-aof-rewrite-min-size 64mb
字符串操作
set key value [ex seconds] [px milliseconds] [nx|xx]
– 设置 key 及值,过期时间可以设置为秒或毫秒为单位
– nx 只有 key 不存在,才对 key 进行操作
– xx 只有 key 已存在,才对 key 进行操作
setrange key offset value
– 从偏移量开始复写 key 的特定位的值
192.168.4.58:6358> set tel 18780123904
OK
192.168.4.58:6358> SETRANGE tel 3 ****
(integer) 11
192.168.4.58:6358> get tel
"187****3904"
• strlen key
– 统计字串长度
192.168.4.58:6358> STRLEN tel
(integer) 11
append key value
– 字符存在则追加,不存在则创建 key 及value
– 返回值为 key 的长度
192.168.4.58:6358> APPEND tel xielingyun
(integer) 21
192.168.4.58:6358> get tel
"187****3904xielingyun"
bitcount key
92.168.4.58:6358> set youxi 1 0
(error) ERR syntax error
192.168.4.58:6358> SETBIT youxi 1 0
(integer) 0
192.168.4.58:6358> SETBIT youxi 2 1
(integer) 0
192.168.4.58:6358> SETBIT youxi 3 1
(integer) 0
192.168.4.58:6358> SETBIT youxi 4 1
(integer) 0
192.168.4.58:6358> SETBIT youxi 5 1
(integer) 0
192.168.4.58:6358> SETBIT youxi 6 0
(integer) 0
192.168.4.58:6358> BITCOUNT youxi 统计
(integer) 4
192.168.4.58:6358> SETBIT youxi 2 0 修改
(integer) 1
192.168.4.58:6358> BITCOUNT youxi 统计
(integer) 3
decr key
– 将 key 中的值减 1 , key 不存在则先初始化为 0 ,再减1
192.168.4.58:6358> set z 9
OK
192.168.4.58:6358> DECR z
(integer) 8
192.168.4.58:6358> DECR z
(integer) 7
decrby key decrement
– 将 key 中的值,减去decrement
192.168.4.58:6358> DECRBY z 4
(integer) 3
192.168.4.58:6358> DECRBY z 3
(integer) 0
getrange key start end
负数偏移量表述从末尾计数, -1 表示最后一个字符
-2表示倒数第二个字符
192.168.4.58:6358> get tel
"187****3904xielingyun"
192.168.4.58:6358> GETRANGE tel 0 4
"187**"
192.168.4.58:6358> GETRANGE tel 1 5
"87***"
192.168.4.58:6358> GETRANGE tel 1 7
"87****3"
192.168.4.58:6358> GETRANGE tel -4 -1
"gyun
incr key
– 将 key 的值加 1 ,如果 key 不存在,则初始为 0 后再加1
192.168.4.58:6358> set num 100
OK
192.168.4.58:6358> INCR num
(integer) 101
192.168.4.58:6358> INCR num
(integer) 102
192.168.4.58:6358> INCR num
(integer) 103
incrby key increment
– 将 key 的值增加increment
192.168.4.58:6358> INCRby num 5
(integer) 108
192.168.4.58:6358> INCRby num 5
(integer) 113
incrbyfloat key increment
– 为 key 中所储存的值加上浮点数增量increment
192.168.4.58:6358> INCRBYFLOAT num 0.5
"113.5"
192.168.4.58:6358> INCRBYFLOAT num 0.5
"114"
192.168.4.58:6358> INCRBYFLOAT num 0.5
"114.5"
mget key [key...]
一次获取一个或多个 key 的值,空格分隔, < 具有原子性
192.168.4.58:6358> mget youxi num z
1) "\x1c"
2) "114.5"
3) "0"
mset key value [key value ...]
– 一次设置多个 key 及值,空格分隔, < 具有原子性>
192.168.4.58:6358> mset b 1 c 2
OK
192.168.4.58:6358> get b
"1"
192.168.4.58:6358> get c
"2"
List 列表简介
• Redis 的 list 是一个字符队列
• 先进后出
• 一个 key 可以有多个值
lpush key value [value...]
– 将一个或多个值 value 插入到列表 key 的表头
– Key 不存在,则创建key
>lpush list a b c //list1 值依次为c b a
等同于lpush list a; lpush list b; lpush list c
192.168.4.58:6358> LPUSH name bob lucy jerry tom
(integer) 4
192.168.4.58:6358> type name
list
192.168.4.58:6358> LRANGE name 0 2
1) "tom"
2) "jerry"
3) "lucy"
lrange key start stop
– 从开始位置读取 key 的值到 stop 结束
>lrange list 0 2 //从 0 位开始,读到 2 位为止
>lrange list 0 -1 //从开始读到结束为止
>lrange list 0 -2 //从开始读到倒数第 2 位值
192.168.4.58:6358> LRANGE name 0 -1
1) "tom"
2) "jerry"
3) "lucy"
4) "bob"
pop key
– 移除并返回列表头元素数据, key 不存在则返回nil
>lpop list // 删除表头元素,可以多次执行
192.168.4.58:6358> lpop name
"tom"
192.168.4.58:6358> LRANGE name 0 -1
1) "jerry"
2) "lucy"
3) "bob"
192.168.4.58:6358> LLEN name
(integer) 3
lindex key index
– 返回列表中第 index 个值
如lindex key 0 ; lindex key 2; lindex key -2
192.168.4.58:6358> LINDEX name 0
"jerry"
192.168.4.58:6358> LINDEX name 1
"lucy"
192.168.4.58:6358> LINDEX name 2
"bob"
192.168.4.58:6358> LINDEX name -1
"bob"
192.168.4.58:6358> LINDEX name -2
"lucy"
lset key index value
– 将 key 中 index 位置的值修改为value
>lset list 3 test
// 将 list 中第 3 个值修改为test
192.168.4.58:6358> lset name 0 abc
OK
192.168.4.58:6358> LRANGE name 0 -1
1) "abc"
2) "lucy"
3) "bob"
192.168.4.58:6358> LSET name 1 bcd
OK
192.168.4.58:6358> LRANGE name 0 -1
1) "abc"
2) "bcd"
3) "bob"
rpush key value [value...]
– 将 value 插入到 key 的末尾
>rpush list3 a b c
>rpush list3 d
//list3 值为a b c //末尾插入d
192.168.4.58:6358> RPUSH name lbj
(integer) 4
192.168.4.58:6358> LRANGE name 0 -1
1) "abc"
2) "bcd"
3) "bob"
4) "lbj"
rpop key
– 删除并返回 key 末尾的值
192.168.4.58:6358> LRANGE name 0 -1
1) "abc"
2) "bcd"
3) "bob"
Hash 表
让定义变量可以存储多个key/values key/values
hset key field value
– 将 hash 表中 field 值设置为value
192.168.4.58:6358> hset site google 'www.google'
(integer) 1
192.168.4.58:6358> hset site baidu 'www.baidu'
(integer) 1
192.168.4.58:6358> TYPE site
hash
192.168.4.58:6358> hset site sina www.sina
(integer) 1
hget key filed
– 获取 hash 表中 field 的值
192.168.4.58:6358> HGET site sina
"www.sina"
hmset key field value [field value...]
– 同时给 hash 表中的多个 field 赋值
192.168.4.58:6358> HMSET site yahoo www.yahoo.com qq www.qq.com
OK
192.168.4.58:6358> HGET site qq
"www.qq.com"
hmget key field [field...]
– 返回 hash 表中多个 field 的值
192.168.4.58:6358> HMgET site yahoo qq baidu
1) "www.yahoo.com"
2) "www.qq.com"
3) "www.baidu"
hkeys key
– 返回 hash 表中所有 field 名称
192.168.4.58:6358> hkeys site
1) "google"
2) "baidu"
3) "sina"
4) "yahoo"
5) "qq"
hgetall key
– 返回 hash 表中所有 field 和field的值
192.168.4.58:6358> HGETALL site
1) "google"
2) "www.google"
3) "baidu"
4) "www.baidu"
5) "sina"
6) "www.sina"
7) "yahoo"
8) "www.yahoo.com"
9) "qq"
10) "www.qq.com"
hvals key
– 返回 hash 表中所有 filed 的值
192.168.4.58:6358> HVALS site
1) "www.google"
2) "www.baidu"
3) "www.sina"
4) "www.yahoo.com"
5) "www.qq.com"
hdel key field [field...]
– 删除 hash 表中多个 field 的值,不存在则忽略
192.168.4.58:6358> HDEL site qq baidu
1) "google"
2) "www.google"
3) "sina"
4) "www.sina"
5) "yahoo"
6) "www.yahoo.com"
del key [key...]
– 删除一个或多个key
• exists key
– 测试一个 key 是否存在
• expire key seconds
– 设置 key 的生存周期
• persist key
– 设置 key 永不过期
• ttl key
– 查看 key 的生存周期
keys 匹配
– 找符合匹配条件的 key ,特殊符号用 \ 屏蔽
>keys *
// 显示所有key
>keys h?llo // 匹配 hello,hallo,hxllo 等
>keys h*llo // 匹配 hllo 或 heeello 等
>keys h[ae]lo // 匹配 hello 和hallo
flushall
– 清空所有数据
• select id
– 选择数据库, id 用数字指定,默认数据库为0
>select 0
>select 2
move key db_id
– 将当前数据库的 key 移动到 db_id 数据库中
>move key 1
// 将 key 移动到 1 数据库中
• rename key newkey
– 给 key 改名为 newkey , newkey 已存在时,则覆盖
其值
• renamenx key newkey
– 仅当 newkey 不存在时,才将 key 改名为newkey
• sort key
– 对 key 进行排序
>lpush cost 1 8 7 2 5
>sort cost
// 默认对数字排序,升序
>sort cost desc
// 降序
>lpush test “about” “site” “rename”
>sort test alpha
// 对字符排序
>sort cost alpha limit 0 3
// 排序后提取 0-3 位数据
>sort cost alpha limit 0 3 desc
>sort cost STORE cost2 // 对 cost 排序并保存为cost2
type key
– 返回 key 的数据类型