JFinal

登录 注册
JFinal 已连续多年蝉联最受欢迎中国开源软件冠军,投出您宝贵的一票今年继续夺冠! 评选传送门

Redis_Cache 让key和value 都不反序列化

在自己项目下 创建一个 com.jfinal.plugin.redis.Cache.java 然后把源码中的 Cache.java 复制过来

例如原先需要序列化的地方

/**
 * 将哈希表 key 中的域 field 的值设为 value 。
 * 如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。
 * 如果域 field 已经存在于哈希表中,旧值将被覆盖。
 */
public Long hset(Object key, Object field, Object value) {
   Jedis jedis = getJedis();
   try {
      return jedis.hset(keyToBytes(key), fieldToBytes(field), valueToBytes(value));
   }
   finally {close(jedis);}
}
// 自己重载一个方法
public Long hset(String key, String field, String value) {
   Jedis jedis = getJedis();
   try {
      return jedis.hset(key, field, value);
   }
   finally {close(jedis);}
}


评论

  • 01-01 10:51
    还有一种简单的办法,就是通过实现 ISerializer 接口并定制序列化和反序列化的策略,然后通过 redisPlugin.setSerializer(...) 设置一下就可以了

    此外,还可以通过实现 IKeyNamingPolicy 接口,对 key 的命令策略进行定制
  • 01-01 17:32
    @JFinal 实现 ISerializer 并设置的确挺简单的
    代码
    import com.jfinal.plugin.redis.serializer.ISerializer;

    public class MySerializer implements ISerializer {

    public byte[] keyToBytes(String key) {
    return key.getBytes();
    }

    public String keyFromBytes(byte[] bytes) {
    return new String(bytes);
    }

    public byte[] fieldToBytes(Object field) {
    return field.toString().getBytes();
    }

    public Object fieldFromBytes(byte[] bytes) {
    return new String(bytes);
    }

    public byte[] valueToBytes(Object value) {
    return value.toString().getBytes();
    }

    public Object valueFromBytes(byte[] bytes) {
    return new String(bytes);
    }
    }
  • 01-01 17:53
    @龙天蝎 这做扩展理更大的好处是便于无缝升级到 jfinal 高版本
  • 08-17 18:42
    @JFinal 这边做序列化是出于什么原因?为了数据加密?
  • 08-17 22:44
    @yjjdick1990 redis 只支持 byte[] 与 String 两种数据类型的存放,但是 java 除了 byte、int、long、char、short、double、float 等基本类型以外,还支持 User、Account、Article 等等无限多的数据类型需要存放

    那么 redis 就无法满足需求,只好将不能存放的类型转换成可以存放的类型,这个转换的操作就是序列化
  • 发送