在支撑大规模、高并发、高可用的互联网应用中,异步更新分布式缓存的应用已经越来越多了(为什么是异步更新缓存,因为异步不仅可以提高系统性能,而且提高系统的伸缩性和可用性),由于缓存的更新是异步的,可能由于多个更新缓存的并发线程而导致的脏数据。
举例,有下面2个线程A、B同时执行业务,执行完业务之后,会产生2个异步的线程A1、B1去更新缓存,在理想情况下,A1和B1应该保持顺序性,即A1先更新缓存、B1再更新缓存,但是由于线程本身是异步的,加上2个线程可能分布在不同应用服务器上,所以对执行线程时顺序没有办法保证,如果B1先执行,A1再执行,这样B1的数据就被A1覆盖掉,从而导致脏数据。有没有什么好的办法防止这种脏数据呢?
解决办法:线程每次异步执行更新缓存时,不去更新缓存,而是去remove缓存。
这样的好处,不管A1、B1的执行顺序如何,都不可能导致缓存数据被覆盖的现象,因为每次是去remove缓存;
等待下次查询时将数据库中的数据load进缓存中。
缺点:如果更新的频率比较高,则可能会增加数据库的负载,所以事先必须先评估好业务。
分享到:
相关推荐
实现图片下载和缓存功能,可以将图片下载之后缓存到内存或者SD卡中。图片第一次从互联网下载之后,就会缓存到内存或者SD卡中。第二次再打开浏览时,就无需再从互联网下载,而是直接从内存或者SD卡中读取。 效果图说...
web服务器缓存实现原理,通过chrome f12观察web服务器缓存 后台action命中缓存hit Via X-cache X-Cache-Lookup
在实际应用中,alisoft-xplatform-asf-cache-2.5.1.jar提供了丰富的API,支持基本的增删查改操作,如设置、获取、删除和更新缓存项。此外,它还可能包含高级特性,如批量操作、过期策略、数据序列化等,以满足不同...
然而,对于实时变化快速且使用范围狭窄的数据,如具体的采购订单,Cache可能不是最佳选择,因为数据的更新可能导致Cache中的数据过时。 4. **使用Cache的注意事项** - **过期策略**:Cache中的数据具有生命周期,...
5. **条件式缓存更新**:在某些情况下,我们可能希望有条件地更新缓存,而不是每次调用方法都更新。这可以通过在`@CacheEvict`上设置`condition`属性实现。例如: ```java @CacheEvict(value = "myCache", key = ...
如果只想要<KeepAlive> ,请尝试React v15 + React-Router v4 +问题使用Route ,前进或后退时无法缓存组件,这会导致数据丢失和交互原因与解决方案Route不匹配时,组件将被卸载阅读源代码之后Route ,我们发现使用...
《cache-api-1.0.0.jar:JSR107缓存规范解析》 在IT行业中,缓存是优化系统性能的关键技术之一。本文将深入探讨“cache-api-1.0.0.jar”这个软件包,它与JSR107(Java Cache API)最终规范密切相关,为开发者提供了...
- 对于更新频繁的数据,考虑使用异步更新策略。 - 使用合适的序列化机制,保证缓存数据的序列化和反序列化效率。 通过以上内容,我们可以看到Spring如何利用注解简化了缓存配置,以及如何结合EHCache或OSCache...
`laravel-page-cache` 支持缓存标签,可以为不同的页面分配不同的标签,当某些数据更新时,可以通过标签清除相关的页面缓存,而不是全局清除。例如: ```php /** * @PageCache(60, ['news', 'latest']) */ public ...
`rw-file-cache-laravel-cache-driver`针对文件缓存进行了优化,特别关注读写效率,这在处理大量数据或高并发场景时尤为重要。在默认的文件驱动中,Laravel会将缓存数据存储为PHP序列化的文件,而这个驱动可能采用更...
- **初始化**:在 Nuxt 应用启动时,`nuxt-perfect-cache-main` 会进行初始化,设置缓存策略和存储方式(如内存、Redis 或其他数据库)。 - **请求处理**:当接收到客户端请求时,插件会检查请求的 URL 是否存在于...
在Android应用开发中,图像加载是一个非常重要的环节,特别是在处理大量图片或者网络图片时,如何高效、节省资源地实现异步加载就显得尤为关键。本篇文章将深入探讨Android中的图像异步加载策略,包括线程池和缓存...
5. **从Cache获取数据**:通过`Cache[key]`或`Cache.Get(key)`获取缓存数据,如果数据不存在,这些方法将返回`null`。 6. **移除Cache项**:使用`Cache.Remove(key)`方法可以移除指定键值的Cache项。 **Cache缓存...
**@CacheEvict**:当删除或更新可能导致缓存中数据过期的操作时,使用这个注解来清除相应的缓存项。它可以与方法的参数匹配,以便精确地清除特定的缓存条目。\n\n此外,我们还可以使用`@CacheConfig`注解来为一个类...
ASP.NET提供了一些方法来操作缓存,例如`Insert`用于添加或更新缓存项,`Remove`用于删除指定的缓存项。删除缓存通常是由于数据更新或缓存过期,以保持数据的一致性。例如,当数据库中的数据发生变化时,可以触发一...
axios-cache-plugin 使用axios时帮助您缓存GET请求。 安装 npm install axios-cache-plugin --save 或者 yarn add axios-cache-plugin 用法 将缓存功能添加到axios import axios from 'axios' import wrapper ...
`cache-swap`库是前端开发者优化性能的一个实用工具,它通过临时文件的缓存交换策略,解决了JavaScript在处理大量数据时可能面临的内存瓶颈问题。在合适的应用场景下,结合良好的设计和策略,`cache-swap`可以显著...
指导思想 系统架构设计 网络通讯优化 缓存与数据异步更新 数据库优化与分布设计 自动修复与处理 调试与跟踪
koa-cache-router 用于koa的路由器缓存中间件。 对于缓存某些页面(例如/home很有用。安装npm i koa-cache-router --save用法var router = new(require('koa-router'))();var CacheMiddleware = require('koa-cache-...
**httpclient-cache-4.2.5.jar** 是HttpClient的缓存模块,它为HTTP客户端增加了缓存功能。根据HTTP缓存规范,该库可以帮助存储和检索之前获取的HTTP响应,从而减少不必要的网络请求,提高应用程序的响应速度。它...