jfinal中对jedis封装之key处理

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生成策略:

Redis百亿级Key存储方案

你可能感兴趣的:(jfinal中对jedis封装之key处理)