面试题答案
一键面试- 单线程模型:
- Redis 采用单线程模型处理命令。这意味着在同一时间,只会有一个命令被执行。多个客户端的读写操作会被 Redis 按顺序串行化处理。例如,客户端 A 对 SDS 进行写操作,客户端 B 进行读操作,在 Redis 单线程中,这两个操作会依次执行,不会出现读写冲突导致的数据错误。这从根本上避免了多线程环境下常见的竞态条件,从而保证了数据一致性。
- 写时复制(COW,Copy - On - Write):
- 当多个客户端同时读取同一个 SDS 数据时,它们共享该数据的内存空间。只有当其中一个客户端需要对数据进行修改时,Redis 才会复制一份数据,修改操作在新复制的数据上进行。比如多个客户端都在读取一个 SDS 存储的字符串,此时客户端 A 要对该字符串进行追加操作,Redis 会复制当前的 SDS 结构,然后在新的副本上执行追加,而其他客户端读取的还是原来未修改的数据。这保证了读操作不受写操作的影响,维护了数据在高并发读写场景下的一致性。
- 事务机制:
- Redis 支持事务,通过
MULTI
、EXEC
等命令实现。客户端可以将多个操作组装成一个事务,Redis 会保证事务中的所有命令要么全部执行成功,要么全部不执行。例如,客户端想要对一个 SDS 进行先读取、再根据读取结果修改的操作,可以将这两个操作放在一个事务中。在事务执行期间,不会有其他客户端的操作干扰,从而保证了这一系列操作的原子性,也就保证了数据一致性。
- Redis 支持事务,通过
- 乐观锁机制(基于
WATCH
命令):- Redis 的
WATCH
命令可以监控一个或多个键。当使用WATCH
监控一个包含 SDS 的键后,在执行事务EXEC
之前,如果被监控的键被其他客户端修改,当前事务将不会执行。例如,客户端 A 想要修改一个 SDS 数据,它先使用WATCH
监控该键,然后获取数据并进行计算得到新值。在执行EXEC
提交事务时,如果该键的值在这期间被客户端 B 修改了,客户端 A 的事务就会失败,客户端 A 可以重新获取数据并再次尝试修改,以此保证数据一致性。
- Redis 的