持久性简介——缓存
作者:互联网
持久性简介——缓存
对于大多数 Web 应用程序,您可以通过对经常跨网络边界读取的数据使用缓存来显着提高性能。本课将探讨一些常见的缓存技术,您将了解一些常见的工具和库如何为我们提供缓存。
虽然缓存有助于提高性能,但它也会在应用程序中引起一些意外和错误,我也会讨论其中的一些。
数据库课程索引
这是关于使用 typeorm 和 sql 在 postgres 中持久性的完整课程的一部分!
本课程有一个 github 存储库。有关说明,请参阅第 2 部分。
缓存
如果您查看应用程序中的数据流,您会发现使用缓存时延迟是如何减少的。下面的示例显示了如何缓存读取。
Overview of caching
缓存也用于联网应用程序之外。例如,计算机处理器大量使用缓存。从 RAM 读取比从硬盘读取要快几个数量级,从处理器缓存读取比从计算机 RAM 读取的改进相同。
缓存通常会使您的应用程序基础设施的成本更便宜。您可以将大多数数据保存在便宜的存储系统上,而只将当前数据放在更快的存储系统上。
缓存有助于消除不可预测的访问模式。即使是非常短的缓存也会产生显着的影响。
如果你有一些读得很重但经常变化的东西,你只缓存一秒钟,你可以保证任何下游基础设施只能得到 60 个请求/分钟。如今,任何硬件都可以轻松处理 60rpm。大多数使用该系统的人不会注意到新数据的延迟小于 1 秒。
Showing smoothing for requests to a fake live news feed
在上图中,某些没有缓存的基础设施有 500k r/pm。这对于一个像样的 RDBMS 来说是相当困难的,但 Redis 可以很便宜地处理它。在第二张图中,您可以看到在 RDBMS 前面放置一个短缓存的效果——RDBMS 请求是平坦且可预测的。
常见的缓存场景
以下是您可能每天都在使用的一些使用缓存的工具
域名系统
运行互联网的域名系统基于本地缓存。记录在互联网上传播并设置了生存时间。您的浏览器首先询问您计算机中的缓存如何找到 google.com,如果该记录已过时,则浏览器会转到您的 ISP 以获取 DNS 记录。如果您的 ISP 没有记录,则浏览器会转到 Internet 的根名称服务器之一。
为常见的 DNS 记录(如 google.com)提供本地缓存可带来更快的浏览器体验。
反应查询
react 查询库是用于客户端应用程序的优秀数据检索库。 React 查询内置了通读缓存。您的应用程序发出的每个请求都存储在本地缓存中。 React 查询将重用本地缓存中的数据,以快速向用户展示数据。然后它将在后台刷新数据以减
具有数据存储的应用程序
大多数应用程序将数据存储在某个地方,通常是数据库。大多数应用程序的读取量很大,因此我们可以通过在应用程序和数据存储之间使用缓存来提高性能并降低数据存储的成本。
常见的缓存模式
有很多非常常见的缓存模式。这三个是我在构建 Web 应用程序时看到的主要内容。
缓存一旁
缓存放在一边是很常见的。应用程序知道缓存并充当协调器。
Illustrating cache aside caching
假设缓存未命中场景:
- 应用程序检查缓存中的数据。
- 缓存返回空响应
- 应用程序从数据库中获取数据
- 应用程序为下一次缓存检索存储数据
读取缓存并写入缓存
在缓存后的读取和写入中,应用程序仅与缓存交互。然后缓存层直接与数据库层通信。应用程序从不知道数据库层。
Illustrating read/write behind caching
假设缓存读取未命中:
- 应用程序查询缓存
- 缓存没有数据,因此它查询数据存储
缓存存储结果并将其返回给客户端应用程序
假设缓存写入
- 应用程序将数据写入缓存
- 缓存将数据写入数据库
这两种模式并不总是一起使用。例如,您可能总是通过缓存读取但直接写入数据库。在一个部分中讨论它们更容易,因为主体是如此相似。
Slonik Postgres 客户端 ( https://github.com/stockholmux/slonik-redis-cache ) 允许您配置拦截器。拦截器是在查询管道上运行的中间件。然后,您可以应用提示,例如 @缓存-ttl 10
到你的 sql 查询中的拦截器。
从“slonik”导入 { sql, createPool }
从'redis'导入redis
从 'slonik-redis-cache' 导入 redisCache
常量客户端 = redis.createClient({
/* 连接选项 */
})
常量池 = createPool('postgres://localhost:5432/applicationDb', {
拦截器:[redisCache(client)],
})
pool.connect(异步(连接)=> {
让结果=等待连接。查询(
sql`SELECT * FROM aTable -- @cache-ttl 10`
)
控制台日志(结果)
})
直写模式的一个示例是使用带有 Gears 的 Redis Enterprise ( https://docs.redis.com/latest/modules/redisgears/ )。这允许您设置 Redis 以在 Redis 运行时中运行带有挂钩的 Python 和 Java。对 redis 的每次写入都将传播到您的数据存储区。
缓存失效
如果您的数据存储有尚未在缓存中的数据,那么您有一个过时的缓存。这是否是一个问题在很大程度上取决于数据和您的应用程序。在某个阶段,您将希望使这些数据无效,以便将缓存的记录替换为新记录。
网上有很好的文章描述了如何解决这个问题( https://redis.com/blog/three-ways-to-maintain-cache-consistency/ )。
这些是用于使缓存数据无效的常用方法。需要注意的一件重要事情是,如果您使用直写,那么您的缓存应该始终是最新的。
活着的时间
生存时间失效非常普遍。您要求缓存在设定的时间段后自动使项目过期,这意味着您的数据层必须在某个设定的时间段后转到源刷新项目。
写入时缓存
对于具有高读取率且不经常更改的数据,您只需在每次写入数据存储时更新缓存即可。随着写入频率的增加,这种失效策略变得昂贵。
缓存驱逐
最近最少使用的是驱逐方法。这侧重于通过从缓存中删除不经常读取的数据来释放资源,而不是保持数据新鲜。
还有其他常见的驱逐机制
- 最近使用的
- 最近最少用户
- 先进先出
- 后进先出
它们的使用将高度依赖于您的应用程序。
使用缓存需要注意的问题
不适当的缓存负载
如果您的数据库没有承受很大的负载,则添加数据库可能会产生负面影响,因为之间的延迟 应用程序 -> 缓存 -> 数据库
可以不仅仅是一个更传统的 应用程序 -> 数据库
不负重
缓存过于急切
如果您缓存了许多不经常读取的内容,那么您将填满您的缓存。这将使运行成本更高,并且拥有如此多的记录会减慢缓存速度。
配置不正确
如果您缓存数据的时间过长或者您没有在正确的时间清除缓存的数据,那么您可能会将过时的数据返回给客户。
结论
您会在大多数应用程序上遇到缓存。调整使用的缓存策略和失效策略将帮助您改善用户体验和基础设施成本。
缓存引入了必须小心管理的复杂性。
数据库课程索引
这是关于使用 typeorm 和 sql 在 postgres 中持久性的完整课程的一部分!
本课程有一个 github 存储库。有关说明,请参阅第 2 部分。
- 持久性简介 (你在这里)
- 创建本地实例
- 在 postgres 中存储数据
- 进入关系
- 高级查询
- 交易
- 9 个提示、技巧和常见问题
- 数据库管理词汇表
- 缓存介绍 (你在这里)
最初发表于 https://www.darraghoriordan.com .
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
本文链接:https://www.qanswer.top/22848/51490909
标签:存储,缓存,读取,简介,数据库,应用程序,持久性,数据 来源: https://www.cnblogs.com/amboke/p/16671725.html