Redis事务与watch指令

举报
周杰伦本人 发表于 2022/06/26 14:31:44 2022/06/26
【摘要】 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命令用来监视键,当事务过程中有键被修改的话,这个键对应的监视器就能检测到,然后事务就会提交失败,保证事务一致性。

❤️ 感谢大家

如果你觉得这篇内容对你挺有有帮助的话:

  1. 欢迎关注我❤️,点赞👍🏻,评论🤤,转发🙏
  2. 关注盼盼小课堂,定期为你推送好文,还有群聊不定期抽奖活动,可以畅所欲言,与大神们一起交流,一起学习。
  3. 有不当之处欢迎批评指正。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。