美文网首页JFinal极速开发
jfinal中对jedis封装之key处理

jfinal中对jedis封装之key处理

作者: brentwu | 来源:发表于2017-10-30 17:10 被阅读38次

    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处理

      本文链接:https://www.haomeiwen.com/subject/rjfmpxtx.html