一、redis的事务
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
批量操作在发送 EXEC 命令前被放入队列缓存。
收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
开始事务。(MULTI)
命令入队。(...)
执行事务。(EXEC)
玩一下:
127.0.0.1:6379>multiOK127.0.0.1:6379>setnamesxinghuaQUEUED127.0.0.1:6379>setnames212QUEUED127.0.0.1:6379>getnamesQUEUED127.0.0.1:6379>exec1) OK2) (error) ERRsyntaxerror3) "xinghua"127.0.0.1:6379>getnames"xinghua"
哎吆,上面执行完发现第二个set names2 1 2命令出错后,并没有将第一个set names xinghua命令执行的结果给无效化,说明redis的事务并不是原子性的哈,单个的命令是原子性的,而事务提交更像是执行了一个以multi为开始,以exec为结束的批量命令的集合而已,就像是执行了一个脚本,里面的命令成功与失败都不影响别的命令结果,按顺序执行了就对了。中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不执行。
那么我们在执行的一半时,如果想取消已经执行的事务,就这么干:
127.0.0.1:6379>multiOK127.0.0.1:6379>setmeinvliuyanQUEUED127.0.0.1:6379>getmeinvQUEUED127.0.0.1:6379>discardOK127.0.0.1:6379>getmeinv(nil) 127.0.0.1:6379>
奥里给,果然没有将meinv存入哈。
下面这两命令怎么验证呢?
1.WATCH key [key ...]
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
2.UNWATCH
WATCH 命令取消 对所有 key 的监视。
二、备份及还原
备份和还原都要涉及到:redis 安装目录,我们可以用config命令来获取:
127.0.0.1:6379> config get dir
1) "dir"
2) "D:\\redis"
127.0.0.1:6379>
备份直接用save命令,会在安装目录生成这个文件:
127.0.0.1:6379>saveOK127.0.0.1:6379>
如果很大的话,我们也可以设置在后台进行备份:
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379>
如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。
总结:
事务multi开始, discard取消,exec执行。
save或bgsave备份,恢复数据就直接使用重启服务时从安装目录加载就好。
END