ホームページ  >  記事  >  データベース  >  Redis をシリアル化する必要があるのはなぜですか?

Redis をシリアル化する必要があるのはなぜですか?

(*-*)浩
(*-*)浩オリジナル
2019-11-22 10:33:048949ブラウズ

Redis をシリアル化する必要があるのはなぜですか?

#シリアル化の最終的な目的は、オブジェクトをプラットフォーム間で保存し、ネットワーク経由で送信できるようにすることです。 クロスプラットフォームのストレージとネットワーク伝送を実行する方法は IO であり、IO でサポートされるデータ形式はバイト配列です。 (推奨学習: Redis ビデオ チュートリアル )

上記を通じて、「クロスプラットフォーム ストレージ」と「ネットワーク送信」を必要とするデータはすべてシリアル化する必要があることをすでにご存知だと思います。

本質的に、ストレージとネットワーク送信の両方で、オブジェクトの状態をクロスプラットフォームで認識されるバイト形式で保存する必要があり、その後、他のプラットフォームがバイト情報を通じてオブジェクト情報を解析して復元できるようになります。

redis シリアル化メソッドの比較:

redis のデフォルトのメソッドは JdkSerializationRedisSerializer です

JdkSerializationRedisSerializer: によって提供されるシリアル化を使用します。 JDK関数。

利点は、逆シリアル化するときに型情報 (クラス) を提供する必要がないことですが、欠点は、Serializable インターフェイスを実装する必要があることです。 、JSON 形式 5 回程度、これにより Redis サーバーのメモリが大量に消費されます。

Jackson2JsonRedisSerializer: Jackson ライブラリを使用して、オブジェクトを JSON 文字列にシリアル化します。

利点は、高速であり、シリアル化された文字列が短くて簡潔であり、Serializable インターフェイスを実装する必要がないことです。

しかし、欠点も非常に致命的です。つまり、このクラスのコンストラクターには型パラメーターがあり、シリアル化するオブジェクト (.class オブジェクト) の型情報を提供する必要があります。ソース コードを確認すると、逆シリアル化プロセス中にのみ型情報が使用されることがわかりました。

問題: デフォルトの JDK シリアル化方法を使用すると、RDM ツールで k-v 値を表示すると「文字化け」が表示され、表示が不便になります。

解決策: シリアル化メソッドをカスタマイズし、Jackson2JsonRedisSerializer を使用します

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Redis配置
 *
 * @author LinJie
 */
@Configuration
public class RedisConfig {

    /**
     * Redis repository redis repository.
     *
     * @param redisTemplate the redis template
     * @return the redis repository
     */
    @Bean
    public RedisRepository redisRepository(RedisTemplate redisTemplate) {
        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        redisTemplate.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return new RedisRepository(redisTemplate);
    }
}

Redis 関連の技術記事の詳細については、Redis データベース使用法チュートリアル 列を参照してください。勉強しなさい!

以上がRedis をシリアル化する必要があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。