面试题答案
一键面试- 事务处理:
- 当事务中的某个操作因键值类型不匹配报错时,Redis 会继续执行事务中后续的命令,不会自动回滚整个事务。这是因为 Redis 事务的执行是按照命令顺序依次执行,错误命令不会影响其他命令的执行。
- WATCH命令监控状态:
- 一旦事务被提交(EXEC 命令执行),无论事务中的命令执行是否成功,WATCH 命令对键的监控都会被取消。如果事务执行过程中发生错误,WATCH 命令监控状态也不会保持,下次执行事务时若要监控相同键,需重新使用 WATCH 命令。
- 应用层面应对措施:
- 预检查:在开启事务前,先对涉及的键值类型进行检查,确保类型符合预期。例如在使用
SET
命令存储数据时,提前判断要存储的值是否适合目标键的数据类型。可以使用TYPE
命令获取键的类型,如TYPE key
,根据返回结果(如string
、hash
等)进行判断。 - 错误捕获与处理:在应用代码层面,捕获事务执行过程中的错误。比如在 Python 中使用 Redis - py 库时,可以通过
try - except
块捕获异常。如果捕获到错误,可以根据业务需求进行处理,如记录错误日志、进行重试操作或采取补偿措施等,以保证数据一致性。示例代码如下:
- 预检查:在开启事务前,先对涉及的键值类型进行检查,确保类型符合预期。例如在使用
import redis
r = redis.Redis(host='localhost', port=6379, db = 0)
try:
pipe = r.pipeline()
pipe.watch('key1', 'key2')
# 事务操作
pipe.multi()
pipe.set('key1', 'value1')
pipe.get('key2')
pipe.execute()
except redis.RedisError as e:
print(f"事务执行错误: {e}")
# 处理错误逻辑,如重试或补偿操作
- 使用Lua脚本:将事务中的操作封装到Lua脚本中执行。Lua脚本在Redis中是原子性执行的,并且可以进行更复杂的逻辑判断和错误处理。通过
EVAL
或EVALSHA
命令执行Lua脚本。例如:
-- 检查键类型是否为string
if redis.call('TYPE', KEYS[1]) ~='string' then
return {false, "键类型不匹配"}
end
-- 执行事务操作
redis.call('SET', KEYS[1], ARGV[1])
return {true, "操作成功"}
在应用代码中调用该Lua脚本:
import redis
r = redis.Redis(host='localhost', port=6379, db = 0)
script = """
if redis.call('TYPE', KEYS[1]) ~='string' then
return {false, "键类型不匹配"}
end
redis.call('SET', KEYS[1], ARGV[1])
return {true, "操作成功"}
"""
sha = r.script_load(script)
result = r.evalsha(sha, 1, 'key1', 'value1')
print(result)