Redis有哪些操作方式可以保证原子性?若上层用多线程,而Redis的操作是多种操作,怎么保证多个操作的原子性呢?[面试7.0]

原生的原子命令:
INCR/DECR,这两个操作是将读,自增(自减),写作为一个原子进行执行的,单线程保证了原子性
单机锁或分布式锁:
锁是常用来保证原子性的
事务监听:
每个客户端监听这个key,事务更新后发现key被修改就拒绝再执行
原理: Redis会维护一个事务队列,当一个客户端执行完后,会从队列剔除该客户端,并将其他客户端标记为客户端脏数据状态(即标记为CLIENT_DIRTY_CAS),这样客户端监听时会对这种状态拒绝执行,从而保证了只有单个客户端执行成功(原子性)
lua脚本:
redis将lua脚本作为一个整体执行,执行时不会被其他命令打断,不存在竞态问题来保证原子执行的

怎么理解Redis事务?[面试7.0]

Redis事务分为开启,命令入队,执行三个步骤
开启: 开启事务
命令入队: 将待执行命令放入事务队列
执行: 要么全部执行,要么全部不执行
注意: Redis事务保证是否执行,但不保证是否单个队列元素命令是否执行成功,即Redis事务不保证整个事务的原子性,但保证单个元素命令执行的原子性,一般情况下Redis只有在错误语法时,单条命令才会失败

Redis+Lua脚本是怎样保证原子性的?[面试7.0]

Redis的Lua脚本是将命令聚合一个来执行,若客户端将命令发到服务端执行,发送成功后只要没有语法错误,服务端能保证所有命令都执行,但如果脚本中某条命令有语法错误,也是不能保证整个命令的原子操作的