设为首页 收藏本站
查看: 1005|回复: 0

[经验分享] Redis

[复制链接]

尚未签到

发表于 2015-7-21 12:00:11 | 显示全部楼层 |阅读模式
  Redis的事务基于四个命令:


  • MULTI
  • EXEC
  • DISCARD
  • WATCH

创建事务
  Redis的事务从一个MULTI命令开始,MULTI总会命令返回"ok"。
接着就可以开始输入操作数据,每一条操作命令都会进入队列。
最后执行EXEC,在队列中的命令得到执行。
  比如这样:

> MULTI
OK
> INCR foo
QUEUED
> INCR bar
QUEUED
> EXEC
1) (integer) 1
2) (integer) 1

  
如果事务中出现错误怎么办?
首先我们将事务中的错误分为两类:


  • 进入队列前发现错误,比如命令的语法错误。
  • EXEC执行后发现错误,比如对同一个key执行的两次不同数据类型的操作。
  第一种很好理解,就像上面给出的例子中,成功进入队列后会立马返回"QUEUED"。
如果没能进入队列,则整个事务都会失效,提示"Transaction discarded because of previous errors."
关于EXEC执行后出现的错误,凡是成功进入队列的都会被执行,即便同一事物中有执行失败的命令,其余的命令都会得到执行
这让那些用过关系型数据库的人们感到诧异, 为什么Redis不支持roll back?
对此官网的两点说法:



  •   Redis commands can fail only if called with a wrong syntax (and the problem is not detectable during the command queueing), or against keys holding the wrong data type: this means that in practical terms a failing command is the result of a programming errors, and a kind of error that is very likely to be detected during development, and not in production.

  •   Redis is internally simplified and faster because it does not need the ability to roll back.


  有人说不支持roll back会引发各种bug。但需要明白的是,roll back不是用来解决编程层面上的错误的。
而且,导致命令失败只有两种可能:


  • 语法错误
  • 执行了与key的数据类型不匹配的操作
  鉴于此,roll back几乎没有任何意义,Redis更倾向于不支持roll back而是保持简洁和高效。
  

丢弃事务
  DISCARD可以用作丢弃当前事务,并将连接状态恢复为正常状态。
使用方法如下:

> SET foo 1
OK
> MULTI
OK
> INCR foo
QUEUED
> DISCARD
OK
> GET foo
"1"

  

原子性
  check-and-set(CAS)之类的操作往往会出现竟态条件。
Redis提供了WATCH用于观察key的变化。
当一个被观察的key在EXEC执行前变化时,整个事务会终止并返回Nil,对该key的观察也会结束。
刚接触WATCH的时候,感觉这种处理方式很晦涩。不能加个显示锁什么的吗?
好在官网给出了充分的说明,先假设Redis没有提供INCR,我们现在要模拟一个递增操作:

val = GET mykey
val = val + 1
SET mykey $val

  
  一个client进行该操作时是没有问题,但多个client一起进行该操作时会出现竟态条件。
比如A和B两个client同时进行了GET mykey,得到的都是10,因此两次执行的结果是11而不是12。  
而加入WATCH后:

WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC

  
  如果WATCH和EXEC之间有其他的什么东东改变了被观察的key,该事务则会失败。
如果希望本次事务执行成功则需要在循环中执行,当然,这也是一种locking方式。
事实上,多个client访问同一key的冲突并不常见,看具体情况进行操作吧。  

  
  相应地,也有UNWATCH可以用于释放所有被观察的key。
  比如下面的例子中,事务内的INCR会成功执行:


WATCH key
UNWATCH key
MULTI
INCR key
EXEC

  
  关于WATCH,需要注意的一点是:设置了生存时间(EXPIRE)的key不会因为到期而被WATCH当作以改变。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-89056-1-1.html 上篇帖子: redis的sort排序 下篇帖子: 转载----How fast is Redis?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表