阅读 74

redis事务使用场景,redis协议格式

前言Redis作为一种非关系数据库,具有内存、单线程、持久化支持、高速读写速度,根据支持多种数据类型、支持本机集群等特点被广泛应用。 该博客主要介绍Redis事务与关系数据库(如MySQL )之间的差异。

Redis事务Redis事务和MySQL事务一样,可以在一个事务中执行多个命令。 命令在事务执行时按顺序执行。 MULTI命令指示事务的开始,而EXEC命令指示事务中的所有命令开始执行。 MULTI命令和EXEC命令将一个事务的过程分为两个阶段,MULTI命令打开组队阶段,组队阶段主要是将指令依次发送到缓冲队列; EXEC命令打开执行阶段,从缓冲队列中检索命令并执行。

在组队阶段,其他客户端的指令会影响该事务中指令操作的key。 在组队之前,WATCH命令接收一个或多个key以确定key的值是否已改变,并在一个key的值改变时中断事务的所有指令。 此外,如果在组队阶段发生错误,Redis将中断事务的所有指令。

执行EXEC命令将使事务进入执行阶段,无法插入来自外部其他客户端的命令,从而无法影响事务操作的结果。 如果其他客户端无法插入事务的许多命令,则不会影响事务操作的结果,因为Redis服务器端的处理请求是单线程的。 在处理此事务的过程中,服务器端不能并行执行其他命令,也不能影响事务操作的结果。 即使您使用的是Redis群集,Redis也会根据事务命令操作的key值将命令请求分配给相应的服务器,Redis服务端也会在不同的计算机上以单线程处理请求,并在事务执行过程中通过命令的这意味着Redis事务在执行过程中不会因某些命令失败而发生事务回滚操作。 例如,一个事务包含a、b、c、d四个指令,在执行中依次被执行,执行a、b后,在c的执行中发生错误时,跳过指令c继续执行d的指令,事务结束

Redis命令MULTI开启组队阶段。

EXEC打开执行阶段。

DISCARD命令只能在组队阶段使用。

WATCH用于在事务开始之前实现对key的侦听,并防止其他命令修改key。 这个机制其实相当于乐观锁定。 因为数据存储在内存中,所以不需要进行耗时的I/O操作,实际上事务可以立即执行。 Redis乐观地认为我不需要上锁,用WATCH命令检测。 如果数据不幸发生变更,我会进行补偿,将变更后的消息扔给用户程序进行处理。

事务处理应用方案根据其特性,Redis命令必须在同一个批处理中执行才能应用于一组命令,并且一组命令必须在执行过程中不插入到其他命令中。 比如商品秒杀。

Redis事务与常规关系数据库事务之间的差异事务一般包括事务的四个特性(ACID )。 这里从事务特性的角度分析了Redis事务和普通关系数据库事务的区别。

事务特性(ACID )原子性(Atomicity):事务的原子性意味着事物是最小的执行单位,不允许分割。 事务中的一系列操作要么全部执行,要么全部不执行。

一致性(Consistency):提交事物只会将数据库状态从一种一致的状态转换为另一种一致的状态。 换句话说,由事务的一系列操作中的中间操作引起的中间不一致状态对其他事务来说是不可见的。 一致性状态意味着多个事务访问的数据库的数据和数据结构是一致的。

隔离性(Isolation):事务的独立性意味着并发事务在运行过程中不会相互影响,对数据库的影响与串行运行时的影响相同。

持久性(Durability):个事务提交后。 对数据库中数据的更改是永久性的,如果数据库发生故障,提交更改不会丢失。

事务特性的区分分析原子性分析:我们先看看Redis是否具有原子性。 首先,Redis 不支持事务回滚操作。 Redis事务在组队阶段如果有任何命令错误,事务将放弃事务中的所有命令; 但是,在实际执行阶段,即使事务内的某个指令执行错误,也不影响其他指令,放弃错误的指令,照常执行其他指令,意味着Redis无论是否执行原子事务内的指令都不执行从这个角度来看,Redis事务就像批处理操作。 Redis在组队阶段检查命令,对于错误的命令放弃事务的执行,但即使程序员自身的逻辑问题导致事务的某个命令在执行阶段被废弃,其他命令也会同样执行,最终

隔离性分析:Redis是单线程处理请求,原是串行执行指令,具有最高隔离级别,因此自然具有隔离性。 其他客户端的命令不能在Redis事务运行时插入,也不能影响事务的执行。

持久性分析:Redis与Memcached的区别之一是Redis支持持久化,而Redis支持两种持久化机制:快照(RDB )和AOF ()

is也可以设置为不进行持久化)。RDB的机制是每隔一段时间将内存中的数据以快照的方式存储到磁盘dump.rdb文件中;而AOF是每当有写命令执行时,都将写命令写入磁盘的appendonly.aof文件中(也可以设置为每隔一秒将写命令写入文件),以便机器重启时通过写命令再将数据更新到内存中,AOF方式持久化的实时性更好。以此看来Redis事务其实是具有持久性的,若它使用的是AOF方式的每当有写命令,都将命令写入磁盘文件,可以保证事务的持久性。


一致性分析: Redis单线程处理请求以及Redis事务在执行时不允许别的命令插入的特点就决定了事务中间操作导致的中间一致性状态不会被其它事务所看到,且Redis可在机器宕机后通过持久化的文件恢复到一致性状态,从这些角度看,Redis事务貌似具有一致性。但Redis不支持事务回滚,意味着它很可能导致现实意义中的不一致性,例如常见的例子银行转账,账号A给B转账100,命令有两条,分别是账号A减去100和账号B加上100,若第一条命令出错,而第二条命令正常执行,就导致了不一致性。其实Redis为了保持简洁和效率,放弃了事务回滚,也就放弃了原子性和一致性,因为事务回滚主要是在命令出错时保持数据的一致性,而在Redis中,命令出错主要是编程人员使用错误,而这点应该在开发中被发现,而不是在使用过程中,因此Redis认为我不需要为你的错误买单,Redis放弃了事务回滚的机制。因此Redis不具有传统事务的一致性。

Redis常用来做缓存而不是真正意义上的数据库,不是用来永久存储数据,因此Redis的很多设计理念与普通关系型数据库并不一致,Redis事务为了简洁和快速抛弃了事务回滚,也就同时抛弃了原子性和一致性,事务操作更像是一个批量操作了,只是在批量操作过程中不允许别的事务或者命令加塞,插入进来。


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐