Spring boot + Redis - 生成一个奇怪的密钥
Spring boot + Redis - Generating a strange key
我正在使用 Spring-boot + Redis 将我的数据存储在缓存中。
我的控制器有这个配置:
public class CacheController {
@GetMapping("/{key}")
@Cacheable(value = "myCacheValue", keyGenerator = "customKeyGenerator")
public String getByKey(@PathVariable("key") String key) {
return key + System.currentTimeMillis();
}
}
我的自定义密钥生成器是:
public class CustomKeyGenerator implements KeyGenerator {
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getSimpleName())
.append("-")
.append(method.getName());
if (params != null) {
for (Object param : params) {
sb.append("-")
.append(param.getClass().getSimpleName())
.append(":").append(param);
}
}
return sb.toString();
}
}
当我在我的 redis 中连接时,我有这个密钥:
1 - redis-cli --raw
KEYS *
myCacheValue~keys
��t$CacheController-getByKey-String:key9
2 - redis-cli
KEYS *
myCacheValue~keys
\xac\xed\x00\x05t\x00$CacheController-getByKey-String:key9
为什么这个字符出现在 "CacheController" 之前?
注意: 我的密钥生成器以我的 Class 名字开头。
我希望我的键名只是这样的:
CacheController-getByKey-String:myKey
从 doc,您可以使用 RedisCacheConfiguration
Bean 来自定义您的 redisCacheManager
:
@Configuration
public class CacheConfiguration {
@Bean
public RedisCacheConfiguration redisCacheConfiguration() {
return RedisCacheConfiguration.defaultCacheConfig();
}
}
默认配置为:
public static RedisCacheConfiguration defaultCacheConfig() {
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
registerDefaultConverters(conversionService);
return new RedisCacheConfiguration(Duration.ZERO, true, true, CacheKeyPrefix.simple(),
SerializationPair.fromSerializer(new StringRedisSerializer()),// this will use string as the key serializer
SerializationPair.fromSerializer(new JdkSerializationRedisSerializer()), conversionService);
}
我解决了我的问题。
我正在搜索并找到 .
我更改了我的代码以使用 RedisTemplate 的一些属性:
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(cf);
configureSerializers(redisTemplate);
JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) cf;
JedisPoolConfig actualPoolConfig = jedisConnectionFactory.getPoolConfig();
jedisConnectionFactory.setPoolConfig(createJedisPoolConfig(actualPoolConfig));
return redisTemplate;
}
private void configureSerializers(RedisTemplate<String, String> redisTemplate) {
RedisSerializer<String> serializerKey = new StringRedisSerializer();
redisTemplate.setKeySerializer(serializerKey);
redisTemplate.setHashKeySerializer(serializerKey);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
om.configure(
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jackson2JsonRedisSerializer.setObjectMapper(om);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
}
问题是因为默认Serializer是"JdkSerializationRedisSerializer",现在我使用"StringRedisSerializer"来生成一个key。
为了产生价值,我使用 "Jackson2JsonRedisSerializer" 在 JsonValue 中转换我的数据。
现在,我的钥匙没有 "strange" 个字符。
我正在使用 Spring-boot + Redis 将我的数据存储在缓存中。
我的控制器有这个配置:
public class CacheController {
@GetMapping("/{key}")
@Cacheable(value = "myCacheValue", keyGenerator = "customKeyGenerator")
public String getByKey(@PathVariable("key") String key) {
return key + System.currentTimeMillis();
}
}
我的自定义密钥生成器是:
public class CustomKeyGenerator implements KeyGenerator {
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getSimpleName())
.append("-")
.append(method.getName());
if (params != null) {
for (Object param : params) {
sb.append("-")
.append(param.getClass().getSimpleName())
.append(":").append(param);
}
}
return sb.toString();
}
}
当我在我的 redis 中连接时,我有这个密钥:
1 - redis-cli --raw
KEYS *
myCacheValue~keys
��t$CacheController-getByKey-String:key9
2 - redis-cli
KEYS *
myCacheValue~keys
\xac\xed\x00\x05t\x00$CacheController-getByKey-String:key9
为什么这个字符出现在 "CacheController" 之前?
注意: 我的密钥生成器以我的 Class 名字开头。
我希望我的键名只是这样的: CacheController-getByKey-String:myKey
从 doc,您可以使用 RedisCacheConfiguration
Bean 来自定义您的 redisCacheManager
:
@Configuration
public class CacheConfiguration {
@Bean
public RedisCacheConfiguration redisCacheConfiguration() {
return RedisCacheConfiguration.defaultCacheConfig();
}
}
默认配置为:
public static RedisCacheConfiguration defaultCacheConfig() {
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
registerDefaultConverters(conversionService);
return new RedisCacheConfiguration(Duration.ZERO, true, true, CacheKeyPrefix.simple(),
SerializationPair.fromSerializer(new StringRedisSerializer()),// this will use string as the key serializer
SerializationPair.fromSerializer(new JdkSerializationRedisSerializer()), conversionService);
}
我解决了我的问题。
我正在搜索并找到
我更改了我的代码以使用 RedisTemplate 的一些属性:
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(cf);
configureSerializers(redisTemplate);
JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) cf;
JedisPoolConfig actualPoolConfig = jedisConnectionFactory.getPoolConfig();
jedisConnectionFactory.setPoolConfig(createJedisPoolConfig(actualPoolConfig));
return redisTemplate;
}
private void configureSerializers(RedisTemplate<String, String> redisTemplate) {
RedisSerializer<String> serializerKey = new StringRedisSerializer();
redisTemplate.setKeySerializer(serializerKey);
redisTemplate.setHashKeySerializer(serializerKey);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
om.configure(
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jackson2JsonRedisSerializer.setObjectMapper(om);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
}
问题是因为默认Serializer是"JdkSerializationRedisSerializer",现在我使用"StringRedisSerializer"来生成一个key。 为了产生价值,我使用 "Jackson2JsonRedisSerializer" 在 JsonValue 中转换我的数据。
现在,我的钥匙没有 "strange" 个字符。