【redis】fastjsonでのFastJsonRedisSerializer学習
4625 ワード
FastJsonRedisSerializerのJava Objectへのredisの書き込みと読み取りの操作サポート
シーン
redisの勉強を始める
勉強を始めたばかりの頃はredisのRedisTemplateを使っていましたが、これは上手です.
これはStirngのkeyで、Stringのvalueが保存されています.その时、私は単点ログインシステムを作っていました.保存したいvalueはJava Objectで、この时、Java Objectの書き込みと読み取りをどのように行うかという問題に遭遇しました.
問題が発生
書き込みは簡単ですが、Java ObjectをtoString()メソッドで書き換えて、Stringでredisに書き込むことができますが、読み込むときに面倒な問題が発生しました.Javaデフォルトで生成されたtoString()書き換えメソッドで、このフォーマットが出てきました.
後続の操作はJava Objectを使うので、この文字列を読み込んでJava Objectに復元するのは頭が痛い問題ですが、デフォルトの方法で生成される文字列はjson形式ではありませんので、json解析でオブジェクトを取得することはできません.万一、後でモデルがデータベーステーブルの変更によって再生成された場合、モデルはもう一度変更されます.
解決策
資料を読むとき、方向にはシーケンス化ツールクラスで解決する解決方法があり、核心思想は原生のJedisで操作され、同時に書き込まれたkeyとvalueはbyte[]タイプである.このときfastjsonパッケージにシーケンス化と逆シーケンス化をサポートするクラスFastJsonRedisSerializerが見つかりました.書き込みと読み取りの使用は簡単ですが、
書き込み:
読み込み:
これは最も直接的な使用方法で、ツールクラスにカプセル化して使用することができます.
PS
Javaが持参したシーケンス化と逆シーケンス化は効率的ではないと言われ、スペースも大きいのでお勧めしません.
シーケンス化
逆シーケンス化
シーン
redisの勉強を始める
勉強を始めたばかりの頃はredisのRedisTemplateを使っていましたが、これは上手です.
@Autowired private RedisTemplate redisTemplate;
ValueOperations<String, String> vo = redisTemplate.opsForValue();
vo.set("mykey", "this is a value");// redis
これはStirngのkeyで、Stringのvalueが保存されています.その时、私は単点ログインシステムを作っていました.保存したいvalueはJava Objectで、この时、Java Objectの書き込みと読み取りをどのように行うかという問題に遭遇しました.
問題が発生
書き込みは簡単ですが、Java ObjectをtoString()メソッドで書き換えて、Stringでredisに書き込むことができますが、読み込むときに面倒な問題が発生しました.Javaデフォルトで生成されたtoString()書き換えメソッドで、このフォーマットが出てきました.
SessionUser{id='1', token='c6f91e444dd3e7ab91541394bc5aa5f8', createTime=1529374760832, lastLoginTime=1529374941717}
後続の操作はJava Objectを使うので、この文字列を読み込んでJava Objectに復元するのは頭が痛い問題ですが、デフォルトの方法で生成される文字列はjson形式ではありませんので、json解析でオブジェクトを取得することはできません.万一、後でモデルがデータベーステーブルの変更によって再生成された場合、モデルはもう一度変更されます.
解決策
資料を読むとき、方向にはシーケンス化ツールクラスで解決する解決方法があり、核心思想は原生のJedisで操作され、同時に書き込まれたkeyとvalueはbyte[]タイプである.このときfastjsonパッケージにシーケンス化と逆シーケンス化をサポートするクラスFastJsonRedisSerializerが見つかりました.書き込みと読み取りの使用は簡単ですが、
書き込み:
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(SessionUser.class);
jedis.set(user.getId().getBytes(), fastJsonRedisSerializer.serialize(sessionUser));
読み込み:
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(SessionUser.class);
SessionUser sessionUser = (SessionUser) fastJsonRedisSerializer.deserialize(vo.get(userId).getBytes());
これは最も直接的な使用方法で、ツールクラスにカプセル化して使用することができます.
public static byte[] getByteArrFromObj(Object obj, Class clazz) {
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(clazz);
return fastJsonRedisSerializer.serialize(obj);
}
public static Object getObjFromByteArr(byte[] byteArr, Class clazz) {
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(clazz);
return fastJsonRedisSerializer.deserialize(byteArr);
}
PS
Javaが持参したシーケンス化と逆シーケンス化は効率的ではないと言われ、スペースも大きいのでお勧めしません.
シーケンス化
Object obj = new Object();// object
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
return bytes;
逆シーケンス化
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();