Redis事务

一、redis事务

Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。

redis> MULTI
OK
redis> SET "name" "Practical Common Lisp"
QUEUED
redis> GET "name"
QUEUED
redis> SET "author" "Peter Seibel"
QUEUED
redis> GET "author"
QUEUED
redis> EXEC
1) OK
2) "Practical Common Lisp"
3) OK
4) "Peter Seibel"

二、MULTI命令

当MULTI命令执行时,会将redisClient的flags属性更改为REDIS_MULTI,表示客户端切换为事务状态,当一个客户端处于非事务状态时,其发送的命令会立即被服务器执行;如果客户端处于事务状态,那么它发送的命令就会放到一个事务队列中,直到客户端命令为EXEC、DISCARD、WATCH、MULTI等才会执行

三、WATCH命令

WATCH命令是一个乐观锁,它可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话,服务器将拒绝执行事务,并向客户端返回代表事务执行失败的空回复
Redis事务_第1张图片
事务的完整性被破坏,拒绝执行
每个Redis数据库都保存着一个watched_keys字典,这个字典的键是某个被WATCH命令监视的数据库键,而字典的值则是一个链表,链表中记录了所有监视相应数据库键的客户端

typedef struct redisDb {
    // ...
    //正在被WATCH命令监视的键
    dict *watched_keys;
    // ...
} redisDb;

Redis事务_第2张图片
当客户端执行修改数据库命令时,会去检查watched_keys字典对应的key的客户端列表里有没有包含自己,如果包含了,会将自身客户端的flags属性更改为REDIS_DIRTY_CAS,表示事务的完整性已经被破坏

三、lua脚本

事务是多条命令希望保持原子性,lua脚本常用来执行事务性操作

你可能感兴趣的:(redis)