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

缓存读写代码逻辑的正确姿势

缓存通常用于提高数据访问的效率。一般来说,缓存读取和写入的逻辑遵循“先从缓存取,取不到再从数据库获取并写回缓存”的原则。为了避免多个线程同时修改缓存数据,我们需要加锁来保证数据一致性。

逻辑概述

  1. 读取缓存:缓存命中直接返回。
  2. 缓存未命中:加锁,然后再次读取缓存,缓存命中直接返回。
  3. 缓存还是未命中:执行数据库查询并更新缓存。
  4. 返回数据。

代码大致这样写

public class CacheService
{private readonly ICache _cache;private readonly IDatabase _database;private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);public CacheService(ICache cache, IDatabase database){_cache = cache;_database = database;}public string GetDataFromCacheOrDb(string key){// 1. 尝试从缓存获取数据var data = _cache.Get(key);if (data != null){return data;  // 缓存命中,直接返回}// 2. 如果缓存中没有,尝试加锁并获取数据_semaphore.Wait();try{// 再次检查缓存(可能另一个线程已经填充了缓存)data = _cache.Get(key);if (data != null){return data;  // 缓存命中,直接返回}// 3. 从数据库获取数据data = _database.Query(key);// 4. 将数据写入缓存_cache.Set(key, data);return data;}finally{// 释放锁_semaphore.Release();}}
}

关键是缓存在锁前和锁后都要读一次,为了减少多个线程都在等待锁的情况,同时进来查询数据库写缓存。

分布式情况下会更复杂一些

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

相关文章:

  • Trust is All You Need | 2025通付盾智能体安全进展盘点
  • 洛谷P9869 [NOIP2023] 三值逻辑 题解
  • 一、C++简介与环境配置
  • 【游戏推荐】NBA 2K 欢乐竞技场2 (NBA 2K Playgrounds 2)免安装中文版
  • 金融领域元学习在模型快速适应中的应用
  • 模板元编程调试方法
  • 基于单片机的无线病床呼叫系统设计
  • Python日志记录(Logging)最佳实践
  • 大语言模型微调数据对齐五大核心算法SFT、RLHF、DPO、PPO、GRPO
  • AI Agent在预测分析中的应用
  • 2026年AIR SCI1区TOP,基于三维 Rényi 熵模型的多特征融合与量子混合算法+阿尔茨海默病脑图像分割,深度解析+性能实测
  • C++中的适配器模式变体
  • 5种落地性最强的对齐微调数据集格式
  • GPU thread 概念
  • 大数据清洗:提高数据质量的10个实用技巧
  • 使用XGBoost赢得Kaggle比赛
  • 3年后端老兵亲述大模型转型血泪史:后端开发转行大模型应用开发(附完整大模型学习路线)
  • 深度解析!提示工程行业标准的优化策略
  • 基于深度学习的水下鱼类识别系统(YOLOv8+YOLO数据集+UI界面+Python项目+模型)
  • 评论盖楼系统最优解:扁平化高并发+无限层级通用
  • 轻松处理旧坚果二手投影仪:专业回收,快速变现
  • 【文化课】2025~2026 学年第一学期 期末考试 总结
  • Python GUI开发:Tkinter入门教程
  • 怎么在线编辑修改查看glb/gltf格式模型,支持多选,反选择多物体,单独导出物体(免费)
  • 詹姆斯·蒙蒂尔的市场异常现象研究
  • 梦断代码阅读笔记2
  • 西门子 S7-1200 通过 TIA Portal 实现对 MINAS A6 伺服的控制
  • Exce校验并导入(上传OSS)
  • POE 延长器突破标准以太网限制,延长网络设备的部署范围
  • 学习的门道和思路