面试题答案
一键面试常用功能特性
- 原子性操作:Redis 支持多种原子性操作,如
SET
、INCR
等。在分布式事务场景中,这些原子操作可确保单个命令的执行具有原子性,不会被其他客户端的操作干扰。例如,对计数器的自增操作INCR key
,即使多个客户端同时执行,也能保证计数结果的正确性。 - 乐观锁机制:通过
WATCH
命令实现乐观锁。可以监控一个或多个键,当EXEC
执行事务时,只有在监控的键没有被其他客户端修改的情况下,事务才会执行成功,否则事务将被放弃。这有助于保证数据一致性,在并发访问同一数据时,减少冲突。 - 事务队列:Redis 事务使用
MULTI
、EXEC
命令来实现。MULTI
用于开启一个事务,将后续的命令放入队列中,EXEC
用于执行队列中的所有命令。这样可以将多个操作组合成一个原子性的事务,要么全部成功执行,要么全部不执行。
实现方式
- 原子性操作实现:Redis 基于单线程模型,其命令本身就是原子性执行的。当客户端发送一个原子操作命令(如
SET
)时,Redis 服务器会立即执行该命令,不会被其他命令打断,从而保证了原子性。 - 乐观锁实现:
- 客户端使用
WATCH key1 key2...
命令监控需要操作的键。 - 执行
MULTI
开启事务。 - 向事务队列中添加操作命令,如
SET key value
等。 - 执行
EXEC
尝试提交事务。如果在WATCH
之后,EXEC
之前,被监控的键被其他客户端修改,EXEC
将返回nil
,表示事务执行失败,客户端需要重新执行整个过程。
- 客户端使用
- 事务队列实现:
- 客户端发送
MULTI
命令,Redis 服务器进入事务状态,后续的命令不会立即执行,而是被放入事务队列。 - 客户端将需要在事务中执行的命令依次发送给 Redis 服务器,如
SET key1 value1
、INCR key2
等。 - 最后客户端发送
EXEC
命令,Redis 服务器会按顺序执行事务队列中的所有命令,实现事务的原子性执行。如果在EXEC
之前发送DISCARD
命令,则会取消事务,清空事务队列。
- 客户端发送