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存储方案

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • 本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概...
    kelgon阅读 61,281评论 23 625
  • 1.1 资料 ,最好的入门小册子,可以先于一切文档之前看,免费。 作者Antirez的博客,Antirez维护的R...
    JefferyLcm阅读 17,120评论 1 51
  • 记得一位作家说,一个人的生命中有两个“我”,一个是行走坐卧的我,一个是隐藏于心的我。前者在明,后者在暗。有人无人处...
    禾必呢阅读 340评论 0 4
  • alt+f7查找在哪里使用 相当于eclipse的ctrl+shift+G command+alt+f7 这个是查...
    孑孖阅读 1,948评论 0 1