MST

星途 面试题库

面试题:缓存设计之Lua脚本在Redis缓存操作优化

在高并发场景下,Redis的事务可能存在性能瓶颈。请阐述Lua脚本在Redis缓存操作中如何优化这种情况。假设你需要在缓存中实现一个复杂的操作:判断一个列表长度是否大于10,如果大于10则删除列表的前5个元素,并将剩余元素按顺序插入到另一个集合中,用Lua脚本实现该操作,并说明相比单纯使用Redis事务的优势。
32.7万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

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事务的优势

  1. 原子性:Redis事务和Lua脚本都具有原子性,但是Lua脚本在编写复杂逻辑时更灵活。对于上述复杂操作,使用事务需要多条命令,而Lua脚本可以在一个原子操作中完成,避免了在事务执行过程中其他客户端对数据的干扰。
  2. 减少网络开销:使用Redis事务,需要将多条命令发送到服务器,会产生多次网络交互。而Lua脚本是一次性发送到Redis服务器执行,大大减少了网络开销,在高并发场景下能显著提升性能。
  3. 代码简洁性:Lua脚本将复杂操作封装在一个脚本中,代码结构更清晰,相比多个Redis命令组合的事务更容易维护和理解。