博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis当中的事务
阅读量:4149 次
发布时间:2019-05-25

本文共 1020 字,大约阅读时间需要 3 分钟。

数据库当中为了保证数据的一致性,都会提供一定的事务操作,对于缓存数据当然也不例外,会提供一定的事务操作,来保证整个操作过程的原子性。

redis当中提供的事务性,可以从以下几个命令了解

Multi 用来开启一个事务,类似于数据库当中begin

EXEC 执行一个事务,类似于数据库当中的commit

DISCARD 放弃一个事务的执行,类似于rollback

WATCH 监听特定的key, 这个类似于java当中的CAS,从检测那刻起,如果对应的key的value发生了变化,就放弃修改。也可以理解为数据库当中的乐观锁。

接下来我们相信介绍下这几个命令。

在使用multi进行开始事务之后,后面的指令都会被缓存起来,如果返回queued,表示数据被成功保存到了缓存当中,在执行exec时,会将缓存起来的命令作为一个事务进行执行。

    注意:如果开启了持久化,事务当中的命令在执行成功之后,就会通过write命令一次性写入到磁盘当中,如果在写入过程中出现了断电等故障问题,就会只有一部分命令被写入了,这时候就会出现AOF不完整的情况,这个时候可以通过redis-check-aof工具修复这个问题,将不完整的命令移除,保证数据的完整性。

如果在执行exec之前有指令错误,这并不影响其他指令的执行。

Watch指令

127.0.0.1:6379> set age 23OK127.0.0.1:6379> watch age //开始监视ageOK127.0.0.1:6379> set age 24 //在EXEC之前,age的值被修改了OK127.0.0.1:6379> multiOK127.0.0.1:6379> set age 25QUEUED127.0.0.1:6379> get ageQUEUED127.0.0.1:6379> exec //触发EXEC(nil) //事务无法被执行

在watch指令之后进行了key的修改,然后再开启事务,最终执行,这种情况下,是会提示执行失败的,

注意:禁止在multi和exec指令之间执行watch指令,watch指令只能在multi指令之前使用。

DISCARD指令

> get books(nil)> multi  //开始事务OK> incr booksQUEUED> incr booksQUEUED> discard //放弃事务内的修改指令OK> get books(nil)

 

你可能感兴趣的文章
JavaScript substr() 方法
查看>>
JavaScript slice() 方法
查看>>
JavaScript substring() 方法
查看>>
HTML 5 新的表单元素 datalist keygen output
查看>>
(转载)正确理解cookie和session机制原理
查看>>
jQuery ajax - ajax() 方法
查看>>
将有序数组转换为平衡二叉搜索树
查看>>
最长递增子序列
查看>>
从一列数中筛除尽可能少的数,使得从左往右看这些数是从小到大再从大到小...
查看>>
判断一个整数是否是回文数
查看>>
经典shell面试题整理
查看>>
腾讯的一道面试题—不用除法求数字乘积
查看>>
素数算法
查看>>
java多线程环境单例模式实现详解
查看>>
将一个数插入到有序的数列中,插入后的数列仍然有序
查看>>
在有序的数列中查找某数,若该数在此数列中,则输出它所在的位置,否则输出no found
查看>>
万年历
查看>>
作为码农你希望面试官当场指出你错误么?有面试官这样遭到投诉!
查看>>
好多程序员都认为写ppt是很虚的技能,可事实真的是这样么?
查看>>
如果按照代码行数发薪水会怎样?码农:我能刷到公司破产!
查看>>