Redis事务与watch指令
【摘要】 Redis事务与watch指令 Redis事务 watch指令 总结 ❤️ 感谢大家 Redis事务与watch指令 Redis事务redis的事务是MULTI指令表明敞开事物,敞开业务后客户端发送的EXEC DISCARD WATCH MULTI指令立即履行外,其他指令后会放入业务队列中,然后回来给客户端消息:QUEUE当客户端向服务器发送EXEC指令的时分,服务器遍历客户端的业务队列,...
Redis事务与watch指令
Redis事务
redis的事务是MULTI指令表明敞开事物,敞开业务后客户端发送的EXEC DISCARD WATCH MULTI指令立即履行外,其他指令后会放入业务队列中,然后回来给客户端消息:QUEUE
当客户端向服务器发送EXEC指令的时分,服务器遍历客户端的业务队列,履行保存的一切指令,并把一切的履行结果回来给客户端。
watch指令
watch指令是可以监督多个数据库键,当excc指令履行的时分,假如被监督的数据库键被修正过了,业务履行失利,原理就是redis数据库中有个watched_keys字典,字典键是被watch指令监督的数据库键,值是链表,记录一切监督这个键的客户端信息。
当履行数据库修正的指令的时分会调用touchWatchedKey函数,touchWatchedKey函数中会对修正键的客户端设置CLIENT_DIRTY_CAS标识
// 当key被修正,调用该函数
void signalModifiedKey(redisDb *db, robj *key) {
touchWatchedKey(db,key);
}
// Touch 一个 key,假如该key正在被监督,那么客户端会履行EXEC失利
void touchWatchedKey(redisDb *db, robj *key) {
list *clients;
listIter li;
listNode *ln;
// 假如数据库中没有被监督的key,直接回来
if (dictSize(db->watched_keys) == 0) return;
// 找出监督该key的client链表
clients = dictFetchValue(db->watched_keys, key);
// 没找到回来
if (!clients) return;
/* Mark all the clients watching this key as CLIENT_DIRTY_CAS */
/* Check if we are already watching for this key */
listRewind(clients,&li);
// 遍历一切监督该key的client
while((ln = listNext(&li))) {
client *c = listNodeValue(ln);
// 设置CLIENT_DIRTY_CAS标识
c->flags |= CLIENT_DIRTY_CAS;
}
}
然后服务器收到客户端的exec指令时,服务器依据客户端的CLIENT_DIRTY_CAS标识判断,假如有这个标识,说明被修正过了,服务器就会拒绝客户端提交的业务。
总结
这就是redis事务的相关内容,事务开启通过MULTI命令,所有的命令都会进入事务队列中,当执行exec命令的时候,在事务队列中的命令再一起提交,watch命令用来监视键,当事务过程中有键被修改的话,这个键对应的监视器就能检测到,然后事务就会提交失败,保证事务一致性。
❤️ 感谢大家
如果你觉得这篇内容对你挺有有帮助的话:
- 欢迎关注我❤️,点赞👍🏻,评论🤤,转发🙏
- 关注
盼盼小课堂
,定期为你推送好文,还有群聊不定期抽奖活动,可以畅所欲言,与大神们一起交流,一起学习。 - 有不当之处欢迎批评指正。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)