MST

星途 面试题库

面试题:Redis脚本中如何处理简单场景下的数据一致性维护

假设你正在使用Redis脚本对多个键值对进行操作,这些操作涉及到数据的读取、修改和写入。在简单场景下,例如只是对几个相关联的计数器进行同步增减,你会怎样编写Redis脚本以确保数据的一致性?请简述思路并给出大致的脚本框架。
16.9万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 使用Lua脚本在Redis中执行操作,因为Lua脚本在Redis中是原子执行的,能保证数据一致性。
  2. 脚本接收键名和要增减的数值作为参数。
  3. 在脚本中读取当前计数器的值,进行增减操作后再写回。

大致脚本框架(Lua语言)

-- 接收键名和增减数值作为参数
local key1 = KEYS[1]
local key2 = KEYS[2]
local increment = ARGV[1]

-- 获取当前计数器的值
local value1 = redis.call('GET', key1)
local value2 = redis.call('GET', key2)

-- 如果键不存在,初始化为0
if value1 == false then
    value1 = 0
end
if value2 == false then
    value2 = 0
end

-- 进行增减操作
value1 = value1 + increment
value2 = value2 + increment

-- 写回新值
redis.call('SET', key1, value1)
redis.call('SET', key2, value2)

-- 返回结果(可根据需求调整)
return {value1, value2}

在Redis客户端中调用该脚本时,示例代码(以Python的redis - py库为例):

import redis

r = redis.Redis(host='localhost', port=6379, db = 0)
script = """
local key1 = KEYS[1]
local key2 = KEYS[2]
local increment = ARGV[1]
local value1 = redis.call('GET', key1)
local value2 = redis.call('GET', key2)
if value1 == false then
    value1 = 0
end
if value2 == false then
    value2 = 0
end
value1 = value1 + increment
value2 = value2 + increment
redis.call('SET', key1, value1)
redis.call('SET', key2, value2)
return {value1, value2}
"""
sha = r.script_load(script)
result = r.evalsha(sha, 2, 'counter1', 'counter2', 1)
print(result)