Redis并发写入(乐观同步方法)

更新时间:2023-06-14 03:58:12 阅读: 评论:0

Redis并发写⼊(乐观同步⽅法)
⼀,什么是乐观同步
品牌策略有哪些乐观同步是在取出⼀个数据A的时候,会携带⼀个取出时的版本信息,⽐如:1,⽽如果在操作的时候,有另外⼀个操作B把存储在中的数据修改了,那个中的数据版本就会加1,这个时候如果再写⼊A的数据,发现A携带的版本与redis储存的不⼀样了,这时,redis就判定本次写⼊失败。
⼆,redis的事务机制
redis提供了⼀个事务操作的机制,命令⽤于开启⼀个事务,它总是返回 OK 。
清炒海带丝执⾏之后,客户端可以继续向服务器发送任意多条命令,这些命令不会⽴即被执⾏,⽽是被放到⼀个队列中,当命令被调⽤时,所有队列中的命令才会被执⾏。
另⼀⽅⾯,通过调⽤,客户端可以清空事务队列,并放弃执⾏事务。
以下是⼀个事务例⼦,它原⼦地增加了 foo 和 bar 两个键的值:
> MULTI
OK
> INCR foo
QUEUED鹿角丸
> INCR bar
QUEUED
> EXEC
1) (integer) 1
2) (integer) 1
命令的回复是⼀个数组,数组中的每个元素都是执⾏事务中的命令所产⽣的回复。其中,回复元素的先后顺序和命令发送的先后顺序⼀致。
当客户端处于事务状态时,所有传⼊的命令都会返回⼀个内容为 QUEUED 的状态回复(status reply),这些被⼊队的命令将在命令被调⽤时执⾏。
三,事务可能遇到的错误
使⽤事务时可能会遇上以下两种错误:
事务在执⾏之前,⼊队的命令可能会出错。⽐如说,命令可能会产⽣语法错误(参数数量错误,参数名错误,等等),或者其他更严重的错误,⽐如内存不⾜(如果服务器使⽤maxmemory设置了最⼤内存限制的话)。
命令可能在调⽤之后失败。举个例⼦,事务中的命令可能处理了错误类型的键,⽐如将列表命令⽤在了字符串键上⾯,诸如此类。
脾大是什么原因引起的
对于发⽣在执⾏之前的错误,客户端以前的做法是检查命令⼊队所得的返回值:如果命令⼊队时返回QUEUED,那么⼊队成功;否则,就是⼊队失败。如果有命令在⼊队时失败,那么⼤部分客户端都会停⽌并取消这个事务。
四,事务的回滚
从 Redis 2.6.5 开始,服务器会对命令⼊队失败的情况进⾏记录,并在客户端调⽤命令时,拒绝执⾏并⾃动放弃这个事务。
在 Redis 2.6.5 以前, Redis 只执⾏事务中那些⼊队成功的命令,⽽忽略那些⼊队失败的命令。⽽新的处理⽅式则使得在流⽔线(pipeline)中包含事务变得简单,因为发送事务和读取事务的回复都只需要和服务器进⾏⼀次通讯。(待)
五,redis乐观同步
WATCH 命令可以为 Redis 事务提供 check-and-t (CAS)⾏为。
被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。如果有⾄少⼀个被监视的键在 EXEC 执⾏之前被修改了,那么整个事务都会被取消, EXEC 返回空多条批量回复(null multi-bulk reply)来表⽰事务已经失败。
举个例⼦,假设我们需要原⼦性地为某个值进⾏增 1 操作(假设 INCR 不存在)。
⾸先我们可能会这样做:
地板砖怎么选val = GET mykey
val = val + 1
SET mykey $val
上⾯的这个实现在只有⼀个客户端的时候可以执⾏得很好。但是,当多个客户端同时对同⼀个键进⾏这样的操作时,就会产⽣竞争条件。
举个例⼦,如果客户端 A 和 B 都读取了键原来的值,⽐如 10 ,那么两个客户端都会将键的值设为 11 ,但正确的结果应该是 12 才对。
有了 WATCH ,我们就可以轻松地解决这类问题了:
企业人事管理制度WATCH mykey
val = GET mykey
val = val + 1
手机呼叫失败MULTI
SET mykey $val
EXEC全国十大木门品牌
使⽤上⾯的代码,如果在 WATCH 执⾏之后, EXEC 执⾏之前,有其他客户端修改了 mykey 的值,
那么当前客户端的事务就会失败。程序需要做的,就是不断重试这个操作,直到没有发⽣碰撞为⽌。
这种形式的锁被称作乐观锁,它是⼀种⾮常强⼤的锁机制。并且因为⼤多数情况下,不同的客户端会访问不同的键,碰撞的情况⼀般都很少,所以通常并不需要进⾏重试。
了解 WATCH
WATCH 使得 EXEC 命令需要有条件地执⾏:事务只能在所有被监视键都没有被修改的前提下执⾏,如果这个前提不能满⾜的话,事务就不会被执⾏。
如果你使⽤ WATCH 监视了⼀个带过期时间的键,那么即使这个键过期了,事务仍然可以正常执⾏,关于这⽅⾯的详细情况,请看这个帖⼦: /p/redis/issues/detail?id=270
WATCH 命令可以被调⽤多次。对键的监视从 WATCH 执⾏之后开始⽣效,直到调⽤ EXEC 为⽌。
⽤户还可以在单个 WATCH 命令中监视任意多个键,就像这样:
redis> WATCH key1 key2 key3
OK
当 EXEC 被调⽤时,不管事务是否成功执⾏,对所有键的监视都会被取消。
另外,当客户端断开连接时,该客户端对键的监视也会被取消。
使⽤⽆参数的 UNWATCH 命令可以⼿动取消对所有键的监视。对于⼀些需要改动多个键的事务,有时候程序需要同时对多个键进⾏加锁,然后检查这些键的当前值是否符合程序的要求。当值达不到要求时,就可以使⽤ UNWATCH 命令来取消⽬前对键的监视,中途放弃这个事务,并等待事务的下次尝试

本文发布于:2023-06-14 03:58:12,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/949716.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:命令   事务   客户端   错误   监视   可能   失败   需要
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图