これは、一度シリアライズ方法の異なる種類を使用するために、キーのRedis
デフォルトさらにツールの所与のタイプ(配列はスプリングRedisTemplateのデシリアライゼーション高速の比と言われている)から、以下の配列によって修飾使用、JdkSerializationRedisSerializer、StringRedisSerializer
輸入com.dyuproject.protostuff.LinkedBuffer; 輸入com.dyuproject.protostuff.ProtostuffIOUtil; 輸入com.dyuproject.protostuff.Schema; 輸入com.dyuproject.protostuff.runtime.RuntimeSchema; 輸入org.springframework.data.redis.serializer.RedisSerializer; 輸入org.springframework.data.redis.serializer.SerializationException。 パブリック クラス ProtostuffSerializer 実装 RedisSerializer <OBJECT> { プライベート ブールのisEmpty(バイト[]データ){ リターン(データ== NULL || data.length == 0 )。 } 民間 最終スキーマ<ProtoWrapper> スキーマ。 民間 最終ProtoWrapperラッパー。 民間 最終LinkedBufferバッファと、 パブリックProtostuffSerializer(){ この .wrapper = 新しいProtoWrapper()。 この .schema = RuntimeSchema.getSchema(ProtoWrapper。クラス)。 この .buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE)。 } @Override 公共 バイト []シリアライズ(オブジェクトt)はスローSerializationException { 場合(Tは==NULL ){ 戻り 新しい バイト [0 ]。 } wrapper.data = T。 試す{ 戻りProtostuffIOUtil.toByteArray(ラッパー、スキーマ、バッファ)。 } 最後に{ buffer.clear()。 } } @Override パブリックオブジェクトデシリアライズ(バイト []バイト)スローSerializationException { 場合(のisEmpty(バイト)){ 戻り ヌル。 } ProtoWrapper newMessage = schema.newMessage()。 ProtostuffIOUtil.mergeFrom(バイト、newMessage、スキーマ)。 返すnewMessage.dataを。 } プライベート 静的 クラスProtoWrapper { パブリックオブジェクトデータ、 } }
私は、次の例外が発生しました:
ハッシュ操作:java.lang.ClassCastExceptionが:java.lang.Integerのではないjava.lang.Stringでにキャストできる、別のためのこの時間後、シリアライゼーションクラスのハッシュ
template.setHashValueSerializer(新しい Jackson2JsonRedisSerializer <>(オブジェクト。クラス));
ハッシュ値を使用ProtostuffSerializerのシーケンスの最後には、次の操作を与えられたので、
HashOperations <文字列、文字列、T> hashOperations = redisTemplate.opsForHash()。 もし(値のinstanceofロング||値instanceofの整数||値のinstanceofショート||値のinstanceof バイト) { 長いのlongValue = ((番号)値).longValue(); hashOperations.increment(キー、フィールド、のlongValue)。 } であれば(値のinstanceofフロート||値instanceofの ダブル) { 二重のdoubleValue = ((番号)値).doubleValue(); ダブル返さ= hashOperations.increment(キー、フィールド、-0.005 )。 } 戻り hashOperations。
报错如下:io.lettuce.core.RedisCommandExecutionException:ERRのハッシュ値が有効な浮動小数点数ではありません
、ProtostuffSerializerが変形されたハッシュ値のシーケンスの後にあるため、プログラミング、\ X0A = \データ\ X5A \ X43 XC形式、数値計算誤差。
注:Redisのデータが変換に関連してのみ、long double型とをサポートし、インクリメント操作を終了します。
たとえば、著者は、コードを次のエラーは次のようになります。
パブリック <T> T getCacheHashValue(文字列キー、文字列フィールド、クラス<T> targetClass){ HashOperations <文字列、文字列、T> hashOperations = redisTemplate.opsForHash()。 リターンhashOperations.get(キー、フィールド); }
求心性
フロートバランス= cacheService.getCacheHashValue(cacheKey、 "バランス"、フロート。クラス)。
エラー:
java.lang.ClassCastExceptionが:によって引き起こさjava.lang.Doubleのはjava.lang.Floatのにキャストすることはできません
redisTemplate関連記事:
springbootプロジェクトのシーケンスをマッピングするために、スプリング・データ・Redisの与えられた時間を利用して
使用redisTemplateデータを格納し、そこに\ XAC \ XED \ X00 \ x05t \ X00