2023-07-14 18:48:27
使用缓存提高系统性能的核心在于减少重复计算、降低数据库或服务端压力、加速数据访问,通过合理设计缓存策略,可显著提升系统吞吐量和响应速度。以下是具体实现方法及关键注意事项:
一、前端缓存技术前端缓存主要用于减少重复请求,降低服务端压力,适用于静态资源(如图片、CSS、JS)和少量动态数据。
1. 本地缓存协商缓存通过服务端与客户端协商决定是否使用本地缓存,避免重复传输未修改的资源。
实现方式:
基于时间:服务端返回 Last-Modified 字段(资源最后修改时间),客户端请求时携带 If-Modified-Since 字段;若资源未修改,返回 304 Not Modified。
基于唯一标识:服务端返回 ETag(资源哈希值),客户端请求时携带 If-None-Match 字段;若标识一致,返回 304。
适用场景:资源更新频率低但需验证新鲜度的场景(如配置文件)。
强缓存直接使用本地缓存,无需与服务端协商,通过 Expires 或 Cache-Control 控制有效期。
实现方式:
Expires:绝对过期时间(如 Expires: Wed, 21 Oct 2025 07:28:00 GMT),可能因客户端时间不同步失效。
Cache-Control:相对过期时间(如 Cache-Control: max-age=3600 表示1小时后过期),优先级高于 Expires。
适用场景:完全静态的资源(如Logo、库文件)。

服务端缓存主要用于减轻数据库压力,提升数据读取性能,适用于动态数据(如用户信息、报表结果)。
1. 进程缓存实现方式:
JVM堆内存缓存:使用 ConcurrentHashMap、ArrayList 等容器存储数据,或通过 Guava Cache 实现带淘汰策略的缓存。
// Guava Cache示例Cache<String, String> cache = CacheBuilder.newBuilder() .maximumSize(1000) // 最大容量 .expireAfterWrite(10, TimeUnit.MINUTES) // 写入10分钟后过期 .build();cache.put("key", "value");Ehcache:支持磁盘持久化、分布式缓存,适合Hibernate等ORM框架的查询结果缓存。
适用场景:数据量小、更新频率低、无严格一致性要求的场景(如系统配置)。
局限性:
分布式环境下缓存同步困难。
JVM堆内存有限,大容量缓存可能导致OOM。
高性能:读速度超10万次/秒,写速度超8万次/秒。
持久化:支持RDB(快照)和AOF(日志)两种持久化方式。
高可用:通过主从复制和哨兵模式实现故障转移。
先删缓存再更新数据库:减少脏数据时间,但需处理并发删除失败的情况。
队列+异步刷新:通过消息队列(如Kafka)异步更新缓存,避免阻塞主流程。
最终一致性:允许短暂不一致,通过定时任务或事件驱动机制修复。
空值缓存:将查询为空的Key缓存短时间(如1分钟)。
布隆过滤器(BloomFilter):预过滤一定不存在的Key,减少无效查询。
互斥锁:更新缓存时加锁,确保同一时间只有一个请求访问数据库。
逻辑过期:缓存中存储过期时间和数据,访问时判断是否过期,若过期则异步更新。
分散过期时间:为缓存Key添加随机过期时间(如基础时间±10分钟)。
多级缓存:结合本地缓存和分布式缓存,本地缓存作为兜底。
熔断降级:当缓存服务不可用时,直接返回默认值或降级处理。
小数据量、低一致性要求:进程缓存(Guava Cache/Ehcache)。
大数据量、高并发:分布式缓存(Redis)。
合理应用缓存技术可显著提升系统性能,但需根据业务特点权衡一致性、延迟和复杂度。