Python利用singleflight解决缓存穿透问题
通常获取缓存的方法
data = cache.get(key)
if not data:
data = get_data()
cache.set(key, data)
return data
弊端
在这种模式下,在高并发的场景下,很有可能出现缓存击穿的问题。
解决方案
-
加锁
data = cache.get(key) if not data: # 加锁 lock.lock() data = get_data() cache.set(key, data) # 释放锁 lock.release() return data
这种加锁方案是不行的。这种方案下,虽热避免了并发地加载数据,保证数据库不会被打死,但依然没有解决重复操作的问题。而且这种方案下,大量请求串行化操作,会加大系统延迟。
- try-lock模式
data = cache.get(key) #step1
if not data:
locked = lock.try_lock() #非阻塞
if locked:
data = load_data() #step2
cache.