redis redistemplate序列化對象配置方式
  更新時間:2023年12月20日 09:46:48   作者:aitxiaogang   
                        這篇文章主要介紹了redis redistemplate序列化對象配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
                        redis redistemplate序列化對象配置
@Configuration
public class RedisConfig {
    /**
     * 重寫Redis序列化方式,使用Json方式:
     * 當(dāng)我們的數(shù)據(jù)存儲到Redis的時候,我們的鍵(key)和值(value)都是通過Spring提供的Serializer序列化到數(shù)據(jù)庫的。RedisTemplate默認(rèn)使用的是JdkSerializationRedisSerializer,StringRedisTemplate默認(rèn)使用的是StringRedisSerializer。
     * Spring Data JPA為我們提供了下面的Serializer:
     * GenericToStringSerializer、Jackson2JsonRedisSerializer、JacksonJsonRedisSerializer、JdkSerializationRedisSerializer、OxmSerializer、StringRedisSerializer。
     * 在此我們將自己配置RedisTemplate并定義Serializer。
     *
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
//        JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
        GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 設(shè)置值(value)的序列化采用FastJsonRedisSerializer。
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
//        redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
        // 設(shè)置鍵(key)的序列化采用StringRedisSerializer。
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
 
}@Component
public class HashRedisTemplate extends RedisTemplate {
 
    public HashRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        this.setConnectionFactory(redisConnectionFactory);
        this.setKeySerializer(new StringRedisSerializer());
        this.setValueSerializer(new StringRedisSerializer());
        this.setHashKeySerializer(new StringRedisSerializer());
        this.setHashValueSerializer(new StringRedisSerializer());
        this.afterPropertiesSet();
    }
}下面的方式不推薦
通過java對象序列化的方式,速度上可能不及上面通過json的格式序列化,還有一點(diǎn)就是json序列的方式可以看出對象里面的屬性
但是也有優(yōu)點(diǎn):存儲內(nèi)容沒有限制,不存在枚舉序列化和反序列化失敗的情況。存儲空間占用少。
缺點(diǎn)就是反序列化之前,看不出內(nèi)容是什么
public class ObjectSerializer<T> implements RedisSerializer<T> {
 
    @Nullable
    @Override
    public byte[] serialize(@Nullable T t) throws SerializationException {
        ByteArrayOutputStream byteArrayOutputStream = null;
        ObjectOutputStream objectOutputStream = null;
        try {
            byteArrayOutputStream = new ByteArrayOutputStream();
            objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
            objectOutputStream.writeObject(t);
 
            byte[] bytes = byteArrayOutputStream.toByteArray();
            return bytes;
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                objectOutputStream.close();
                byteArrayOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return new byte[0];
    }
 
    @Nullable
    @Override
    public T deserialize(@Nullable byte[] bytes) throws SerializationException {
        InputStream inputstream = null;
        ObjectInputStream objectInputStream = null;
        try {
            inputstream = new ByteArrayInputStream(bytes);
            objectInputStream = new ObjectInputStream(inputstream);
            Object o = objectInputStream.readObject();
            T t = (T) o;
            return t;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                objectInputStream.close();
                inputstream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
                                您可能感興趣的文章:
                        - RedisTemplate默認(rèn)序列化方式顯示中文亂碼的解決
 - RedisTemplate序列化設(shè)置的流程和具體步驟
 - 配置redis的序列化,注入RedisTemplate方式
 - Spring?boot?RedisTemplate?序列化服務(wù)化配置方式
 - Springboot下RedisTemplate的兩種序列化方式實(shí)例詳解
 - Springboot?引入?Redis?并配置序列化并封裝RedisTemplate?
 - Redis之RedisTemplate配置方式(序列和反序列化)
 - 解決RedisTemplate的key默認(rèn)序列化器的問題
 - Spring的RedisTemplate的json反序列泛型丟失問題解決
 
相關(guān)文章
 Redis中的動態(tài)字符串學(xué)習(xí)教程
這篇文章主要介紹了Redis中的動態(tài)字符串學(xué)習(xí)教程,以sds模塊的使用為主進(jìn)行講解,需要的朋友可以參考下2015-08-08
 如何在SpringBoot中使用Redis實(shí)現(xiàn)分布式鎖
這篇文章主要介紹了如何在SpringBoot中使用Redis實(shí)現(xiàn)分布式鎖,在實(shí)際開發(fā)中有可能會遇到多個線程同時訪問同一個共享變量,那么上鎖就很重要了,需要的朋友可以參考下2023-03-03
 redis實(shí)現(xiàn)session共享的方法
本文主要介紹了redis實(shí)現(xiàn)session共享的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04

