转载请注明出处哈:http://carlosfu.iteye.com/blog/2269678
一、缓存的几种更新策略
从下面的表格看,缓存的更新策略大致分为三种,本文将从一致性和维护成本两个方面对于三种缓存更新策略进行简要说明,因为这些东西比较理论和抽象,如哪里说得不对,欢迎拍砖。
注:
(1) 一致性:缓存和真实数据源(例如mysql, hbase, elasticsearch等等)是否存在一段时间数据的不一致。
(2) 维护成本: 开发人员的开发和维护成本。
策略 | 一致性 | 维护成本 |
LRU/LIRS/FIFO算法剔除 | 最差 | 低 |
超时剔除 | 较差 | 较低 |
主动更新 | 强 | 高 |
二、LRU/LFU/FIFO算法剔除
1. 使用场景:
通常用于缓存使用量超过了预设的最大值时候(缓存空间不够),如何对现有的数据进行清理。例如FIFO会把最新进入缓存的数据清理出去, LRU会把最近最少使用的数据清理掉。
例如:Memcache使用的是LRU,具体Memcache如何实现的,这里就不在赘述了,网上资料多的是。
例如:Redis使用maxmemory-policy这个配置作为内存最大值后对于数据的更新策略。
配置名 | 含义 | 默认值 |
maxmemory | 最大可用内存 | 不使用该配置,也就对内存使用无限制 |
maxmemory-policy | 内存不够时,淘汰策略 | volatile-lru |
- volatile-lru -> 用lru算法删除过期的键值
- allkeys-lru -> 用lru算法删除所有键值
- volatile-random -> 随机删除过期的键值
- allkeys-random -> 随机删除任何键值
- volatile-ttl -> 删除最近要到期的键值
- noeviction -> 不删除键,只返回一个错误
2. 常用算法:
这里不再赘述,常用的算法有如下几种:
FIFO[first in first out]
LFU[Less Frequently Used]
LRU[Least Recently used]
3. 一致性
可以想象,要清理哪些数据,不是由开发者决定(只能决定大致方向:策略算法),数据的一致性是最差的。
4. 维护成本
这些算法不需要开发者自己来实现,通常只需要配置最大maxmemory和对应的策略即可。
开发者只需要有这个东西,知道是什么意思,选择自己需要的算法,算法的实现是由缓存服务器实现的。
三、超时剔除
1. 使用场景:
就是我们通常做的缓存数据过期时间设置,例如redis和memcache都提供了expire这样的API,来设置K-V的过期时间。
一般来说业务可以容忍一段时间内(例如一个小时),缓存数据和真实数据(例如:mysql, hbase等等)数据不一致(一般来说,缓存可以提高访问速度降低后端负载),那么我们可以对一个数据设置一定时间的过期时间,在数据过期后,再从真实数据源获取数据,重新放到缓存中,继续设置过期时间。
例如: 一个视频的描述信息,我们可以容忍一个小时内数据不一致,但是涉及到钱的方面,如果不一致可想而知。
2. 一致性:
一段时间内(取决于过期时间)存在数据一致性问题,即缓存数据和真实数据源数据不一致。
3. 维护成本
用户的维护成本不是很高,只需要设置expire过期时间即可(前提是你的业务允许这段时间可能发生的数据不一致)。
四、主动更新
1. 使用背景:
业务对于数据的一致性要求很高,需要在真实数据更新后,立即更新缓存数据。
具体做法:例如可以利用消息系统或者其他方式(比如数据库触发器,或者其他数据源的listener机制来完成)通知缓存更新。
2. 一致性:
可以想象一致性最高(几乎接近强一致),但是有个问题:如果主动更新发生了问题,那么这条数据很可能很长时间不会更新了(所以可以结合超时剔除一起使用,下面最佳实践会说到)
3. 维护成本:
相当高,用户需要自己来完成更新(需要一定量的代码,从某种程度上加大了系统的复杂性),需要自己检查数据是否真的更新了之类的工作。
五、最佳实践
其实最佳实践就是组合使用:
1. 一般来说我们都需要配置超过最大缓存后的更新策略(例如:LRU)以及最大内存,这样可以保证系统可以继续运行(例如redis可能存在OOM问题)(极端情况下除外,数据一致性要求极高)。
2. 一般来说我们需要把超时剔除和主动更新组合使用,那样即使主动更新出了问题,也能保证过期时间后,缓存就被清除了(不至于永远都是脏数据)。
相关推荐
综上所述,缓存是现代IT系统中不可或缺的一部分,它通过一系列高效的算法和管理策略,在确保数据一致性的前提下,最大限度地提升了数据访问的效率和系统的整体性能。对于IT专业人士而言,理解缓存的工作原理,熟悉...
4. **事务管理**:iBATIS提供了简单的事务管理功能,允许开发者控制事务的边界,确保数据的一致性。 5. **缓存机制**:为了提高性能,iBATIS引入了缓存机制,可以缓存查询结果,减少不必要的数据库访问。 接下来,...
6. **复制优化**:Redis 6.2改进了复制过程,减少了主从复制的延迟,提高了数据一致性。此外,还引入了`REPLCONF ACK`命令,允许主节点确认已接收到从节点的复制数据。 7. **内存管理**:Redis 6.2改进了内存分配...
4. 缓存更新策略:根据业务需求选择合适的缓存更新策略,如定时刷新、事件触发刷新等。 总结,Memcached作为一款高效、简单的内存缓存系统,对于提升Web应用性能有着显著效果。掌握其工作原理和使用方法,能帮助...
1. **分布式缓存**:Ehcache支持多节点间的缓存同步,实现数据的一致性和高可用性,尤其适用于分布式环境。 2. **Terracotta集群**:与Terracotta服务器结合,Ehcache可以实现跨JVM的缓存共享,提高性能和扩展性。 3...
在实际使用中,Nexus不仅可以作为开发团队的内部依赖管理工具,还可以作为企业级的组件仓库,用于统一管理所有的软件构件,保证开发、测试和生产环境的一致性,降低维护成本,并提高软件质量。 总之,Nexus-webapp-...
6. **事务支持**:在需要确保消息顺序和一致性的情况下,ActiveMQ提供了事务处理功能,支持本地和分布式事务。 7. **性能优化**:ActiveMQ具有高性能的设计,通过缓存、批量发送和高效的网络协议优化,可以处理大量...
5. 数据一致性:提供了多种一致性模型,如强一致性和最终一致性,以满足不同场景的需求。 6. 支持JCache (JSR-107):遵循Java缓存标准,使得与其他符合标准的缓存系统交互变得简单。 【描述】"rundeck-hipchat-...
它可以自动处理分片和故障转移,确保数据的高可用性和一致性。在多节点环境下,这一特性显得尤为重要,因为它能帮助开发者构建出更加健壮的系统。 源码的开放性使得开发者有机会根据自身需求进行定制化开发,例如...
- **第二级缓存**:Hibernate支持插件式的缓存策略,可以提高数据访问性能,如Ehcache是常用的二级缓存提供商。 - **事务管理**:提供了对JTA(Java Transaction API)和JDBC事务的支持,确保数据的一致性和完整性...
在Spring Boot应用中,缓存一致性是一个重要的议题,特别是在分布式系统中,多个节点可能同时访问并更新同一数据,导致缓存中的数据不一致。本文将深入探讨Spring Boot中如何处理和解决缓存一致性问题。 首先,我们...
5. **一致性哈希**: 实现了一致性哈希算法,这使得在分布式环境中添加或移除服务器时,可以尽量少地改变缓存数据的映射关系,保持缓存数据的稳定。 6. **超时与重试机制**: `pymemcache`具有内置的超时和重试机制,...
4. 基于一致性哈希的分布式策略:在多台服务器部署时,Memcached使用一致性哈希算法,保证数据迁移时尽可能少地改变映射关系。 四、Memcached的API及使用 1. 客户端库:Memcached提供了多种语言的客户端库,如PHP...
为了获得最佳性能,开发者应合理配置缓存大小、缓存策略(如LRU、FIFO等),并根据业务需求选择合适的缓存更新策略,如事件监听、定时任务等。 6. 注意事项: 虽然缓存可以显著提升性能,但也可能导致数据一致性...
JBoss Cache支持事务一致性,这意味着缓存中的操作可以与数据库操作一起在一个全局的事务中完成,确保数据的一致性。 JBoss Cache的核心特性包括: - 分布式缓存:通过网络在多台服务器之间共享数据,提高性能并...
它包含了运行和构建Spring项目所需的所有外部库,包括但不限于AOP、ORM、Web、Test等模块,确保了开发环境的一致性和可预测性。 接下来,我们来看一下"spring-framework-3.1.0.RELEASE-with-docs.zip",这可能是...
3. 一致性代理和缓存(Coherent Agents and Caches) 4. 内存排序(Memory Ordering) - 保留程序顺序(Preserved Program Order) - 加载值(Load Values) 5. 中断(Traps) - 非法指令和虚拟指令异常(Illegal...
2. **安全的文件操作**:提供安全的文件创建、读取和删除功能,确保缓存文件的完整性和一致性。 3. **缓存管理**:支持缓存文件的生命周期管理,例如过期策略,以便定期清理不再使用的文件。 4. **跨平台兼容**:...
MyBatis-Redis是一个将Redis缓存集成到...需要注意的是,合理地设计缓存策略和粒度,避免因缓存不当导致的问题,如数据一致性问题和内存溢出。同时,监控Redis的使用情况,确保其健康运行,是保证系统稳定性的关键。
- 合理使用缓存策略,避免内存溢出和数据一致性问题。 - 优化查询,避免N+1查询和大数据量的加载。 - 考虑使用Criteria API或HQL代替直接的SQL,以保持代码的可读性和移植性。 总结,Hibernate 4.2.19.Final为...