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