J2Cache 是一个由 OSChina 开发的两级缓存框架,旨在解决高并发场景下的缓存性能问题。它通过整合本地缓存(L1)和分布式缓存(L2),有效降低对分布式缓存的访问压力,同时保证缓存数据的一致性和高可用性。以下是关于 J2Cache 的详细介绍和使用示例:
1. J2Cache 的核心特性
- 两级缓存结构:
- L1(一级缓存):进程内缓存,支持 Caffeine、Ehcache 2.x 和 Ehcache 3.x。
- L2(二级缓存):集中式缓存,支持 Redis 和 Memcached。
- 数据读取顺序:L1 → L2 → DB,优先从本地缓存读取数据,减少对分布式缓存的访问。
- 缓存一致性:通过 Redis Pub/Sub 或 JGroups 实现缓存更新通知,确保多节点缓存数据的一致性。
- 高可用性:支持动态调整缓存策略,适应不同业务场景。
- 低延迟:通过本地缓存减少网络开销,提升数据读取速度。
2. J2Cache 的使用场景
- 高并发场景:如电商、社交平台等需要频繁读取缓存的业务。
- 集群环境:多节点共享缓存数据,避免缓存雪崩。
- 单机环境:通过本地缓存避免应用重启导致的缓存冷启动问题。
3. J2Cache 的配置与使用
3.1 依赖引入
在 Maven 项目中引入 J2Cache 的依赖:
<dependency>
<groupId>net.oschina.j2cache</groupId>
<artifactId>j2cache-spring-boot2-starter</artifactId>
<version>2.8.0-release</version>
</dependency>
<dependency>
<groupId>net.oschina.j2cache</groupId>
<artifactId>j2cache-core</artifactId>
<version>2.8.0-release</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
3.2 配置文件
在 application.yml
中配置 J2Cache:
j2cache:
# 一级缓存配置
L1:
provider_class: caffeine
# 二级缓存配置
L2:
provider_class: net.oschina.j2cache.cache.support.redis.SpringRedisProvider
config_section: lettuce
# Redis 配置
redis-client: lettuce
l2-cache-open: true
broadcast: net.oschina.j2cache.cache.support.redis.SpringRedisPubSubPolicy
sync_ttl_to_redis: true
default_cache_null_object: false
serialization: fst
spring:
redis:
host: 127.0.0.1
password: 123456
port: 6379
database: 0
3.3 代码示例
以下是一个简单的 Spring Boot 控制器示例,展示如何使用 J2Cache:
@RestController
@RequestMapping("/cache")
public class MyController {
@Autowired
private CacheChannel cacheChannel;
@GetMapping("/get")
public List<String> getData() {
CacheObject cacheObject = cacheChannel.get("region", "key");
if (cacheObject.getValue() == null) {
// 从数据库获取数据
List<String> data = Arrays.asList("data1", "data2");
cacheChannel.set("region", "key", data);
return data;
}
return (List<String>) cacheObject.getValue();
}
@GetMapping("/evict")
public String evictCache() {
cacheChannel.evict("region", "key");
return "Cache evicted";
}
}
4. J2Cache 的优势
- 降低 Redis 压力:通过本地缓存减少对 Redis 的访问,避免带宽瓶颈。
- 灵活配置:支持多种缓存实现和消息通知机制。
- 高一致性:通过 Redis Pub/Sub 或 JGroups 实现缓存同步。
- 易于集成:提供 Spring Boot Starter,简化配置和使用。
5. 常见问题与解决方案
- 缓存雪崩:通过本地缓存和分布式缓存结合,避免缓存集中失效。
- 缓存穿透:设置默认值或布隆过滤器,防止无效请求穿透到数据库。
- 缓存一致性:使用 Redis Pub/Sub 或 JGroups 实现缓存更新通知。