【问题标题】:How to generate cache CustomKey for Redis in Spring Boot如何在 Spring Boot 中为 Redis 生成缓存 CustomKey
【发布时间】:2021-04-09 02:57:10
【问题描述】:

我有与 Redis 缓存集成的 Spring Boot 应用程序。必须为方法调用之一实现缓存。该方法参数是一个具有多个参数的对象,它是外部请求对象。该对象参数将针对每个请求也基于该参数而变化,并且该方法的输出值是变化的。我需要使用该请求对象字段/参数值创建一个缓存键。如何实现。

只有在方法参数是静态的时候才能使用SimpleKeyGenerator


UserService.java

@Cacheable(value = "usercache", keyGenerator="customKeyGenerator")
public UserResponse getUserResp(User user){

//Some backend calls
return user

}

User.java

public class User {

private String firstname;
private String lastname;
private Integer age;
private Date dob;
private Address address;

// Another 10 params

}

在这个方法实现中,用户对象是动态的。我必须根据具有有效非空值的用户对象字段创建一个缓存键。如何实现。

【问题讨论】:

    标签: spring-boot spring-data-redis


    【解决方案1】:

    我已经实现如下。

    
    User.java
    
    public class User implements Serializable {
    
    private String firstname;
    private String lastname;
    private Integer age;
    private Date dob;
    private Address address;
    
    // Another 10 params
    
    @Override
        public int hashCode() {
            final int prime = 31;
            //Add necessary fields
        }
    
    @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
       //Add necessary fields
    }
    }
    
    
    public class UserKeyGenerator implements KeyGenerator{
        
        private static final String UNDERSCORE_DELIMITER = "_";
    
        @Override
        public Object generate(Object target, Method method, Object... params) {
            
            String cacheKey = null;
            if(params.length > 0) {
                StringJoiner paramStrJoiner = new StringJoiner(UNDERSCORE_DELIMITER);
                User userReq = (User) params[0];
                
                paramStrJoiner.add(target.getClass().getSimpleName());
                paramStrJoiner.add(method.getName());
                paramStrJoiner.add(String.valueOf(userReq.hashCode()));
                cacheKey = paramStrJoiner.toString();
            }
            
            return cacheKey;
        }
        
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 2021-11-02
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      相关资源
      最近更新 更多