面试题答案
一键面试Lua脚本实现
-- 获取列表长度
local listLen = redis.call('LLEN', KEYS[1])
if listLen > 10 then
-- 删除列表前5个元素
local removed = redis.call('LTRIM', KEYS[1], 5, -1)
-- 将剩余元素插入到集合中
for _, v in ipairs(removed) do
redis.call('SADD', KEYS[2], v)
end
end
将上述脚本保存为文件,例如 operation.lua
,在Redis客户端中可以通过以下命令调用:
redis-cli --eval operation.lua key1 key2
这里 key1
是列表的键,key2
是集合的键。
相比Redis事务的优势
- 原子性:Redis事务和Lua脚本都具有原子性,但是Lua脚本在编写复杂逻辑时更灵活。对于上述复杂操作,使用事务需要多条命令,而Lua脚本可以在一个原子操作中完成,避免了在事务执行过程中其他客户端对数据的干扰。
- 减少网络开销:使用Redis事务,需要将多条命令发送到服务器,会产生多次网络交互。而Lua脚本是一次性发送到Redis服务器执行,大大减少了网络开销,在高并发场景下能显著提升性能。
- 代码简洁性:Lua脚本将复杂操作封装在一个脚本中,代码结构更清晰,相比多个Redis命令组合的事务更容易维护和理解。