互斥重建示例
互斥重建示例
def get_hot(key):
v = redis.get(key)
if v is not None:
return v
# 抢锁重建:只放一个请求去查库
if redis.set(key + ':lock', '1', nx=True, px=3000):
try:
row = db.query_hot(key)
redis.set(key, row, ex=300)
return row
finally:
redis.delete(key + ':lock')
# 没抢到锁:短暂重试或返回降级值
return redis.get(key) or fallback(key)| 互斥锁 | SET NX PX 抢锁 + 双检 + 释放 |
|---|---|
| 逻辑过期 | value 内嵌过期时间,过期后异步刷新 |
| 永不过期 | 运营后台上线时主动刷新(热点白名单) |
互斥重建要加「自旋上限与超时」:锁持有者超时未完成时其它请求要有兜底路径,避免整体卡死。