惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Archives - TechRepublic
Security Archives - TechRepublic
罗磊的独立博客
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
Apple Machine Learning Research
Apple Machine Learning Research
The Register - Security
The Register - Security
J
Java Code Geeks
V2EX - 技术
V2EX - 技术
Vercel News
Vercel News
N
News and Events Feed by Topic
腾讯CDC
P
Proofpoint News Feed
N
News | PayPal Newsroom
www.infosecurity-magazine.com
www.infosecurity-magazine.com
爱范儿
爱范儿
O
OpenAI News
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
Martin Fowler
Martin Fowler
Engineering at Meta
Engineering at Meta
D
Docker
Y
Y Combinator Blog
博客园 - 聂微东
G
Google Developers Blog
S
Security @ Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
S
Schneier on Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
S
SegmentFault 最新的问题
云风的 BLOG
云风的 BLOG
阮一峰的网络日志
阮一峰的网络日志
C
CXSECURITY Database RSS Feed - CXSecurity.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
CERT Recently Published Vulnerability Notes
I
Intezer
G
GRAHAM CLULEY
有赞技术团队
有赞技术团队
Attack and Defense Labs
Attack and Defense Labs
V
Visual Studio Blog
博客园 - Franky
博客园 - 三生石上(FineUI控件)
W
WeLiveSecurity
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Hugging Face - Blog
Hugging Face - Blog
Scott Helme
Scott Helme
T
Troy Hunt's Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
L
LINUX DO - 最新话题
C
Cybersecurity and Infrastructure Security Agency CISA

青空之蓝

[青空之蓝-2023] - 色彩 | 青空之蓝 [青空之蓝-2022] - 平静 | 青空之蓝 [青空之蓝-2021] - 远望 | 青空之蓝 浅谈垃圾回收 | 青空之蓝 浅谈泛型擦除 | 青空之蓝 浅谈单点登录 | 青空之蓝 使用 Kotlin 编写 Spring 测试 | 青空之蓝 设计模式系列文章 | 青空之蓝 从零实现一个 Java 微框架 - IoC | 青空之蓝 从零实现一个 Java 微框架 - 前言 | 青空之蓝 浅谈 JVM:类加载 | 青空之蓝 浅谈 IO | 青空之蓝 浅谈并发:synchronized & ReentrantLock | 青空之蓝 浅谈并发:CAS & AQS | 青空之蓝 浅谈并发:ThreadLocal | 青空之蓝 浅谈并发:三大特性 | 青空之蓝 浅谈组合注解 & 注解别名 | 青空之蓝 [青空之蓝-2020]-迷茫 | 青空之蓝 Java 系列文章 | 青空之蓝 HTTP 系列文章 | 青空之蓝 浅谈 EatWhatYouKill | 青空之蓝 浅谈可扩展线程池 | 青空之蓝 聊聊写框架 | 青空之蓝 聊聊现状-[2020-09] | 青空之蓝 浅谈并发:锁 | 青空之蓝 浅谈并发:基础 | 青空之蓝 无须定义类,Spring 快速注入 Json 参数 | 青空之蓝 浅谈 Proxy 和 Aop | 青空之蓝 从零实现一个 PHP 微框架 - 初始化请求 | 青空之蓝 为 Vue3 添加一个简单的 Store | 青空之蓝 从零实现一个 PHP 微框架 - 服务提供者 | 青空之蓝 WSL2 踩坑记录 | 青空之蓝 浅谈浏览器Event Loop [更新] | 青空之蓝 从零实现一个 PHP 微框架 - Bootstrap 启动加载 | 青空之蓝 从零实现一个 PHP 微框架 - IoC 容器 | 青空之蓝 从零实现一个 PHP 微框架 - PSR & Composer | 青空之蓝 从零实现一个 PHP 微框架 - 前言 | 青空之蓝 MVVM 简单实现 | 青空之蓝 浅谈 DI 和 IoC | 青空之蓝 中间件实现 [PHP] | 青空之蓝 告别 Windows 终端的难看难用,打造好用的 PowerShell | 青空之蓝 VSCode Java输出中文乱码问题解决[更新] | 青空之蓝 浅谈浏览器渲染 | 青空之蓝 Vue-Cli@2 项目迁移日志 | 青空之蓝 Laragon & Scoop 集成踩坑记录 | 青空之蓝 「一行代码」优雅管理 Windows 软件 | 青空之蓝 [青空之蓝-2019]-年度总结 | 青空之蓝 为Vue添加简单的Store | 青空之蓝 为React添加简单的Store | 青空之蓝 为Vuex添加同步Action | 青空之蓝 浅谈B+树 | 青空之蓝 浅谈跳表 | 青空之蓝 浅谈数据库索引 | 青空之蓝 MySQL事务隔离 | 青空之蓝 算法复杂度分析(1) | 青空之蓝 一年来的经验总结 | 青空之蓝 Acrylic - VSCode Extension | 青空之蓝 ace编辑器设置惯性滚动 | 青空之蓝 Java二叉树实现 | 青空之蓝 Java图实现 | 青空之蓝 为apt方式安装的nginx重新编译增加WebDAV | 青空之蓝 XK-Editor - 一个支持富文本和Markdown的编辑器 | 青空之蓝 JS生成列表树 | 青空之蓝 Laravel生成目录树 | 青空之蓝 XK-Note - 集各种神奇功能的云笔记 | 青空之蓝 PHP GD生成验证码 | 青空之蓝 PHP GD图片处理[转换格式-水印-缩略图] | 青空之蓝 Origami - 简洁轻快的WordPress主题 | 青空之蓝 为WordPress启用WorkBox | 青空之蓝 [青空之蓝-2018]-年度总结 | 青空之蓝 VSCode Java手动导入jar和源码包 | 青空之蓝 Windows IP变化自动发送邮件 | 青空之蓝 C链表实现重制版 | 青空之蓝 C 结构体的定义和使用 | 青空之蓝 图的搜索(遍历) - BFS & DFS | 青空之蓝 Java链表实现 | 青空之蓝 C 快速排序 | 青空之蓝 C 插入排序 | 青空之蓝 C 归并排序 | 青空之蓝 C语言链表实现 | 青空之蓝 VSCode配置Java调试环境[Windows] | 青空之蓝 C 选择排序 | 青空之蓝 C 冒泡排序 | 青空之蓝 VSCode配置PHP调试环境[Windows] | 青空之蓝 VSCode配置C/C++ GDB调试环境[Windows] | 青空之蓝 WordPress友情链接模板 | 青空之蓝 Intel Optane 傲腾内存体验 | 青空之蓝 Mysql双机热备实战 | 青空之蓝 博客一年记录 | 青空之蓝 为WordPress启用Service Worker | 青空之蓝 Bing每日一图API | 青空之蓝 iframe延迟加载 | 青空之蓝 写在2018年高考前 | 青空之蓝 The Fox主题汉化分享 | 青空之蓝 [青空之蓝-2017]-崭新 | 青空之蓝 本博客评论规则 | 青空之蓝 世界,您好! | 青空之蓝
浅谈缓存 | 青空之蓝
Otstar Lin · 2020-08-13 · via 青空之蓝

浅谈缓存

前言

原本是打算写并发相关的文章的,但是目前知识储备还不足,所以就先咕咕了。缓存相对简单点,就先水一篇了 ?。

什么是缓存?作用?

缓存(Cache)是用于数据交互的缓冲层,用于提高常用数据的读取速度,缓存非常常见,如 CPU 中的 L1 L2 L3 缓存,浏览器的静态资源缓存等。本篇主要围绕着后端缓存,硬件缓存之类的就不涉及了(我也不懂.jpg)。

缓存一般是用于在读多写少的场景下加快数据的获取,起加速作用。不过缓存其实还有另外的作用,如在高并发的场景下起到保护后端薄弱部分(数据库等)的作用。

一些常见的缓存算法 & 策略

基于访问时间

  • **LRU (最近最少使用):**通过一个缓存队列,按每项的最后被访问时间排序。当缓存满了的时候删除队尾,即最后一次被访问时间距现在最久的项。当某个项被使用的时候,则将该项移至队首。

基于访问频率

  • **LFU (最近最少使用):**通过一个缓存队列,按每个缓存块的被访问频率将缓存中的各块排序,当缓存满了替换掉缓存队列中访问频率最低的一项。
  • **LRU-K:**是一种 LRU 算法的增强版,LRU 队列的基础上,再添加一个队列维护数据访问的次数,由原来访问 1 次会被添加到缓存中,改为访问 K 次才会被加入到缓存中。

基于访问时间与频率

  • **ARC:**兼顾访问时间与频率,使得在数据访问模式变化时缓存策略仍有较好性能。

基于访问模式

有些应用有特性的数据访问特点,可以通过制定一个与之匹配的模式来实现高效缓存。

一些名词 & 解释

缓存穿透

是什么?

一般情况下,我们从 API 或数据库等高耗时操作取得数据后才会对值进行缓存,如果没有获取值就不进行缓存,而这时候如果我没读取一条不存在的数据,那么该请求每次都会绕过缓存而打到缓存后的数据库或 API,这个过程就被称为缓存穿透,如下:

带来的问题

当系统并发量大并且空值的查询多的时候,大部分请求会打到缓存后的薄弱部分,通常会导致数据库或 API 承受不住而导致不稳定或崩溃。

黑客可以通过这一漏洞对系统进行攻击,造成重大损失。

解决方案

这一问题是不缓存空值导致的,那么我们对空值进行缓存即可解决。这种方案有一定局限性,当产生空值的范围很大的时候,这一方案就不太适用了,此时黑客可以利用不断变化查询的 key 达到爆缓存的效果。

还有一种方案是采用布隆过滤器,利用布隆过滤器来判断值是否存在,当从布隆过滤器中得知有值的时候才进入缓存和数据库,否则则直接返回不存在。通常利用这种方法来解决上述爆缓存的问题,但是布隆过滤器有误判几率,所以要依系统的特性选择合适的方案。

缓存击穿

是什么?

缓存击穿指的是当大量请求正好请求某一个 key 的数据的时候,而这个 key 又刚好失效的时候,这些大量请求会打到数据库或 API 上,这过程就称为缓存击穿。

带来的问题

会造成某个时刻数据库或 API 的压力剧增,甚至崩溃的情况发生。

解决方案

如果该数据是因为时间过期导致失效,那么就应使用访问频率方式缓存。

如果该数据是因为更新而导致失效,那么可以通过加读锁使请求等待缓存更新完毕。或者使用 CAS 操作,当值更新完毕的时候就替换掉旧的缓存。

缓存雪崩

是什么?

与缓存击穿类似,都是由于缓存失效导致的问题,不过雪崩指的就是大量的缓存失效。常见的有缓存服务器挂掉,缓存过期时间设置不当(同一时间过期)。

带来的问题

在高并发的情况下,一旦出现缓存雪崩,有极大的可能会导致缓存后的服务直接崩溃。

解决方案

采用集群缓存的方式,当某一条缓存服务器失效的时候还有其他缓存服务器可以顶替。

当缓存服务器失效后就对服务进行降级和限流,通过降低体验来防止后端服务挂掉导致完全不可用的状况发生。

避免设置相同的过期时间,应使缓存的数据错峰失效。

结语

本篇文章主要是对缓存进行介绍,其实就是一些名词解释 ?,后续可能会写一些关于 Redis 和其他缓存系统的介绍和使用,不过应该要等我肝完并发系列的文章和 PHP 框架的文章才会写吧。

浅谈缓存

https://blog.ixk.me/post/talking-about-cache
  • 许可协议

    BY-NC-SA

  • 本文作者

    Otstar Lin

  • 发布于

    2020/08/13

转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!

浅谈并发:基础无须定义类,Spring 快速注入 Json 参数

HomeGitHubStatus

Copyright © 2017-2026 Otstar Lin

Theme Coline by Otstar LinPowered by Next.js