实时查询“罢工”了?如何用Redis的Lua脚本“重启”?

🔥关注墨瑾轩,带你探索编程的奥秘!🚀
🔥超萌技术攻略,轻松晋级编程高手🚀
🔥技术宝库已备好,就等你来挖掘🚀
🔥订阅墨瑾轩,智趣学习不孤单🚀
🔥即刻启航,编程之旅更有趣🚀

在这里插入图片描述在这里插入图片描述

用Redis的Lua脚本“热重启”实时查询

一、实时查询的“罢工”真相

1. 什么是“实时查询”?
  • 实时查询:用户输入关键词,系统立即返回结果(比如搜索框的自动补全)。
  • 常见问题:高并发下缓存穿透、缓存雪崩、数据库压垮……
2. “罢工”的症状
  • 缓存穿透:查不存在的数据,直接打到数据库;
  • 缓存雪崩:大量缓存同时失效,数据库瞬间崩溃;
  • 数据库挂掉:连Redis都扛不住,系统直接“宕机”;
3. 传统重启的“坑”
  • 硬重启redis-cli shutdown + redis-server,但会导致:
    • 客户端断连;
    • 数据丢失(未持久化的数据);
    • 服务中断(几十秒到几分钟);

二、Lua脚本的“热重启”魔法

1. Lua脚本的“原子性”优势
-- Lua脚本:热重启实时查询服务
-- 作者:墨瑾轩
-- 用途:在不停止Redis服务的情况下,重置缓存状态并刷新数据

local cache_key = KEYS[1]          -- 缓存键名(比如"search:query:history")
local db_key_prefix = KEYS[2]     -- 数据库键前缀(比如"user:")
local max_cache_size = tonumber(ARGV[1])  -- 缓存最大容量(比如10000)
local expire_seconds = tonumber(ARGV[2])  -- 缓存过期时间(比如3600)

-- 1. 清空当前缓存
redis.call("DEL", cache_key)

-- 2. 从数据库加载数据并重新填充缓存
local db_keys = redis.call("KEYS", db_key_prefix .. "*")
for i, key in ipairs(db_keys) do
    local user_data = redis.call("GET", key)
    if user_data then
        -- 将用户数据写入缓存(使用哈希结构)
        redis.call("HSET", cache_key, key, user_data)
    end
end

-- 3. 设置缓存过期时间(防止雪崩)
redis.call("EXPIRE", cache_key, expire_seconds)

-- 4. 返回操作状态
return {
   
    "success", #db_keys .. 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨瑾轩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值