【从入门到放弃-Redis】redis常见操作

redis的事务及锁应用:
开启事务:multi
语句:普通命令
失败:discard 取消
成功:exec

注意:discard和mysql中rollback的区别
如果已经成功执行了两条语句,第三条出错,
rollback后,前两条语句的影响消失,
discard只是结束本次事务,前两条语句的影响仍然存在

在multi后面的语句中,语句出错有两种可能
1:语法有问题
exec时,报错,所有语句得不到执行

2:语法本身没有问题,但适用对象有问题,比如,zadd操作link对象
exec之后,会执行正确的语句,并跳过有不适当的语句

锁的概念:
悲观锁:世界上充满危险,肯定有人和我抢,给值上锁,只有我能操作
乐观锁:没有那么多人和我抢,我只要注意,在操作的时候有没有人更改值就好

redis使用乐观锁
watch key1 key2 … 使用watch监控key1,key2..,如果其中值有变,则不执行事务
unwatch 取消所有监控

redis频道发布和消息订阅:
publish channel contents 在channel 发布contents 返回值为当前接收订阅人数
subscribe channel 订阅channel频道
psubscribe channel 订阅channel频道,可以监听多个频道

rdb快照持久化:
持久化:把数据存储于断电后不会丢失的设备中,通常是硬盘

常见持久化方式:
主从:通过从服务器保存和持久化,如mongoDB的replication sets配置
日志:操作生成相关日志,并通过日志来恢复数据

rdb的工作原理:
每隔N分钟或者N次写操作后,从内存dump数据形成rdb文件,压缩后反正备份目录 (棕色部分可通过参数来配置)

rdb快照相关参数:
save 900 1 #刷新快照到硬盘中,必须满足两点要求才会触发,即900秒之后至少有1个关键字发生变化
save 300 10 #必须是300秒之后至少10个关键字发生变化
save 60 10000 #必须是60秒之后至少10000个关键字发生变化
stop-writes-on-basave-error yes #后台存储错误停止写
rdbcompression yes #使用LZF压缩rdb文件
rdbchecknum yes #存储和加载rdb文件时校验
dbfilename dump.rdb #设置rdb文件名
dir ./ #设置工作目录,rdb文件写入该目录

aof日志持久化(将操作过的命令,都写到文本文件里):
aof配置:
appendonly no #是否打开aof日志功能

appendfsync always #每1个命令,都立即同步到aof。安全、速度慢
appendfsync everysec #折衷方案,每秒写入一次
appendfsync no #写入工作交给操作系统,由操作系统判断缓冲区大小,统一写到aof,同步频率低,速度快

no-appendfsync-on-write yes #正在导出rdb快照的过程中,要不要停止同步aof
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写

bgrewriteaof 重写日志命令

问:在dump.rdb过程中,aof如果停止同步,会不会丢失?
答:不会,所有的操作缓存在内存的队列里,dump完成后,统一操作

问:aof重写是指什么?
答:aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里,以解决aof日志过大问题

问:2种持久化是否可以同时用?
答:可以,而且推荐这么做,aof和rdb都有,以aof来恢复

问:恢复时rdb和aof恢复那个快?
答:rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行

redis主从复制:
集群的作用:
1:主从备份 防止主机宕机
2:读写分离,分担master的任务
3:任务分离,如从服务器分别分担备份工作与计算工作

master配置:
1:关闭rdb快照(备份工作交给slave)
2:可以开启aof

slave配置:
1:声明slave-of
2:配置密码[如果master有密码]
3:[某1个]slave打开rdb快照功能
4:配置是否只读[slave-read-only]
5:pid port 要改

主从复制缺陷:
每次slave断开后,再连接master,都要master全部dump出来rdb,再aof,即同步的过程都要重新执行1遍
所以多台slave不要同时启动,否则master可能io剧增