事务
(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
仅为多个命令可以只用一次网络读写。