0

我想为我的应用程序设置一个自定义缓存键前缀,它为我的 RedisCacheManager 使用 xml 配置,我的目标是,如果缓存键是学生详细信息,则缓存键应该是 test :: student-detail 或 prod :: student -detail,我已经将 usePrefix 设置为 true,但是我找不到定义实际键值的方法。下面是我的 cacheManager 配置的摘录。

<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"
      c:redisOperations-ref="redisTemplate"
      c:defaultExpiration=3600
      c:usePrefix="true">
</bean>

有关信息,我知道在 Spring Boot 中就像在应用程序属性中设置一个属性一样简单:

spring.cache.redis.key-prefix=some::
spring.cache.redis.use-key-prefix=true

只是为了说明我为什么要针对非 Spring Boot Java 应用程序进行说明。

4

1 回答 1

0

解决方案是通过实现 RedisCachePrefix 来创建您的自定义 redis 缓存前缀。请参见下面的代码

package com.cache.custom.utils;

import com.morgan.design.properties.ReloadableProperty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.cache.RedisCachePrefix;
import org.springframework.data.redis.serializer.StringRedisSerializer;

public class MyRedisCachePrefix implements RedisCachePrefix {
/** The Prefix */
@ReloadableProperty("prefixString")
private String personalPrefixString;

/** The key string redis serializer */
@Autowired
String StringRedisSerializer stringRedisSerializer;

/** The delimiter */
private final String delimiter = "::";

@Override
public byte[] prefix(String cacheName) {
  return stringRedisSerializer.serialize(personalPrefixString.concat(":").concat(cacheName).concat(this.delimiter));
}
}

然后在 xml 上:

<bean id=stringRedisSerializer"
      class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
<bean id="redisCachePrefix"
      class="com.cache.custom.utils.MyRedisCachePrefix"/>
<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"
      c:redisOperations-ref="redisTemplate"
      p:defaultExpiration=3600
      p:usePrefix="true"
      p:cachePrefix-ref="redisCachePrefix"
>
</bean>

注意:personalPrefixString 值将从前缀字符串的属性文件条目中获取。如果 prefixString 值是 testing 并且 cacheName 是 student-details-cache 那么你的缓存键将以 : testing:student-details-cache:: 为前缀

于 2021-02-24T00:49:44.870 回答