🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
下面是一个`Redis`服务的数据结构定义: ~~~c typedef struct redisDb { dict *watched_keys; //被 watch 命令监视的 key int id; //Database ID //...省略了其他属性 } redisDb; ~~~ 可以看到,`redisDb`中的`watched_keys`存储了一个字典,这个字典当中的`key`存的就是被监视的`key`,然后字典的值存的就是客户端`id`。每个客户端还有一个标记属性`CLIENT_DIRTY_CAS`,一旦我们执行了一些如`set`、`sadd`等能修改`key`值对应`value`的命令,那么客户端的`CLIENT_DIRTY_CAS`标记属性将会被修改,后面执行事务提交命令`exec`时发现客户端的标记属性被修改过(乐观锁的体现),则会拒绝执行事务。