jfinalにおけるjedisパッケージのkey処理

1907 ワード

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が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ストレージ・スキーム