数据库技术:Redis缓存与分布式锁

数据库技术:Redis缓存与分布式锁 数据库技术Redis缓存与分布式锁大家好我是欧阳瑞Rich Own。今天想和大家聊聊Redis缓存和分布式锁这个重要话题。作为一个全栈开发者Redis是日常开发中不可或缺的工具。今天就来分享一下Redis缓存和分布式锁的实战经验。Redis概述Redis特性特性说明内存存储高性能读写持久化RDB和AOF数据结构字符串、哈希、列表、集合、有序集合分布式支持集群模式应用场景缓存 → 减轻数据库压力 会话存储 → 用户登录状态 分布式锁 → 保证并发安全 消息队列 → 简单的任务队列Redis缓存基本操作import redis r redis.Redis(hostlocalhost, port6379, db0) # 设置缓存 r.set(user:1, {name: Alice, age: 30}) # 获取缓存 data r.get(user:1) print(data.decode()) # 设置过期时间 r.setex(session:abc123, 3600, user_id:1) # 删除缓存 r.delete(user:1)缓存策略def get_user(user_id): # 先查缓存 cache_key fuser:{user_id} cached r.get(cache_key) if cached: return json.loads(cached.decode()) # 缓存不存在查数据库 user db.query(SELECT * FROM users WHERE id %s, (user_id,)) if user: # 设置缓存过期时间1小时 r.setex(cache_key, 3600, json.dumps(user)) return user缓存更新def update_user(user_id, data): # 更新数据库 db.query(UPDATE users SET name %s WHERE id %s, (data[name], user_id)) # 失效缓存 r.delete(fuser:{user_id})分布式锁基本实现def acquire_lock(lock_key, timeout10): 获取分布式锁 identifier str(uuid.uuid4()) end time.time() timeout while time.time() end: if r.set(lock_key, identifier, nxTrue, extimeout): return identifier time.sleep(0.001) return None def release_lock(lock_key, identifier): 释放分布式锁 pipe r.pipeline() pipe.watch(lock_key) if r.get(lock_key).decode() identifier: pipe.multi() pipe.delete(lock_key) pipe.execute() return True pipe.unwatch() return False使用示例def process_order(order_id): lock_key forder:{order_id}:lock identifier acquire_lock(lock_key) if not identifier: raise Exception(操作过于频繁请稍后重试) try: # 处理订单逻辑 order get_order(order_id) update_inventory(order) send_notification(order) finally: release_lock(lock_key, identifier)实战案例限流def rate_limit(user_id, limit100, window3600): 限流函数 key frate_limit:{user_id} current r.incr(key) if current 1: r.expire(key, window) if current limit: return False return True # 使用 if not rate_limit(user123): raise Exception(请求过于频繁)最佳实践1. 缓存穿透处理def get_user(user_id): cache_key fuser:{user_id} # 检查缓存 cached r.get(cache_key) if cached bnull: return None if cached: return json.loads(cached.decode()) # 查询数据库 user db.query(SELECT * FROM users WHERE id %s, (user_id,)) if user: r.setex(cache_key, 3600, json.dumps(user)) else: # 设置空值防止缓存穿透 r.setex(cache_key, 60, null) return user2. 缓存雪崩处理# 使用随机过期时间避免同时失效 def set_cache(key, value, base_ttl3600): # 添加随机偏移范围是基础TTL的10%-20% jitter random.randint(int(base_ttl * 0.1), int(base_ttl * 0.2)) ttl base_ttl jitter r.setex(key, ttl, value)总结Redis是一个强大的工具可以用于缓存、分布式锁、限流等多种场景。通过合理使用Redis可以显著提高应用性能和可靠性。我的鬃狮蜥Hash对缓存也有自己的理解——它总是记住蟋蟀经常出现的位置这也许就是自然界的缓存机制吧如果你对Redis有任何问题欢迎留言交流我是欧阳瑞极客之路永无止境技术栈Redis · 缓存 · 分布式锁