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);}
}


评论区

JFinal

2017-01-01 10:51

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

此外,还可以通过实现 IKeyNamingPolicy 接口,对 key 的命令策略进行定制

龙天蝎

2017-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);
}
}

JFinal

2017-01-01 17:53

@龙天蝎 这做扩展理更大的好处是便于无缝升级到 jfinal 高版本

yjjdick1990

2017-08-17 18:42

@JFinal 这边做序列化是出于什么原因?为了数据加密?

JFinal

2017-08-17 22:44

@yjjdick1990 redis 只支持 byte[] 与 String 两种数据类型的存放,但是 java 除了 byte、int、long、char、short、double、float 等基本类型以外,还支持 User、Account、Article 等等无限多的数据类型需要存放

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

热门分享

扫码入社