提交 2a892bd0 作者: 方治民

feat: 增加 Redis 操作序列化配置、缓存配置、实用技巧文档

上级 0b79e58c
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
<!-- prettier-ignore --> <!-- prettier-ignore -->
- [开发规范说明](./doc/workflow.md) - [开发规范说明](./doc/workflow.md)
- [技术栈说明](./doc/technique.md) - [技术栈说明](./doc/technique.md)
- [实用技巧](./doc/skill.md)
--- ---
......
dependencies { dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'org.springframework.boot:spring-boot-starter-data-redis'
// hutool-crypto
implementation "cn.hutool:hutool-crypto:${hutoolVersion}"
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.common.config;
import cn.hutool.crypto.digest.DigestUtil;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.stereotype.Component;
/**
* Cache KeyGenerator
*
* @author Jim
* @version 0.1
* 2022/4/19 15:36
*/
@Slf4j
@Component
public class CacheKeyGenerator implements KeyGenerator {
@Override
@NonNull
public Object generate(Object target, Method method, Object... params) {
int len = params.length;
Map<String, Object> map = new HashMap<>(2 + len);
map.put("target", target.getClass().toGenericString());
map.put("method", method.getName());
for (int i = 0; i < len; i++) {
map.put("params-" + i, Objects.toString(params[i]));
}
return DigestUtil.sha256(map.toString());
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.common.config;
import java.time.Duration;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* Redis Config
*
* @author Jim
* @version 0.1
* 2022/4/19 15:27
*/
@EnableCaching
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setEnableTransactionSupport(false);
redisTemplate.setConnectionFactory(factory);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration config = RedisCacheConfiguration
.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(5))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())
)
.disableCachingNullValues();
return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).transactionAware().build();
}
}
## 实用技巧
> Swagger 文档进行文件下载
```diff
# 将下载接口上的 @ApiOperation 注解中的 produces 属性值改为 application/octet-stream
- @ApiOperation(value = "文件下载")
+ @ApiOperation(value = "文件下载", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
```
> Redis 使用
```diff
+ @Resource
+ Redis redis;
+ Object value = redis.get(key);
```
> Excel 导入/导出,使用 [MyExcel](https://github.com/liaochong/myexcel) 工具库
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论