JAVA全系列 教程
3762个小节阅读:7095.5k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
缓存风暴伪代码:
xxxxxxxxxx
-- 查询共享内存
local value = get_from_cache(key)
if not value then
--查询数据库 或者 请求请求tomcat php
value = query_db(sql)
set_to_cache(value, timeout = 60)
end
return value
在 OpenResty 中,我们可以这样来实现。首先,使用
ngx.timer.every
来创建一个定时任务,每分钟运行一次,去 MySQL 数据库中获取最新的数据,并放入共享字典中:
xxxxxxxxxx
local function query_db(premature, sql)
local value = query_db(sql)
set_to_cache(value, timeout = 60)
end
local ok, err = ngx.timer.every(60, query_db, sql)
使用 OpenResty 中的
lua-resty-lock
这个库来加锁,这样的担心就大可不必了。lua-resty-lock
是 OpenResty 自带的 resty 库,它底层是基于共享字典,提供非阻塞的 lock API。
xxxxxxxxxx
resty --shdict='locks 1m' -e 'local resty_lock = require "resty.lock"
local lock, err = resty_lock:new("locks")
local elapsed, err = lock:lock("my_key")
-- query db and update cache
local ok, err = lock:unlock()
ngx.say("unlock: ", ok)'
在上面
lua-resty-lock
的实现中,你需要自己来处理加锁、解锁、获取过期数据、重试、异常处理等各种问题,还是相当繁琐的。所以,这里我再给你介绍一个简单的封装:lua-resty-shcache
。
xxxxxxxxxx
local shcache = require("shcache")
local my_cache_table = shcache:new(
ngx.shared.cache_dict
{ external_lookup = lookup,
encode = cmsgpack.pack,
decode = cmsgpack.decode,
},
{ positive_ttl = 10, -- cache good data for 10s
negative_ttl = 3, -- cache failed lookup for 3s
name = 'my_cache', -- "named" cache, useful for debug / report
}
)
local my_table, from_cache = my_cache_table:load(key)