面试题答案
一键面试思路
- 使用Lua脚本在Redis中执行操作,因为Lua脚本在Redis中是原子执行的,能保证数据一致性。
- 脚本接收键名和要增减的数值作为参数。
- 在脚本中读取当前计数器的值,进行增减操作后再写回。
大致脚本框架(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)