Skip to content

Commit 78f2563

Browse files
committed
修改配置格式并增加redis的json序列化
1 parent 8dbe2fb commit 78f2563

File tree

12 files changed

+195
-51
lines changed

12 files changed

+195
-51
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,9 @@ spring:
298298
cache:
299299
redis:
300300
time-to-live: PT15M #默认缓存15分钟
301-
cache-name-time-to-live: #缓存key的缓存时间
302-
maps:
301+
cache-as-multi:
302+
serialize-to-json: true #使用 RedisSerializer.json() 序列化
303+
cache-name-time-to-live-map: #cacheName对应的缓存时间
303304
foo: PT15S #foo缓存15秒
304305
demo: PT5M #demo缓存5分钟
305306
```
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.github.ms100.cacheasmultisample.cache;
2+
3+
import io.github.ms100.cacheasmultisample.cache.service.Dog;
4+
import io.github.ms100.cacheasmultisample.cache.service.DogService;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.web.bind.annotation.RequestMapping;
7+
import org.springframework.web.bind.annotation.RequestParam;
8+
import org.springframework.web.bind.annotation.RestController;
9+
10+
import java.util.Arrays;
11+
import java.util.List;
12+
import java.util.Map;
13+
14+
@RestController
15+
@RequiredArgsConstructor
16+
@RequestMapping("/dog")
17+
public class DogController {
18+
19+
private final DogService dogService;
20+
21+
@RequestMapping("/getDog")
22+
public Dog getDog(@RequestParam("id") Long dogId) {
23+
return dogService.getDog(dogId);
24+
}
25+
26+
27+
@RequestMapping("/getDogs")
28+
public Map<Long, Dog> getDogs(@RequestParam("ids") Long[] dogIds) {
29+
return dogService.getDogs(Arrays.asList(dogIds));
30+
}
31+
32+
@RequestMapping("/getDogList")
33+
public List<Dog> getDogList(@RequestParam("ids") Long[] dogIds) {
34+
return dogService.getDogList(Arrays.asList(dogIds));
35+
}
36+
37+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.github.ms100.cacheasmultisample.cache.service;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class Dog {
7+
private Long id;
8+
private String name;
9+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.github.ms100.cacheasmultisample.cache.service;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
/**
7+
* @author zhumengshuai
8+
*/
9+
public interface DogService {
10+
Dog getDog(Long dogId);
11+
12+
Map<Long, Dog> getDogs(List<Long> dogIds);
13+
14+
List<Dog> getDogList(List<Long> dogIds);
15+
16+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package io.github.ms100.cacheasmultisample.cache.service;
2+
3+
import io.github.ms100.cacheasmulti.cache.annotation.CacheAsMulti;
4+
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.cache.annotation.CacheConfig;
7+
import org.springframework.cache.annotation.Cacheable;
8+
import org.springframework.stereotype.Component;
9+
10+
import java.util.ArrayList;
11+
import java.util.HashMap;
12+
import java.util.List;
13+
import java.util.Map;
14+
15+
@Component
16+
@RequiredArgsConstructor
17+
@Slf4j
18+
@CacheConfig(cacheNames = "dog")
19+
class DogServiceImpl implements DogService {
20+
21+
@Override
22+
@Cacheable
23+
public Dog getDog(Long dogId) {
24+
log.info("getDog: {}", dogId);
25+
return createDog(dogId);
26+
}
27+
28+
@Override
29+
@Cacheable
30+
public Map<Long, Dog> getDogs(@CacheAsMulti List<Long> dogIds) {
31+
log.info("getDogs: {}", dogIds);
32+
Map<Long, Dog> res = new HashMap<>();
33+
for (Long dogId : dogIds) {
34+
res.put(dogId, createDog(dogId));
35+
}
36+
return res;
37+
}
38+
39+
@Override
40+
@Cacheable
41+
public List<Dog> getDogList(@CacheAsMulti List<Long> dogIds) {
42+
log.info("getDogList: {}", dogIds);
43+
List<Dog> res = new ArrayList<>();
44+
for (Long dogId : dogIds) {
45+
res.add(createDog(dogId));
46+
}
47+
return res;
48+
}
49+
50+
private Dog createDog(Long id) {
51+
Dog dog = new Dog();
52+
dog.setId(id);
53+
dog.setName("name" + id);
54+
55+
return dog;
56+
}
57+
58+
}

cache-as-multi-sample/src/main/resources/application.yaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,17 @@ spring:
77
redis:
88
host: 127.0.0.1
99
port: 6379
10+
password: 123456
1011
cache:
1112
redis:
1213
time-to-live: PT15M
13-
cache-name-time-to-live:
14-
maps:
14+
cache-as-multi:
15+
serialize-to-json: true
16+
cache-name-time-to-live-map:
1517
foo: PT15S
1618
demo: PT5M
1719
newBar: PT1M
20+
dog: PT1M
1821

1922
server:
2023
tomcat:

cache-as-multi/pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<modelVersion>4.0.0</modelVersion>
66
<groupId>io.github.ms100</groupId>
77
<artifactId>cache-as-multi</artifactId>
8-
<version>1.0.0</version>
8+
<version>1.1.0</version>
99

1010
<name>cache-as-multi</name>
1111
<url>http://https://github.com/ms100/cache-as-multi</url>
@@ -53,6 +53,11 @@
5353
<artifactId>spring-boot-starter-data-redis</artifactId>
5454
<optional>true</optional>
5555
</dependency>
56+
<dependency>
57+
<groupId>com.fasterxml.jackson.core</groupId>
58+
<artifactId>jackson-databind</artifactId>
59+
<optional>true</optional>
60+
</dependency>
5661
<dependency>
5762
<groupId>org.springframework.boot</groupId>
5863
<artifactId>spring-boot-configuration-processor</artifactId>

cache-as-multi/src/main/java/io/github/ms100/cacheasmulti/cache/config/EnhancedCacheAutoConfiguration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import io.github.ms100.cacheasmulti.cache.convert.EnhancedCacheConversionService;
44
import io.github.ms100.cacheasmulti.cache.convert.converter.EnhancedCacheConverter;
55
import io.github.ms100.cacheasmulti.jcache.config.EnhancedJCacheConfiguration;
6-
import io.github.ms100.cacheasmulti.support.RedisCacheNameTimeToLiveCustomizer;
6+
import io.github.ms100.cacheasmulti.support.RedisCacheCustomizer;
77
import io.github.ms100.cacheasmulti.support.TypeMethodKeyGenerator;
88
import org.springframework.beans.factory.config.BeanDefinition;
99
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@@ -63,8 +63,8 @@ public TypeMethodKeyGenerator typeMethodKeyGenerator() {
6363
@Bean
6464
@ConditionalOnClass(name = "org.springframework.data.redis.cache.RedisCacheManager")
6565
@ConditionalOnMissingBean
66-
@ConfigurationProperties(prefix = "spring.cache.redis.cache-name-time-to-live")
67-
public RedisCacheNameTimeToLiveCustomizer redisCacheNameTimeToLiveCustomizer() {
68-
return new RedisCacheNameTimeToLiveCustomizer();
66+
@ConfigurationProperties(prefix = "spring.cache.redis.cache-as-multi")
67+
public RedisCacheCustomizer redisCacheCustomizer() {
68+
return new RedisCacheCustomizer();
6969
}
7070
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.github.ms100.cacheasmulti.support;
2+
3+
import lombok.Setter;
4+
import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer;
5+
import org.springframework.data.redis.cache.RedisCacheConfiguration;
6+
import org.springframework.data.redis.cache.RedisCacheManager;
7+
import org.springframework.data.redis.serializer.RedisSerializationContext;
8+
import org.springframework.data.redis.serializer.RedisSerializer;
9+
10+
import java.time.Duration;
11+
import java.util.Collections;
12+
import java.util.Map;
13+
14+
/**
15+
* @author zhumengshuai
16+
*/
17+
public class RedisCacheCustomizer implements RedisCacheManagerBuilderCustomizer {
18+
/**
19+
* 使用 RedisSerializer.json 序列化
20+
*/
21+
@Setter
22+
private boolean serializeToJson = false;
23+
/**
24+
* CacheName 对应的 TTL(PT 时间格式)
25+
*/
26+
@Setter
27+
private Map<String, Duration> cacheNameTimeToLiveMap = Collections.emptyMap();
28+
29+
@Override
30+
public void customize(RedisCacheManager.RedisCacheManagerBuilder builder) {
31+
//用一个假的 cacheName 获取到默认的 RedisCacheConfiguration
32+
builder.initialCacheNames(Collections.singleton("*"));
33+
RedisCacheConfiguration defaultCacheConfiguration = builder.getCacheConfigurationFor("*")
34+
.orElseThrow(NullPointerException::new);
35+
36+
if (serializeToJson) {
37+
defaultCacheConfiguration = defaultCacheConfiguration.serializeValuesWith(
38+
RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));
39+
builder.cacheDefaults(defaultCacheConfiguration);
40+
}
41+
RedisCacheConfiguration finalDefaultCacheConfiguration = defaultCacheConfiguration;
42+
cacheNameTimeToLiveMap.forEach((cacheName, ttl) -> {
43+
RedisCacheConfiguration configuration = finalDefaultCacheConfiguration.entryTtl(ttl);
44+
builder.withCacheConfiguration(cacheName, configuration);
45+
});
46+
}
47+
48+
}

cache-as-multi/src/main/java/io/github/ms100/cacheasmulti/support/RedisCacheNameTimeToLiveCustomizer.java

Lines changed: 0 additions & 35 deletions
This file was deleted.

0 commit comments

Comments
 (0)