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

苏州网站建设企业网站制作网页设计图片地址怎么写

苏州网站建设企业网站制作,网页设计图片地址怎么写,网站的代理页面怎么做,做网站商丘目录 一、系统概述 二、名词解释 三、淘汰策略 1、LRU 2、LFU 3、FIFO 4、TTL 5、Random 四、读写模式 1、Cache Aside#xff08;旁路缓存#xff09; 2、Write Through#xff08;直写#xff09; 3、Write Back#xff08;回写#xff09; 五、问题方案 …目录 一、系统概述 二、名词解释 三、淘汰策略 1、LRU 2、LFU 3、FIFO 4、TTL 5、Random 四、读写模式 1、Cache Aside旁路缓存 2、Write Through直写 3、Write Back回写 五、问题方案 1、缓存穿透 2、缓存雪崩 3、缓存击穿 4、最佳实践 一、系统概述 缓存Cache是通过临时存储高频访问数据来加速数据访问的技术组件本质是空间换时间的典型实践。其核心价值体现在 性能加速缩短数据访问路径CPU缓存 vs 内存访问速度差达100倍资源节约减少对底层数据源的访问压力数据库查询成本降低80%系统稳定应对突发流量冲击如秒杀场景QPS可达10万级 二、名词解释 缓存命中率请求缓存时数据存在的概率命中次数 / 总请求次数命中率90%为高效70%需优化如调整淘汰策略或容量缓存穿透请求不存在的数据如恶意攻击或无效ID绕过缓存直击后端缓存击穿热点数据过期瞬间高并发请求压垮数据库缓存雪崩大量缓存同时过期导致请求洪峰冲击后端缓存污染缓存中存储了大量非高频访问或无效数据导致缓存命中率下降进而降低系统整体性能的现象。本质是缓存资源被低价值数据占用无法有效服务高频请求。TTLTime To Live缓存数据存活时间冷热数据分离高频/低频数据分区存储缓存预热系统启动时加载热点数据 三、淘汰策略 缓存系统通过淘汰策略在容量不足时决定移除哪些数据核心目标是最大化缓存命中率。 策略 时间复杂度 空间开销 适用场景 命中率 LRU O(1) 中 通用场景Web缓存 ★★★★☆ LFU O(1)~O(log n) 高 热点数据集中视频推荐 ★★★★★ FIFO O(1) 低 简单顺序访问日志缓冲 ★★☆☆☆ TTL O(log n) 中 时效性数据会话/验证码 ★★★☆☆ Random O(1) 低 低成本容忍场景 ★★☆☆☆ 1、LRU 核心思想优先淘汰最久未被访问的数据 数据结构哈希表 双向链表哈希表存储键值对链表维护访问顺序 操作流程 数据访问 命中缓存将节点移到链表头部未命中从数据库加载新节点插入链表头部 淘汰触发 链表尾部节点最久未访问被移除同步删除哈希表中对应键 优点 高效反映时间局部性最近访问的数据更可能再被访问时间复杂度O(1)哈希表定位 链表移动 缺点 突发批量访问可能污染缓存如全表扫描链表维护增加内存开销 2、LFU 核心思想优先淘汰访问频率最低的数据 数据结构双哈希表键值存储 频率-键列表 最小堆/双向链表 操作流程 数据访问 命中缓存增加计数调整在频率链表中的位置 淘汰触发 移除最低频率链表中的最早节点LRU作为次级策略更新最小频率值 优点 精准保护高频访问数据适合长期热点数据场景如电商热门商品 缺点 新数据易被淘汰初始频率低维护成本高需频率排序历史高频但不再访问的数据可能滞留 3、FIFO 核心思想按进入缓存的顺序淘汰 数据结构队列数组/链表实现 操作流程 1数据写入新数据加入队尾 2淘汰触发移除队首数据 优点 实现简单仅需队列零额外内存开销 缺点 忽略访问模式可能淘汰热点数据缓存命中率通常最低 4、TTL 核心思想基于过期时间自动淘汰 数据结构哈希表 时间堆或轮询检查 操作流程 数据写入设置过期时间戳当前时间 TTL淘汰触发 主动定期扫描过期数据定时器被动访问时检查过期并删除 优点 保证数据时效性适合会话缓存避免手动清理 缺点 可能提前移除仍有价值的数据扫描机制消耗CPU大缓存需优化 5、Random 核心思想随机选择数据淘汰 数据结构动态数组如Python list 操作流程 淘汰触发随机选择键删除数据维护数组动态调整 优点 实现极其简单无状态维护成本 缺点 可能误删高频数据性能波动不可预测 四、读写模式 主要是要保证数据的一致性。 1、Cache Aside旁路缓存 旁路缓存模式也称为懒加载Lazy Loading是最常见的缓存模式。 应用程序直接与缓存和数据库或主数据存储交互。 优点实现简单缓存只保存实际被请求的数据节省内存。 缺点缓存未命中时需要访问数据库可能导致延迟。另外在写操作后立即读可能会因为缓存失效而读到旧数据需要等到下次加载但通常通过删除缓存保证一致性。 读流程 缓存命中应用程序首先检查缓存。如果数据存在命中则直接返回缓存数据。缓存未命中 1应用程序从数据库中读取数据。 2将读取到的数据写入缓存以便后续读取命中。 3返回数据。 写流程 应用程序直接更新数据库。同时使缓存中对应的数据失效删除缓存项。这样下次读取时会触发缓存未命中从而从数据库加载最新数据并重新填充缓存。 2、Write Through直写 在直写模式中缓存作为数据库的代理层。 写操作总是先经过缓存然后由缓存同步更新到数据库。 优点缓存和数据库始终保持一致强一致性。读操作很少会访问数据库因为写操作已经更新了缓存。 缺点写操作延迟较高因为需要等待数据库写入完成。如果数据不经常被读取那么写入缓存可能造成资源浪费因为每次写都更新缓存即使很少读。 读流程 缓存命中直接返回缓存数据。缓存未命中 1缓存从数据库中加载数据或由应用程序触发加载。 2将数据放入缓存。 3返回数据。 写流程 1应用程序更新缓存如果数据在缓存中不存在则创建缓存项。 2缓存立即将数据同步写入数据库通常在一个事务内。 3只有在数据库写入成功后写操作才算完成。 3、Write Back回写 回写模式也称为Write-Behind中写操作首先写入缓存然后异步批量写入数据库。缓存作为写操作的缓冲区。 优点写操作非常快因为应用程序不需要等待数据库写入。可以合并多次写操作减少数据库压力。 缺点数据不一致的风险缓存和数据库在异步同步前不一致。如果缓存崩溃尚未写入数据库的数据会丢失。因此通常需要额外的机制如写日志来保证数据持久性。 读流程 缓存命中直接返回缓存数据。缓存未命中 1从数据库中加载数据到缓存。 2返回数据。 写流程 1应用程序更新缓存如果数据不在缓存中则先加载到缓存再更新或者直接创建新的缓存项。 2缓存标记数据为“脏”dirty表示需要同步到数据库。 3缓存立即返回成功给应用程序无需等待数据库写入。 4缓存会在之后的某个时间点例如缓存满时、定时任务、或者低负载时将“脏”数据批量写入数据库。 五、问题方案 1、缓存穿透 问题原因 当查询不存在的数据时如无效ID、不存在的用户名每次请求都会穿透缓存层直接访问数据库。在恶意攻击场景下如脚本批量请求随机ID数据库会持续承受无效查询压力导致性能急剧下降甚至崩溃。这种现象与正常缓存未命中的区别在于正常未命中是偶发的而穿透是持续性的无效查询。 // 大量恶意调用 getData(invalid_id_1) getData(invalid_id_2); ...// 缓存访问接口 std::string getData(const std::string key) {auto data cache.get(key); // 缓存查询if (data.empty()) {data db.query(key); // 缓存未命中查询数据库cache.set(key, data); // 写入缓存}return data; } 解决方案 1布隆过滤器Bloom Filter 在缓存层前设置布隆过滤器作为屏障工作原理使用多个哈希函数将键映射到位数组中查询时 若键不在过滤器中 → 直接返回空拦截非法请求若键可能存在 → 继续查询缓存/数据库 特点存在误判率通常1%但内存效率极高1亿键仅需约100MB 2空值缓存Cache Null Object 对查询结果为空的键缓存特殊标记如NULL设置较短过期时间5-30秒防止恶意请求耗尽空间需配合监控清理机制避免存储过多无效键 // C 布隆过滤器空值缓存实现 class BloomFilter { private:std::vectorbool bits;std::vectorstd::hashstd::string hashers;public:BloomFilter(size_t size, int hash_count) : bits(size), hashers(hash_count) {}void add(const std::string key) {for (auto hash_fn : hashers) {size_t pos hash_fn(key) % bits.size();bits[pos] true;}}bool may_contain(const std::string key) {for (auto hash_fn : hashers) {size_t pos hash_fn(key) % bits.size();if (!bits[pos]) return false;}return true;} };// 使用示例 BloomFilter filter(1000000, 3); // 100万位3个哈希std::string get_data(const std::string key) {// 布隆过滤器拦截if (!filter.may_contain(key)) return ;// 缓存查询auto data cache.get(key);if (data NULL) return ; // 空值标识if (data.empty()) {data db.query(key);if (data.empty()) {cache.set(key, NULL, 15); // 缓存空值15秒return ;}cache.set(key, data, 3600); // 缓存有效数据}return data; } 2、缓存雪崩 问题原因 当大量缓存在同一时间段集中过期如缓存初始化时设置相同TTL瞬时会有海量请求穿透到数据库。典型场景包括 系统启动时批量加载缓存定时任务刷新缓存缓存服务器重启 雪崩效应会导致数据库出现流量尖峰引发连锁故障如连接池耗尽、CPU过载。 解决方案 1差异化过期时间 基础过期时间 随机偏移如30分钟 ± 5分钟确保缓存失效时间均匀分布避免集中失效 2双层缓存策略 主缓存设置较短TTL30分钟承担日常请求备份缓存设置长TTL24-48小时当主缓存失效时 先返回备份缓存数据异步重建主缓存 保证即使主缓存失效仍有备份数据可用 3热数据永不过期 对核心热数据如首页推荐采用逻辑过期 物理上永不过期后台线程定期更新数据数据对象包含逻辑过期时间戳 // C 双层缓存随机TTL实现 std::string get_data_avalanche_protected(const std::string key) {// 随机数生成器static thread_local std::mt19937 rng(std::random_device{}());static std::uniform_int_distributionint dist(-300, 300);// 优先查询主缓存if (auto data cache.get(primary_ key); !data.empty()) return data;// 查询备份缓存if (auto backup cache.get(backup_ key); !backup.empty()) {// 异步重建主缓存std::thread([key, backup] {int ttl 1800 dist(rng); // 30分钟基础随机偏移cache.set(primary_ key, backup, ttl);}).detach();return backup;}// 查询数据库auto data db.query(key);if (!data.empty()) {int primary_ttl 1800 dist(rng);cache.set(primary_ key, data, primary_ttl);cache.set(backup_ key, data, 86400); // 备份24小时}return data; } 3、缓存击穿 问题原因 当某个热点Key突然失效时瞬时海量并发请求同时涌入数据库。与雪崩的区别在于 雪崩大量不同Key同时失效击穿单个热点Key失效引发风暴 核心危害 单点数据库压力暴增万级QPS可能引发连接池耗尽重建缓存时的重复查询浪费资源 解决方案 1互斥锁重建分布式锁 当缓存失效时仅允许一个线程执行数据库查询其他线程阻塞等待或重试关键点 锁粒度Key级别锁而非全局锁锁超时防止死锁通常5-10秒双重检查获取锁后再次验证缓存 2逻辑过期永不过期 缓存永不物理删除数据结构包含逻辑过期时间戳请求处理流程 返回当前缓存数据无论是否过期异步检查过期状态过期则触发重建 优点零等待时间保证高并发下的可用性 3热点数据监控预加载 实时监控Key访问频率识别热点Key后 延长其TTL提前异步刷新在多个缓存节点复制 // C 互斥锁逻辑过期实现 class HotspotProtection { private:std::shared_mutex global_mutex;std::unordered_mapstd::string, std::shared_ptrstd::mutex key_mutexes;struct CacheItem {int64_t logical_expire; // 逻辑过期时间戳(毫秒)std::string data;};public:std::string get_data(const std::string key) {// 获取当前缓存项auto item cache.getCacheItem(key);// 未逻辑过期直接返回if (item.logical_expire get_system_time_millis()) return item.data;// 获取Key级别锁std::shared_ptrstd::mutex key_mutex;{std::shared_lock read_lock(global_mutex);auto it key_mutexes.find(key);if (it ! key_mutexes.end()) key_mutex it-second;}if (!key_mutex) {std::unique_lock write_lock(global_mutex);key_mutex key_mutexes[key] std::make_sharedstd::mutex();}// 锁定并重建std::unique_lock lock(*key_mutex);// 双重检查item cache.getCacheItem(key);if (item.logical_expire get_system_time_millis()) return item.data;// 查询数据库auto new_data db.query(key);int64_t new_expire get_system_time_millis() 3600000; // 1小时后过期// 更新缓存cache.set(key, CacheItem{new_expire, new_data});return new_data;} }; 4、最佳实践 防御策略 适用场景 优点 缺点 布隆过滤器 防恶意请求/无效键 内存高效拦截精确 存在误判率 空值缓存 处理不存在数据 简单易实现 可能存储大量无效键 随机TTL 防批量缓存同时失效 有效分散压力 无法应对热点Key失效 双层缓存 高可用场景 主备切换平滑 增加内存开销 互斥锁重建 防热点Key击穿 保证数据一致性 增加请求延迟 逻辑过期 超高并发热点数据 零等待时间极致性能 实现复杂度高 分层防御体系 第一层布隆过滤器拦截非法请求第二层空值缓存处理无效查询第三层随机TTL双层缓存防雪崩第四层互斥锁逻辑过期防击穿 热点数据特殊处理 设置热点阈值对于热点 key延长 TTL、多节点复制 // 热点Key识别与预加载 class HotspotManager { public:void monitor_access(const std::string key) {access_count[key];if (access_count[key] 1000) { // 达到热点阈值extend_ttl(key, 3600); // 延长TTLpreload_replica(key); // 多节点复制}} }; 熔断降级机制 当数据库压力超过阈值时 自动触发熔断返回降级内容如默认推荐记录日志异步补偿 持续监控指标 缓存命中率 95% # 低于阈值告警 数据库QPS 3000 # 超过阈值扩容 穿透请求量 100/s # 超过阈值启动防御
http://www.dnsts.com.cn/news/218691.html

相关文章:

  • 商务酒店设计网站建设阿里百秀wordpress大前端
  • wordpress实现点赞网站搜索引擎优化的内容
  • 潼关县住房和城乡建设局网站我做网站推广
  • 淘客做网站的软件自己可以学做网站吗
  • 个人网站每年要多少钱网站开发程序员工资
  • 网站开发的著作权和版权j2ee网站开发开题报告
  • 网站各类备案启动wordpress
  • 网站源代码下载工具网络域名备案查询
  • seo网站排名优化价格网站建设业务活动
  • 找人做淘宝网站多少钱合肥网站排名
  • 有什么样的网站开发网站开发课设报告书
  • 北京通网站建设价格塘厦高铁站
  • 德宏网站建设wordpress网站实例
  • 狗头网网站电商网站的建设与维护
  • 腾讯有做淘宝客网站吗那家建设网站p2p公司最好?
  • 网站建设PHP开发是什么意思做网店运营需要学什么?
  • 外网浏览网站网站建设建设价格
  • 企业网站建设费用属管理费用吗销客巴巴wordpress
  • 济南物流公司网站建设公司做网站好吗
  • 网站导航素材下载网站制作的常见布局
  • 网站制作的销售对象病历邮寄怎么进入公众号
  • 主流媒体网站建设东莞知名企业排名
  • 云南省建设测量员注册网站wordpress主题 编辑
  • 怎么用二维动画做网站首页步骤php网站留言板是怎么做的
  • 专做展厅设计网站深圳公司形象墙制作
  • nodejs做网站的弊端专门找事做的网站
  • 河南省新闻出版培训中心吉林seo刷关键词排名优化
  • 甘肃网站建设哪家便宜网站建设的基本概念
  • html做电商网站做图片类型网站需要什么服务器
  • 东营市东营网站设计旅游网站建设规划