2021年最新Redis面试题汇总(2) 完整攻略
一、Redis中的事务
Redis的事务分为单条命令事务和多条命令事务。单条命令事务就是事务块中只包含一条命令,而多条命令事务就是在事务块中包含多条命令。
1.1 单条命令事务
在Redis中,单条命令事务使用MULTI、EXEC、WATCH和UNWATCH这四个命令来实现。其中:
- MULTI命令标记一个事务块的开始。
- EXEC命令标记一个事务块的结束,同时将在事务块中执行的命令一次性提交到Redis服务器上执行。
- WATCH命令可以用来监控一个或者多个键,在事务执行之前,监控的键被别的客户端修改,则事务不会执行。
- UNWATCH命令用于取消对一个或多个键的监控。
示例
127.0.0.1:6379> SET balance 100
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCRBY balance 30
QUEUED
127.0.0.1:6379> INCRBY balance 20
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 130
2) (integer) 150
上述示例中,我们通过SET命令设置了一个键值对,接着使用MULTI命令开始事务块,然后连续向Redis服务器上提交了两个INCRBY命令,这两个命令分别将键balance的值增加了30和20。最后,我们使用EXEC命令一次性地将这两个命令提交到Redis服务器上执行。结果表明,事务成功执行,balance的值现在是130。
1.2 多条命令事务
在Redis中执行多条命令事务需要使用的命令仍然是MULTI和EXEC,它们的作用与单条命令事务是一样的。只不过在多条命令事务中可以包含多条命令。
示例
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key1 "value1"
QUEUED
127.0.0.1:6379> SET key2 "value2"
QUEUED
127.0.0.1:6379> SET key3 "value3"
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) OK
上示例中,我们同样使用MULTI命令开始事务块,并提交了三个SET命令,将三个键分别设置为不同的值。最后,我们使用EXEC命令提交事务,并一次性把三个命令提交给Redis服务器上执行。
二、Redis 主从复制
Redis主从复制是Redis提供的一种数据复制方案,它可以实现数据的热备份和负载均衡。在一个主节点的基础上,部署多个从节点可以实现数据的冗余备份,并且利用从节点处理读请求分担主节点的压力。
2.1 主从复制的过程
Redis主节点和从节点之间的复制过程主要分为三个步骤,分别是psync-1、psync-2和psync-3。
- psync-1命令:从节点连接主节点,并发送SYNC命令请求同步数据。
- psync-2命令:主节点接收到SYNC命令请求后,开始做一次全量复制,并且记录每次修改数据的命令。
- psync-3命令:主节点把全量复制完成后的命令记录的偏移量发给从节点,并把每次修改数据的命令发送给从节点执行。
2.2 主从复制的优缺点
2.2.1 优点
- 数据热备份:从节点可以随时备份主节点的数据,确保数据不会丢失。
- 负载均衡:从节点能够处理一部分主节点的读请求,减轻主节点的负担。
- 自动故障恢复:当主节点宕机时,可以通过从节点快速切换到主节点来恢复服务能力。
- 架构扩展:当数据量和请求量增加时,可以通过添加从节点来扩展系统性能。
2.2.2 缺点
- 从节点延迟:从节点与主节点之间存在网络延迟,可能导致从节点的数据不是最新的。
- 无法保证数据一致性:一旦主从复制完成后,从节点上的数据可能会和主节点上的数据存在一段时间的差异,无法保证数据的一致性。
- 容量有限:从节点需要存储与主节点相同的数据,因此从节点的容量是有限的。
- 无法解决单点故障问题:如果主节点宕机,从节点尚未完成晋升操作,那么服务将不会正常工作。
三、Redis持久化
Redis提供了两种持久化方案,即RDB持久化和AOF持久化。
3.1 RDB持久化
RDB持久化是通过将Redis服务器的数据在特定的时间点转储到磁盘上,以达到数据持久化的目的。主要分为手动保存和自动保存两种方式。手动保存需要使用SAVE命令,而自动保存需要使用CONFIG SET命令设置SAVE选项。
示例
127.0.0.1:6379> SAVE
OK
上述示例中,我们使用SAVE命令手动将Redis服务器上的数据转储到磁盘上。
3.2 AOF持久化
AOF持久化是通过将Redis服务器上发生的每个写入操作都追加到一个文件中,以达到数据持久化的目的。主要分为三种模式,分别是everysec、always和no。
示例
127.0.0.1:6379> CONFIG SET appendonly yes
OK
上述示例中,我们使用CONFIG SET命令将Redis服务器的AOF持久化配置修改为开启状态。
四、Redis的应用场景
Redis具有高性能、高并发的特点,常用于以下场景:
- 缓存架构:Redis具有高速缓存处理能力,能够快速缓存数据,减轻后端数据库的压力。
- 计数器:Redis的INCR操作的原子性保证了计数器的准确性。
- 发布/订阅:Redis的发布/订阅功能能够实现消息的异步传递,并且架构简单,易于实现。
- 分布式锁:Redis的SETNX操作能够保证分布式系统中锁的互斥性,避免并发竞争问题。
- 地址共享:Redis的内存共享技术能够实现多进程或者多实例之间的数据共享。
示例
Redis的缓存架构是Redis最常用的应用场景之一。当网站的访问量较高时,会产生大量的读请求,增加了后端数据的压力,此时可以使用Redis作为高速缓存,减轻后端的负担。
例如,我们可以使用下面的代码将Python Flask框架下的视图函数使用Redis作为缓存:
from flask import Flask, jsonify, request
import redis
import time
app = Flask(__name__)
cache = redis.Redis(host='localhost', port=6379)
@app.route('/api')
def api():
key = 'api:' + request.args.get('arg1')
result = cache.get(key)
if result is None:
# 模拟复杂、耗时操作
time.sleep(3)
result = {'msg': 'Hello World!'}
cache.set(key, result, ex=60)
return jsonify(result)
在代码中,我们初始化了一个Redis对象,然后在api视图函数中使用cache.set和cache.get方法读写Redis缓存。当缓存中存在指定的键时,直接从缓存中获取;当缓存中不存在指定的键时,则执行手动的复杂数据处理,并将处理结果保存到缓存中。这样,当后续的请求需要同样的数据时,就可以直接从缓存中获取,避免了每次都要执行相同的耗时操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:2021年最新Redis面试题汇总(2) - Python技术站