事务

(1)Redis事务 支持隔离性

Redis实现事务的隔离性,需要通过watch命令来支持事务隔离性。Watch的原理是,在事务执行前,监控一个或者多个键的变化时,当事务调用EXEC命令执行时,WATCH机制会先检查监控的键是否被其它客户端修改了。如果修改了监听的值,就放弃事务执行,避免事务的隔离性被破坏。

(2)Redis事务 分情况支持原子性

  • 情况一:执行事务在入队时就报错,那么Redis会放弃事务执行,从而保证事务原子性。
  • 情况二:命令在入队时没报错,但是实际执行时却报错,无法保证事务原子性。

(3)Redis事务 支持一致性

(4)Redis事务 不支持持久性

Redis的事务无法支持持久性,如果Redis使用了RDB模式,一个事务执行后,当下一次的RDB快照还未执行前,Redis发生了实例宕机,那么这种情况下,事务修改的数据是无法保证持久化的,如果Redis采用AOF模式,如论持久化配置为no、everysec和always都可能会存在数据丢失,所以,不管 Redis采用那种持久化模式,事务的持久性都无法支持。


lua脚本

支持原子操作(指的是中间不会被其他请求插入)。Redis会将整个脚本作为一个整体执行,中间不会被其他请求插入。因此在脚本运行过程中无需担心会出现竞态条件,无需使用事务。

流程控制。例如:得到key=age1的数据,如果该数据存在且该数据为100,那么删掉该数据,否则不做操作。这类就只有使用lua。

减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。

复用。客户端发送的脚本会永久存在redis中,这样其他客户端可以复用这一脚本,而不需要使用代码完成相同的逻辑。

pipeline

仅为多个命令可以只用一次网络读写。