介绍
在此存储库中,我们将探索缓存与Spring的使用,并以简单的方式简要介绍Redis。我们将使用Spring介绍示例,但是您可以将这些概念调整到其他Web框架中。
代码存储库
什么是缓存?
缓存是一种用于临时存储经常访问的数据的机制,例如网站的静态组件(例如,图像和文档)。该技术通过减少重复查询的需求来加快数据访问的速度。
“缓存是用于对反映网站静态组件的特定保存信息进行分类的术语,例如构成页面的图像和一般文档。” -CanalTech.
为什么使用缓存?
通常,数据直接存储在数据库中。 SQL或关系数据库使用磁盘或SSD存储,涉及有限的读写速度。另一方面,CPU对于本地存储而言更为昂贵,并且通常较慢。在许多情况下,数据库可以通过缓存一部分甚至RAM中的整个数据库来优化性能,从而大大改善整体性能。
但是,有一些方法可以进一步优化,尤其是在处理MongoDB,Redis,DynamoDB等NOSQL数据库时,重点介绍了键值数据库模型或对RAM的独家使用。这些NOSQL数据库以其速度而闻名,尽管它们被认为不太可靠。可以通过将特定查询存储在Redis中并从那里检索它们而不是访问SQL数据库来实现优化。这会节省时间,减少CPU使用和资源保护。
什么是雷迪斯?
通常,数据直接存储在数据库中。 SQL或关系数据库使用磁盘或SSD存储,涉及有限的读写速度。另一方面,CPU对于本地存储而言更为昂贵,并且通常较慢。在许多情况下,数据库可以通过缓存一部分甚至RAM中的整个数据库来优化性能,从而大大改善整体性能。
但是,有一些方法可以进一步优化,尤其是在处理MongoDB,Redis,DynamoDB等NOSQL数据库时,重点介绍了键值数据库模型或对RAM的独家使用。这些NOSQL数据库以其速度而闻名,尽管它们被认为不太可靠。可以通过将特定查询存储在Redis中并从那里检索它们而不是访问SQL数据库来实现优化。这会节省时间,减少CPU使用和资源保护。
可以缓存什么?
缓存可用于存储和加速应用程序中对各种数据和资源的访问。以下是可以从缓存使用中受益的东西:
- 数据库数据:最常见的用例之一是缓存数据库查询的结果。这可以包括对象,SQL查询,甚至包括动态生成的HTML页面。
- 静态资源:可以缓存静态元素,例如图像,CSS样式表,JavaScript脚本和媒体文件,以减少服务器加载和加快网页加载。
- 冗长计算的结果:如果用相同的参数重复请求计算密集型操作,则可以缓存结果以避免每次需要重新计算。
- 会话信息:可以缓存会话数据,以避免对服务器的会话存储的频繁查询,从而产生更快的响应。
- API和外部请求:如果应用程序对外部API或Web服务进行呼叫,则可以缓存这些呼叫的结果以减少重复调用的开销并改善延迟。
有效地使用缓存涉及确定应用程序的哪些部分可以从缓存和实施这些元素实施适当的缓存策略中受益。仔细管理缓存至关重要,以确保在需要时更新缓存的数据,并且过度的缓存使用不会导致数据完整性问题。
例子
在这种情况下,我们将使用Java代码示例,该示例直接利用Redis和Spring的缓存支持。两者都是出于说明目的而简化的。最初,我们不会提及库或安装要求,因此无需担心。我们还将使用MVC模式。让我们直接潜入服务。
此代码说明了如何使用Spring和Redis实现缓存以有效地存储和检索驱动程序数据。
@Cacheable("Drivers")
public List<Driver> getDriver() {
return this.repository.findAll();
}
@Scheduled(cron = "10 * * * * *")
@CacheEvict("Drivers")
public void clearCache() {
System.out.println("Clear cache drivers");
}
public List<Driver> getDriverByRedis() throws JsonProcessingException {
String value = this.redisService.getKeyValue("Drivers_Redis");
if (value == null || value == "") {
List<Driver> drivers = this.repository.findAll();
this.redisService.saveKeyValue("Drivers_Redis", objectMapper.writeValueAsString(drivers));
return drivers;
}
return objectMapper.readValue(value, new TypeReference<List<Driver>>() {});
}
在这种情况下,有些将其称为缓存池或钥匙,但在这里我们将坚持使用“键”一词。当有人调用GetDriver功能检索驱动程序时,如果缓存不存在,它将执行并保存数据中的“驱动程序”。这消除了直接查询数据库的需求。
但是,有时数据会更改,或者我们需要偶尔刷新它。 Spring使用Cacheevict提供支持。当您调用该方法时,它会清除与密钥相关的值,从而迫使下一个调用getDriver重新创建值。除其他情况外,当实体被更改时,这可能很有用。
在某些情况下,没有用于创建缓存的框架。因此,我们这里有一个更纯净的示例,说明如何创建缓存。在最后一个情况下,我没有提供时间间隔清除缓存的代码,因为我没有太多时间。 REDIS使用钥匙值对运行;如果值不存在,则可以返回null。这就是为什么我们执行IF检查以查看它是空还是空的。必须注意的是,此示例已简化,可能不适合复杂系统,但它具有说明性的目的。
利弊
是的,实施缓存可以增强或降低应用程序的安全性和性能。我将重点介绍一些细节,一般关注Redis和缓存。
优点
- 改进的性能:缓存加快了对常用数据的访问,从而减少了耗时的查询需要到数据库等数据源。
- 减少延迟:缓存数据位于内存中,与查询磁盘上的数据库相比,访问更快。
- 可伸缩性:REDIS具有高度可扩展性,使其成为高流量应用的有效解决方案。您可以轻松地在多个服务器上分发缓存。
- 数据库负载减少:缓存减少数据库上的负载,从而使其免于频繁和重型查询,这可以帮助避免过载问题。
- 资源节省:缓存保守的系统资源等CPU和I/O,因为它减少了对频繁数据库访问的需求。
- 增强的用户体验:随着响应时间的更快,用户会体验到更快的应用程序性能,从而改善了用户体验。
缺点
- 数据一致性:缓存可以引入数据一致性问题,因为与基础数据库中的数据相比,缓存数据可能过时。这需要仔细的缓存管理策略,例如在数据更改时设定适当的到期时间或缓存无效。没有中介机构,缓存的数据与数据库无直接相关。
- 其他复杂性:实施和管理缓存系统为应用程序开发增加了复杂性。您需要确保在必要时更新缓存的数据。
- 内存要求:像Redis这样的内存中缓存会消耗RAM。这意味着您需要分配足够的内存来处理您的缓存数据,这可能会增加基础设施成本。
- 潜在的数据泄漏:如果没有适当的缓存管理,则可能会泄漏敏感信息,因为未经授权的各方可以访问缓存的数据。
- 实施成本:设置和维护缓存系统,尤其是在涉及Redis等专用服务器的情况下,可以增加基础架构和维护成本。
- 缓存无效的复杂性:缓存无效可能是复杂的,需要额外的谨慎,以确保在基础数据更改时正确更新缓存。
- 缓存错过:在某些情况下,如果高速缓存未正确设计或配置,则可能会有高率的“缓存错过”率,这意味着数据没有被缓存,需要从数据库中获取,从而否定了数据缓存的好处。
总而言之,使用缓存(包括REDIS)可以是提高应用程序性能和可扩展性的有力策略,但它也需要仔细考虑和管理,以避免数据一致性问题以及敏感信息的泄漏。每个应用程序都是唯一的,因此使用缓存的决定应基于您项目的特定需求,并了解与缓存相关的利弊。
我希望您能发现这个有用的信息!
我的社交媒体资料:
- Linkedin: JeanVictor1
- Dev.to: @mrjeandev