在高并发场景下,缓存失效时间的静态设置往往无法应对复杂的用户访问模式。本文分享一种基于用户行为与访问模式动态调整缓存失效时间的方案。
问题背景
传统做法是为所有用户设置固定的缓存过期时间(如30分钟),但实际业务中,活跃用户的访问频率远高于非活跃用户,这种统一策略会造成资源浪费或数据不一致。
解决方案
我们采用基于用户行为的动态失效时间调整机制,核心思路是:
- 用户行为识别:通过埋点统计用户访问频率、访问时段等特征
- 失效时间计算:根据用户行为模式动态计算过期时间
- 缓存更新策略:结合双写机制确保数据一致性
实现代码示例
class DynamicCache:
def __init__(self):
self.user_behavior = {}
def get_cache_ttl(self, user_id, page):
# 获取用户行为统计
behavior = self.user_behavior.get(user_id, {})
access_count = behavior.get('access_count', 0)
# 根据访问频率动态计算过期时间
if access_count > 100:
return 300 # 高频用户5分钟
elif access_count > 50:
return 600 # 中频用户10分钟
else:
return 1800 # 低频用户30分钟
def get_data(self, user_id, key):
# 获取缓存数据
cache_key = f"user:{user_id}:{key}"
data = redis.get(cache_key)
if not data:
# 缓存未命中,从数据库获取
data = self.fetch_from_db(user_id, key)
ttl = self.get_cache_ttl(user_id, key)
redis.setex(cache_key, ttl, json.dumps(data))
return json.loads(data)
def update_user_behavior(self, user_id, page):
# 更新用户行为统计
if user_id not in self.user_behavior:
self.user_behavior[user_id] = {}
self.user_behavior[user_id]['access_count'] = \
self.user_behavior[user_id].get('access_count', 0) + 1
复现步骤
- 模拟不同用户访问模式(高频、中频、低频)
- 观察缓存失效时间的动态变化
- 验证数据一致性与性能表现
该方案在实际应用中有效平衡了缓存命中率与数据新鲜度,显著提升了系统整体性能。

讨论