================事务==================
mutil:开启事务,存储在队列里
discard:取消命令
exec:执行
mutil后面的语句,可能出现2个错误
1:语法问题,
2:语法没错,适用对象有问题
并发问题:
乐观锁:监听
悲观锁:使用时就开启锁,别人用不了
redis使用的是乐观锁
watch key1[key2…keyn]:监听key1,key2有没有变化,如果有变化则事务取消
unwatch :取消所有watch监听
执行顺序
wtach key1
mutil
exec/discard
unwatch

=========频道发布,消息订阅============
publish 频道 内容:频道发布,返回值为监听个数
subscribe 频道:订阅频道
psubscribe pattern:一次性监听满足条件的频道 (news*会监听所有news开头的频道)
pubsub channels [pattern]:列出当前活动频道, 一个活动频道是指,又发布有订阅。没设置pattern,显示所有

运维层面
=============持久化的方式=============
常见的持久化方式
主从:通过从服务器保存和持久化,如mongoDB的replication sets配置,主服务器就是从内存上面写,保存到从服务器上。
日志:通过生成相关日志,并通过日志来恢复数据
couchDB对于数据内容不修改,只追加,则文件本身就是日志,不会丢失数据

redis持久化方式
一):rdb快照持久化
工作原理
每隔[N分钟]或[N次]写操作后,从内存dump数据形成rdb文件[压缩]放在[备份目录],
[]里面的内容可以配置
redis.conf配置文件里面有
三个选项注释的话,将不会导出文件
save 900 1:900秒修改超过1次,自动备份
save 300 10:300秒修改超过10次,自动备份
save 60 10000:60秒修改10000次,自动备份

stop-writers-on-bgsave-error yes:导出过程出错,停止写入。
rdbcompression yes:压缩rdb导出文件
rdbchecksum yes:导入rdb文件时检测文件是否出错
缺陷:
在2个保存点之间断电,将会丢失1-N分钟的数据
也就是说60秒之内我保存了1W条数据,他会自动导出,然后我在保存1条数据,则不会保存。没触发里面的条件
优点:写入快

二:aof(日志)
conf配置
appendonly no:是否打开aof日志功能,默认关闭
appendfsync everysec:折中方案,每秒写一次
appendfsync always:每一个命令都立即同步到aof,安全,速度慢
appendfsync no:写入工作交给操作系统,由操作系统判断你缓冲区大小统一写到aof,同步频率低,速度快
no-appendfsync-on-rewrite yes:正在导出rdb快照的过程中,要不要停止同步aof,停止,节约io。所有的aof都会存储在队列里,等rdb执行完,在执行aof。所以数据不会丢失
auto-aof-rewrite-percentage :aof文件比起上次重写时的大小,增长率100%重写
auto-aof-rewrite-min-size 64mb:aof文件至少超过64M重写

在dump rdb过程中,aof如果停止同步,会不会丢失数据?
不会,所有的操作缓存在内存的队列里,dump完成后,同意操作
aof重写时指什么?
指的是把内存中的数据,逆化成命令写入到aof日志里,解决zof日志过大问题。实际上就是多次操作同一个数据,都会被记录下来,这样的话,浪费空间,重写就是把最终的结果转换为1个命令。
恢复是,rdb和aof那个恢复快?
rdb快,因为其实数据的内存映射,而aof是命令,需要逐条执行
可以同时使用,并且推荐这样用。
aof和rdb同时存在,会优先采用aof读取
配置文件中开启aof,会生成一个空文件,如果rdb没有先读取,会优先读取aof,所以会导致没有内容。

===========主从复制(集群)=========
集群作用
1:主从备份,防止主机关闭
2:读写分离,分担master的任务
3:任务分离,如从服分别分担备份工作和计算工作

使用slave做rdb写入工作,
1:主配置文件关闭rdb开启信息,aof可关闭可不关闭(因为主服务器同步时间比从服务器即时,如果主服务器开启了,则要关闭从服务器aof,避免反复读写)
2:从配置文件开启slave服务(slaveof localhost 6379),并配置端口为主服务器端口
3:从服务器配置开启rdb,并关闭aof
4:从服务器配置slave-read-only为只读,保证数据一致。
4:从服务器配置跟主服务器不重复端口,以及pidfile文件名字,还有rdb文件名字
5:配置密码,如果master有密码
主配置文件equirepass 密码:配置密码
从配置文件masterauth 密码:配置密码
客户端连接客户端口,auth 密码

redis-cli -p 指定从的端口就开启slave
缺陷:每次slave断开后,无论任意情况,在连接master,
都要master全部dump出来,在aof,即同步的过程都要重新执行一遍,
多台slave不要一起启动,否则master可能io剧增

====================运维===============
客户端命令
time:显示服务器时间,时间戳(秒),微秒数
dbsize:当前数据库key数量
bgrewriteaof:手动重写aof
save:手动保存rdb
bgsave:手动保存rdb,后台重启进程保存
lastsave :上次保存rdb时间
flushdb:清空当前db
flushall:清空所有db
showdown [save/nosave]:关闭服务器,保存|不保存,默认保存后重写aof
info [statu][fork][…]:显示信息
memory
used_memory:XXX 数据结构的空间
used_memory_rss:实占空间
mem_fragmentation_ratio:前2者的比例,1为最佳,如果值过大,说明redis的内存碎片化严重,可以在导出再导入一次
主从复制
role:slave
master_host
master_port
mester_link_status:up
持久化
rdb_changes_since_last_save:0 上次保存后到现在有几个改动
rdb_last_save_time:上次保存时间
status
latest_fork_usec:导入导出多少微秒
config get requirepass:获取是否有密码
config get slowlog-log-slower-then:获取慢日志信息,大于多少秒记下来
config set slowlog-log-slower-then 微秒:设置慢日志时间
config get slowlog-max-len :获取存储多少条慢查询的记录
slowlog get [count]:获取慢日志
slowlog-log-slower-then 微秒:设置慢日志时间
slaveof master-Host port:把当前实例设为master的slave

===============aof恢复与服务器间迁移===================
如果运行了flushall,立即showdown nosave关闭服务器,然后手工编辑aof文件,去掉文件中的flushall相关(3行一对)行,然后开启服务器就可以导回原来数据
或者,aof改名字,让系统找不到,让他读取rdb即可

复制一份rdb文件,名字改为另一个redis服务器引用,即可。
复制rdb文件时要保证调用rdb的进程关闭,否则另一个redis应用失败(因为2个rdb处在同一句柄)。
aof也同理

==================运维监控===========
master down之后
一:手工配置
1:指定任意一台slave设置slaveof no one,表示角色更换为master
2:设置slave-read-only no:表示可写
3:其他slave,新的master
设置:slaveof IP地址 端口
二:使用sentinel监控主服务器
1:cp 源代码目录下sentinel.conf 到redis目录
2:sentinel.conf配置信息
sentinel monitor 定义的名字 ip 端口 次数 :监视那个地址,一定的失效次数没有连接上,确定失效
sentinel auth-pass 名字跟上面定义的名字一致 012_345:设置密码
sentinel down-after-milliseconds 名字同上 30000:30秒没有连接上,失效次数增加1
sentinel can-failover 名字同上 yes:是否允许故障转移(slave更改为master),建议只有一台设置为yes,因为监控的sentinel多了之后,配置的yes也多了之后,会导致一台服务器失效后,一起修改。
sentinel parallel-syncs 名字 数量:当master死机时候,指定新的master时,指定一定的数量slave启动连接,防止masterio剧增
sentinel failover-timeout 名字 时间:超过时间没有完成设置,监控失败。
3:开启
./bin/redis-server –help,开启server帮助
开启哨兵模式
./bin/redis-server ./sentinel.conf –sentinel &
4:master死机后,哨兵随机指定新的master,手动配置
每一个redis.conf里面配置slave-priority优先级,数字越小越靠前,也就是越有限指定为master