当前位置: 首页 > news >正文

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

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

大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊Redis缓存和分布式锁这个重要话题。作为一个全栈开发者,Redis是日常开发中不可或缺的工具。今天就来分享一下Redis缓存和分布式锁的实战经验。

Redis概述

Redis特性

特性说明
内存存储高性能读写
持久化RDB和AOF
数据结构字符串、哈希、列表、集合、有序集合
分布式支持集群模式

应用场景

缓存 → 减轻数据库压力 会话存储 → 用户登录状态 分布式锁 → 保证并发安全 消息队列 → 简单的任务队列

Redis缓存

基本操作

import redis r = redis.Redis(host='localhost', port=6379, db=0) # 设置缓存 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 = f'user:{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(f'user:{user_id}')

分布式锁

基本实现

def acquire_lock(lock_key, timeout=10): """获取分布式锁""" identifier = str(uuid.uuid4()) end = time.time() + timeout while time.time() < end: if r.set(lock_key, identifier, nx=True, ex=timeout): 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 = f'order:{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, limit=100, window=3600): """限流函数""" key = f'rate_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 = f'user:{user_id}' # 检查缓存 cached = r.get(cache_key) if cached == b'null': 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 user

2. 缓存雪崩处理

# 使用随机过期时间,避免同时失效 def set_cache(key, value, base_ttl=3600): # 添加随机偏移,范围是基础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 · 缓存 · 分布式锁

http://www.jsqmd.com/news/899834/

相关文章:

  • CUDA编程:Shared Memory Bank Conflict 与 Padding 优化
  • 为内部知识库问答系统接入Taotoken提供多模型后备支持
  • 2026年 工业热电偶十大品牌推荐榜单:铠装/K型/装配式/手持式/铂铑热电偶源头厂家与高精度测温方案深度解析 - 品牌企业推荐师(官方)
  • 终极免费文档下载脚本指南:如何一键获取百度文库等30+平台资源
  • 从数据手册到实战:剖析74HC4052模拟开关的选型与电路设计
  • 2026年 背景板/气球/桁架/注水旗租赁服务排行榜:快展搭建与舞台活动的专业口碑精选 - 品牌企业推荐师(官方)
  • 如何用Python自动化COMSOL仿真:MPh完整指南
  • 技术写作:如何写出高质量技术文章
  • 使用taotoken聚合api为个人项目构建智能问答助手
  • 融合聚焦深度与单目深度估计:测试时优化提升度量深度精度
  • IntelliJ IDEA 2026.2 EAP 启动:平衡 AI 与传统开发,多维度功能升级
  • 都在说油车不行,可是经销商倒闭、夸张的1亿订单都与电车有关!
  • C语言--day20
  • 观察大模型API调用成本,Taotoken用量看板如何助力企业预算管理
  • 深度指南:2026现阶段河北地区专业阳光房实力厂商选择全解析 - 2026年企业资讯
  • 维普4月升级降AI失效?2026年5月仍有效的4款降AI软件实测
  • 对比自行维护多个API与使用Taotoken聚合在运维上的差异
  • 靠谱的17-4Ph不锈钢厂商推荐:高硬度耐磨不锈钢厂商联系方式 - 品牌2025
  • 实测HS0038红外接收头:3.3V和5V都能用,STM32F103直接驱动避坑指南
  • AI预约聊天机器人实战:从自然语言理解到GDPR合规部署
  • SAP FI 深度解析:OBCY配置下的会计凭证行项目合并实战与风险规避
  • 小白/程序员必备:收藏!轻松学会使用大模型进行数据验证
  • ChatGPT企业客户画像生成实录(脱敏版):金融/教育/医疗三大行业差异化建模路径对比
  • 物流系统如何打通信息孤岛?哲盟软件系统:一键打通内外部数据壁垒
  • 仿生六足机器人分层网络控制:从CPG原理到工程实现
  • 通过Hermes Agent自定义提供商接入Taotoken实现多工具链集成
  • 2026年Q2中央供料系统实力厂家选哪家?这份深度解析给你答案 - 2026年企业资讯
  • 17-共享发布与用户协作:平台如何让资产跨人流转
  • Ubuntu新手必看:除了Ctrl+C/V,Terminator里这些隐藏快捷键能让你效率翻倍
  • 压力变送器哪个牌子质量好?广东犸力数字补偿技术强,国产靠谱且性价比高 - 品牌速递