这个生成memcache key值的类该如何抽象?
public class CacheHelper {
public String getPrefix() {
return "data_" + this.getClass().getSimpleName();
}
}
public class TipCacheHelper extends CacheHelper {
/* getTipByUserId方法的缓存过期时间*/
public static final long getTipByUserIdKeyExpires = 1L;
/* getTipByUserId缓存key */
public String getTipByUserIdKey(int userId) {
return getPrefix() + "getTipByUserId" + userId;
}
public static final long getTipByOtherKeyExpires = 1L;
public String getTipByOtherKey(int userId) {
return getPrefix() + "_getTipByUserId_" + userId;
}
}
这是项目中用于获取缓存过期时间和key值的类,基本上每个实体类都要对应一个cacheHelper类,里面要针对需要做缓存的数据库方法分别定义expire time 和 key,规则相信大家能看出来,方法名+Expires作为过期时间的字段名,每个类的前缀+方法名+方法参数作为key。
我觉得这代码非常丑而且重复的厉害,而且这是我改过了一部分,原本没有超类,方法都是static的,改了一半发现改不下去了。希望高人指点一二,有什么办法通过类似反射或者其他方式来自动生成这些数据,具有面向对象动态性的特征。谢谢。
----------------------------------纠结的分割线--------------------------------
以下代码是我又重构了一次,关键是 Thread.currentThread().getStackTrace()[2].getMethodName()的使用,还请大家指点。
public class CacheHelper {
public static final String PREFIX = "data_";
public String generateKey(Object...params) {
String invokeMethodName = Thread.currentThread().getStackTrace()[2].getMethodName();
StringBuilder builder = new StringBuilder(64);
builder.append(generatePrefix()).append("_").append(subMethodName(invokeMethodName)).append("_");
int i = 0;
for (Object object : params) {
builder.append(object.toString());
if(++i != params.length) {
builder.append("_");
}
}
return builder.toString();
}
private String subMethodName(String methodName) {
return methodName.substring(0, methodName.lastIndexOf("Key"));
}
public String generatePrefix() {
return PREFIX + this.getClass().getSimpleName();
}
}
public class TipCacheHelper extends CacheHelper{
public String getTipByUserIdKey(int userId) {
return generateKey(userId);
}
public String getTipBybookIdKey(Integer bookId, int fromIndex, int size) {
return generateKey(bookId, fromIndex, size);
}
}
Answers
你的每个需要缓存的类都有userId这个数据吗? 不知道你的业务类如何设计。一个原则,就是KISS(Keep It Simple and Stupid). 不知道为什么你需要两个方法(getTipByOtherKey, getTipByUserId)来生成key。也许你可以像这么做: