首页 > 数据库 >Redis-独立功能-事务

Redis-独立功能-事务

时间:2023-01-12 17:48:14浏览次数:42  
标签:事务 EXEC Redis 功能 命令 服务器 执行 客户端

事务

事务的实现

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

事务首先以一个MULTI命令为开始,接着将多个命令放入事务当中,最后由EXEC命令将这个事务提交(commit)给服务器执行。

MULTI命令可以将执行该命令的客户端从非事务状态切换至事务状态,这一切换是通过在客户端状态的flags属性中打开REDIS_MULTI标识来完成的。

当一个客户端切换到事务状态之后,服务器会根据这个客户端发来的不同命令执行不同的操作:

  • 如果客户端发送的命令为EXEC、DISCARD、WATCH、MULTI四个命令的其中一个,那么服务器立即执行这个命令。
  • 如果客户端发送的命令是EXEC、DISCARD、WATCH、MULTI四个命令以外的其他命令,那么服务器并不立即执行这个命令,而是将这个命令放入一个事务队列里面,然后向客户端返回QUEUED回复。

当一个处于事务状态的客户端向服务器发送EXEC命令时,这个EXEC命令将立即被服务器执行。服务器会遍历这个客户端的事务队列,执行队列中保存的所有命令,最后将执行命令所得的结果全部返回给客户端。

WATCH命令的实现

WATCH命令是一个乐观锁(optimistic locking),它可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话,服务器将拒绝执行事务,并向客户端返回代表事务执行失败的空回复。

每个Redis数据库都保存着一个watched_keys字典,这个字典的键是某个被WATCH命令监视的数据库键,而字典的值则是一个链表,链表中记录了所有监视相应数据库键的客户端。

所有对数据库进行修改的命令,比如SET、LPUSH、SADD、ZREM、DEL、FLUSHDB等等,在执行之后都会调用multi.c/touchWatchKey函数对watched_keys字典进行检查,查看是否有客户端正在监视刚刚被命令修改过的数据库键,如果有的话,那么touchWatchKey函数会将监视被修改键的客户端的REDIS_DIRTY_CAS标识打开,表示该客户端的事务安全性已经被破坏。

当服务器接收到一个客户端发来的EXEC命令时,服务器会根据这个客户端是否打开了REDIS_DIRTY_CAS标识来决定是否执行事务:

  • 如果客户端的REDIS_DIRTY_CAS标识已经被打开,那么说明客户端所监视的键当中,至少有一个键已经被修改过了,在这种情况下,客户端提交的事务已经不再安全,所以服务器会拒绝执行客户端提交的事务。
  • 如果客户端的REDIS_DIRTY_CAS标识没有被打开,那么说明客户端监视的所有键都没有被修改过(或者客户端没有监视任何键),事务仍然是安全的,服务器将执行客户端提交的这个事务。

ACID

原子性中,Redis不支持事务回滚机制(rollback)

一致性:Redis事务可能发生错误的情况有命令入队错误、执行错误、停机。入队和执行无错的指令将会被执行(存疑)。

隔离性:Redis使用单线程的方式来执行事务(以及事务队列中的命令),并且服务器保证,在执行事务期间不会对事务进行中断,因此,Redis的事务总是以串行的方式运行的,并且事务也总是具有隔离性的。

耐久性:当服务器运行在AOF持久化模式下,并且appendfsync选项的值为always时,程序总会在执行命令之后调用同步(sync)函数,将命令数据真正地保存到硬盘里面,因此这种配置下的事务是具有耐久性的。当no-appendfsync-on-rewrite选项处于打开状态时,在执行BGSAVE命令或者BGREWRITEAOF命令期间,服务器会暂时停止对AOF文件进行同步,从而尽可能地减少I/O阻塞。但是这样一来,关于“always模式的AOF持久化可以保证事务的耐久性”这一结论将不再成立,因为在服务器停止对AOF文件进行同步期间,事务结果可能会因为停机而丢失。

 

标签:事务,EXEC,Redis,功能,命令,服务器,执行,客户端
From: https://www.cnblogs.com/gcr277/p/17047325.html

相关文章

  • 管理员应了解的 SIEM解决方案七大功能 !
    SIEM解决方案已成为企业网络安全武器库中不可或缺的一部分。但由于SIEM功能过于复杂且架构难以理解,企业往往SIEM的潜在功能。遗憾的是,他们忽视的潜在功能正是解开企业网络合......
  • kafka监听全流程相关代码--从获取到数据到存储(彩民画像功能)
    先建一个PortraitTask1@Component2@Slf4j3publicclassPortraitTaskimplementsStatAble{45privatestaticfinalStringLOCK_ID="sss:portra......
  • 使用redis实现自增序列
    来源:https://www.cnblogs.com/shigj/p/11215262.htmlpublicclassTestService{ @Resource RedisTemplate<String,Object>redisTemplate; publicStringgetI......
  • Redis-独立功能-发布与订阅
    发布与订阅Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者(subscribe......
  • 事务——脏写、脏读、不可重复读、幻读
    脏写(DirtyWrite)如果一个事务修改了另一个未提交事务修改过的数据,那就意味着发生了脏写脏读(DirtyRead)如果一个事务读到了另一个未提交事务修改过的数据,那就意味着......
  • 【一句话】Redis的3中缓存策略
    首先一句话:旁路缓存模式策略:写->写DB,删缓存,读->读cache,没有则读DB,然后更新到缓存读写穿透策略:写->写缓存,然后由缓存系统写DB,读->读cache,没有则将DB写入cache,再读cache异......
  • maya工作常用功能笔记
    maya工作常用功能笔记1.去除命名空间设置2.贴图替换重新指认路径......
  • Redis-多机数据库-集群
    集群Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。Redis服务器在启动时会根据cluster-enabled配置选项是否为y......
  • redis命令清理key
    ###手动清除单个key:redis-cli-h'ipaddr'-p6379-a'passwd'-n0keys'keyName'|xargsredis-cli-h'ipaddr'-p6379-a'passwd'-n0del;或者手动清除单个k......
  • 【深入浅出Seata原理及实战】「入门基础专题」带你透析认识Seata分布式事务服务的原理
    分布式事务的背景随着业务的不断发展,单体架构已经无法满足我们的需求,分布式微服务架构逐渐成为大型互联网平台的首选,但所有使用分布式微服务架构的应用都必须面临一个十分棘......