# springboot-cache
**Repository Path**: marquis001/springboot-cache
## Basic Information
- **Project Name**: springboot-cache
- **Description**: 多级缓存使用。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 2
- **Created**: 2018-12-06
- **Last Updated**: 2022-10-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# springboot-cache
#### 项目介绍
多级缓存使用。
#### 软件架构
redis
ehcache
#### 安装教程
1. ehcache 缓存
```
1) Maven依赖
org.springframework.boot
spring-boot-starter-cache
org.ehcache
ehcache
3.3.0
2)类配置
3)xml配置
ehcache.xml
java.lang.String
java.lang.String
1
1
1
20
60
500
配置类中加载:
System.out.println("[Ehcache配置初始化<开始>]");
// 配置默认缓存属性
cacheManager = CacheManagerBuilder.newCacheManager(new XmlConfiguration(getClass().getResource("/ehcache.xml")));
cacheManager.init();
System.out.println("[Ehcache配置初始化<完成>]");
配置到application.yml中:
spring:
cache:
ehcache:
config: ehcache.xml
4)代码测试
5)注解测试
@Service
public class EhCacheService {
@Cacheable(value="test")
public String readCache(){
System.out.println("是否缓存,如果没有执行,说明缓存了");
return "1234";
}
@CachePut(value="test")
public String update() {
//更新缓存,将会改变内容
System.out.println("缓存更新了");
return "456";
}
@CacheEvict(value="test",allEntries = true)
public void deleteAll() {
System.out.println("移除所有缓存");
}
}
6) 控制器代码
@RestController
@RequestMapping("/ehcache")
public class EhCacheController {
@Autowired
public EhCacheService ehCacheService;
@GetMapping("/read")
public String readEhCache(){
return ehCacheService.readCache();
}
@GetMapping("/deleteAll")
public String deleteAll(){
ehCacheService.deleteAll();
return "移除成功";
}
@GetMapping("/update")
public String update(){
ehCacheService.update();
return "更新成功";
}
}
```
2. 集成Redis
```
1)Maven依赖
org.springframework.boot
spring-boot-starter-data-redis
org.apache.commons
commons-pool2
2.4.2
2)配置类
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
@Slf4j
public class RedisCacheConfiguration {
/**
* 缓存模板
* @param lettuceConnectionFactory
* @return
*/
@Bean
public RedisTemplate redisCacheTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
RedisTemplate template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setConnectionFactory(lettuceConnectionFactory);
return template;
}
/**
* 缓存管理器
* @param lettuceConnectionFactory
* @return
*/
@Bean
public CacheManager cacheManager(LettuceConnectionFactory lettuceConnectionFactory) {
RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(lettuceConnectionFactory);
@SuppressWarnings("serial")
Set cacheNames = new HashSet() {
{
add("codeNameCache");
}
};
builder.initialCacheNames(cacheNames);
return builder.build();
}
}
3)配置文件
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
# 连接超时时间(毫秒)
spring.redis.timeout=10000
# Redis默认情况下有16个分片,这里配置具体使用的分片
spring.redis.database=0
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0
4)测试类
// TODO 测试线程安全
ExecutorService executorService = Executors.newFixedThreadPool(1000);
IntStream.range(0, 1000).forEach(i ->
executorService.execute(() -> stringRedisTemplate.opsForValue().increment("kk", 1))
);
stringRedisTemplate.opsForValue().set("k1", "v1");
final String k1 = stringRedisTemplate.opsForValue().get("k1");
log.info("[字符缓存结果] - [{}]", k1);
// TODO Redis支持的命令它都支持
String key = "battcn:user:1";
redisCacheTemplate.opsForValue().set(key, new User(1L, "u1", "pa"));
// TODO 对应 String(字符串)
final User user = (User) redisCacheTemplate.opsForValue().get(key);
log.info("[对象缓存结果] - [{}]", user);
}
```
3. 多级缓存整合
```
1)消息类
@Data
public class CacheMessage implements Serializable {
private static final long serialVersionUID = 5987219310442078193L;
private String cacheName;
private Object key;
private Integer sender;
public CacheMessage(String cacheName, Object key) {
super();
this.cacheName = cacheName;
this.key = key;
}
public CacheMessage(String cacheName, Object key, Integer sender) {
super();
this.cacheName = cacheName;
this.key = key;
this.sender = sender;
}
}
2)自定义缓存类
@Slf4j
public class RedisEhcacheCache extends AbstractValueAdaptingCache {
private String name;
private RedisTemplate