事物/乐观锁
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
127.0.0.1:6379> multi #开启事物
OK
127.0.0.1:6379> set age 18 #命令入队
QUEUED
127.0.0.1:6379> set name jack
QUEUED
127.0.0.1:6379> exec #执行事务
1) OK
2) OK
127.0.0.1:6379>
一:事物
MULTI
标记一个事务块的开始。
EXEC
执行所有事务块内的命令。
DISCARD
取消事务,放弃执行事务块内的所有命令。
127.0.0.1:6379> watch name #对name开启监听
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name ztind
QUEUED
127.0.0.1:6379> exec
(nil) ---->事物执行前有对name继续重新设值,本事物将被打断 故结果为nil
127.0.0.1:6379>
二:乐观锁
WATCH key [key ...]
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
UNWATCH
取消 WATCH 命令对所有 key 的监视。
发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
#订阅消息
SUBSCRIBE channel [channel ...]
订阅给定的一个或多个频道的信息。
UNSUBSCRIBE [channel [channel ...]]
指退订给定的频道。
#订阅匹配类的消息
PSUBSCRIBE pattern [pattern ...]
订阅一个或多个符合给定模式的频道。
PUNSUBSCRIBE [pattern [pattern ...]]
退订所有给定模式的频道。
#为上述两类学习发送消息
PUBLISH channel message
将信息发送到指定的频道。
#Pubsub 命令用于查看订阅与发布系统状态,它由数个不同格式的子命令组成。
PUBSUB subcommand [argument [argument ...]]
查看订阅与发布系统状态。
eg:pubsub channels
持久化
rdb (redis database)
redis在指定的时间间隔内将内存中的数据快照写入磁盘,保存为dump.rdb文件.
redis为内存储存,断电即失,为了保存数据redis使用dump.rdb来实现数据保存,下次启动redis服务器自动读取。
save策略:
- save 900 1 表示在900s内至少有1个key修改即保持
- save 300 10 表示在300s内至少有10个key修改即保持
- save 60 10000 表示在60s内至少有10000个key修改即保持
dump.rdb文件的生成情况如下:
- save ,主动执行save命令时生成
- flushall , 清空所以数据库数据时生成
- shutdown,关闭redis服务器时生成
aof (append only file)
以日志的方式来记录每个写操作命令,将redis执行过程中的所有写命令记录下来(读操作不记录)保存到appendonly.aof文件中。只追加文件不改写文件。redis服务重启后读取本文件并执行里面的命令来实现数据恢复功能。
默认不开启,可到配置文件redis.conf修改开启 appendonly yes
保存策略:
- appendfsync always #总是同步修改追加保存
- appendfsync everysec #每秒修改追加保存(默认)
- appendfsync no #不同步,交由系统来保存,最快