jfinalにおけるjedisパッケージのkey処理
1907 ワード
com.jfinal.plugin.redis.Cacheクラスはjedisの操作をカプセル化した.Javaオブジェクトをkeyまたはvalueとしてredisに格納することをサポートするためには、jedisのバイナリ操作方法、例えばこれ:
今日はまずkeyの実現を分析します.setのソースコードを見てください.
jfinalがObjectタイプのkeyを
この関数の
keyToBytes関数のserializerはkeyNamingPolicyと同様に、RedisPluginに値を割り当てることもでき、デフォルトの実装はcomである.jfinal.plugin.redis.serializer.FstSerializer:
このSafeEncoderはjedisから来ました.
Protocol.CHARSET = UTF-8.
まとめ:jfinalのObjectタイプに対するkeyの処理は、
Redis 100億Keyストレージ・スキーム
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がObjectタイプのkeyを
keyToBytes
で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生成ポリシーを示します.Redis 100億Keyストレージ・スキーム