com.jfinal.plugin.redis.Cache类封装了jedis的操作。为了支持把java对象作为key或者value存入redis,需要用到jedis的二进制操作方法,比如这个:public String set(final byte[] key, final byte[] value)
jfinal把这个方法封装为public String set(Object key, Object value)
,这是如何实现的呢?
今天先分析key的实现。看set的源码:
...
jedis.set(keyToBytes(key), valueToBytes(value));
...
可见jfinal用keyToBytes
把Object类型的key转为byte数组。
protected byte[] keyToBytes(Object key) {
String keyStr = keyNamingPolicy.getKeyName(key);
return serializer.keyToBytes(keyStr);
}
这个函数的keyNamingPolicy
可以在com.jfinal.plugin.redis.RedisPlugin中使用setKeyNamingPolicy
进行赋值,否则采用com.jfinal.plugin.redis.IKeyNamingPolicy中的默认实现:
static final IKeyNamingPolicy defaultKeyNamingPolicy = new IKeyNamingPolicy() {
public String getKeyName(Object key) {
return key.toString();
}
};
keyToBytes函数中的 serializer和keyNamingPolicy类似,也可在RedisPlugin中赋值,默认的实现是com.jfinal.plugin.redis.serializer.FstSerializer:
public byte[] keyToBytes(String key) {
return SafeEncoder.encode(key);
}
这个SafeEncoder来自jedis:
public static byte[] encode(final String str) {
try {
if (str == null) {
throw new JedisDataException("value sent to redis cannot be null");
}
return str.getBytes(Protocol.CHARSET);
} catch (UnsupportedEncodingException e) {
throw new JedisException(e);
}
}
Protocol.CHARSET = UTF-8。
总结:jfinal对Object类型的key的处理是,用 toString()
方法获得Object的字符串值,然后用UTF-8编码将这个字符串转为字符数组。通过实现IKeyNamingPolicy和ISerializer,你可以实现自己的key生成策略。例如以下这篇中的key生成策略:
网友评论