如何加缓存java
使用Java内置缓存实现
在Java中可以通过java.util.concurrent.ConcurrentHashMap实现简单的内存缓存。创建一个缓存类,包含put、get和remove方法。
import java.util.concurrent.ConcurrentHashMap;
public class SimpleCache<K, V> {
private final ConcurrentHashMap<K, V> cache = new ConcurrentHashMap<>();
public void put(K key, V value) {
cache.put(key, value);
}
public V get(K key) {
return cache.get(key);
}
public void remove(K key) {
cache.remove(key);
}
}
使用Guava Cache
Google Guava库提供了更强大的缓存实现,支持过期策略和缓存大小限制。添加Guava依赖后创建缓存。
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
public class GuavaCacheExample {
private static final Cache<String, String> cache = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
public static void put(String key, String value) {
cache.put(key, value);
}
public static String get(String key) {
return cache.getIfPresent(key);
}
}
使用Caffeine缓存
Caffeine是高性能Java缓存库,比Guava Cache更快。通过Maven引入依赖后使用。
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
public class CaffeineCacheExample {
private static final Cache<String, Object> cache = Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(5, TimeUnit.MINUTES)
.build();
public static void put(String key, Object value) {
cache.put(key, value);
}
public static Object get(String key) {
return cache.getIfPresent(key);
}
}
使用Spring Cache注解
在Spring Boot项目中,可以通过注解简化缓存操作。首先启用缓存功能。
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
然后在Service方法上使用缓存注解。
@Service
public class BookService {
@Cacheable("books")
public Book getBookByIsbn(String isbn) {
// 模拟数据库查询
return findBookInDatabase(isbn);
}
@CacheEvict(value = "books", key = "#isbn")
public void reloadBook(String isbn) {
// 清除缓存
}
}
使用Redis分布式缓存
对于分布式系统,可以使用Redis作为缓存。通过Spring Data Redis集成。
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(1));
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
}
}
在Service中使用方式与Spring Cache相同,只需更换缓存实现为Redis。
缓存注意事项
缓存键设计要确保唯一性,通常使用业务ID组合作为键。对于高频变化数据,设置较短的过期时间。
定期监控缓存命中率,过低可能表明缓存策略需要调整。大对象考虑压缩后存储,减少内存占用。

多线程环境下注意缓存一致性问题,必要时使用读写锁或版本控制。分布式缓存需处理网络分区和故障转移场景。






