成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

集成 Spring data redis 筆記

張遷 / 3419人閱讀

摘要:本文有部分代碼是抄襲的。第二個(gè)坑需要指定對(duì)象的數(shù)據(jù)類型,不然反序列化報(bào)錯(cuò)。第三的編輯器非常不好用。上面的配置有個(gè)缺陷,就是只能指定數(shù)據(jù)類型去緩存到。其實(shí)還可以配置一個(gè)但我持久層是。查詢分頁結(jié)果時(shí),會(huì)無法反序列化。搜了半天沒解決方案。

本文有部分代碼是抄襲的。

1 :引入依賴


  org.springframework.data
  spring-data-redis
  ${spring-data-redis.version}



  org.apache.commons
  commons-pool2
  ${commons-pool2.version}




  biz.paluch.redis
  lettuce
  ${lettuce.version}



/**
 * 配置緩存
 */

@EnableCaching
public class CachingConfig extends CachingConfigurerSupport {

@Resource(name = "redisTemplate")
private RedisTemplate redisTemplate;

@Override
@Bean(name = "redisCache")
public CacheManager cacheManager() {

    ///需要更快啟動(dòng)cacheManager就開啟這個(gè)
    // manager.afterPropertiesSet();
    // ConcurrentMapCacheManager manager=new ConcurrentMapCacheManager();
    RedisCacheManager manager = new RedisCacheManager(redisTemplate);
    return manager;
}

@Override
@Bean(name = "redisKeyGen")
public KeyGenerator keyGenerator() {
    return new KeyGenerator() {
        @Override
        public Object generate(Object target, Method method, Object... objects) {
            StringBuilder sb = new StringBuilder();
            sb.append(target.getClass().getName());
            sb.append(method.getName());
            for (Object obj : objects) {
                sb.append(obj.toString());
            }
            return sb.toString();
        }
    };
}

}

配置redis

public class RedisConfig {

private static final Logger LOGGER = LoggerFactory.getLogger(RedisConfig.class);


private String host = "localhost";

private int port = 6379;

private String password = "redis";

private int database = 0;


/**
 * 使用這個(gè)連接池,需要commons-pool2依賴
 * lettuce其實(shí)沒有必要使用連接池 https://github.com/lettuce-io/lettuce-core/wiki/Connection-Pooling
 *
 * @return
 */
@Bean(value = "lettucePool")
public LettucePool lettucePool() {
    DefaultLettucePool pool = new DefaultLettucePool();
    pool.setDatabase(0);
    pool.setHostName("localhost");
    pool.setPort(6379);
    //調(diào)用這個(gè)方法,確保連接池被初始化
    pool.afterPropertiesSet();
    return pool;
}


/**
 * 設(shè)置 redis連接工廠,通過連接池的方式來初始化工廠
 *
 * @return
 */
//@Lazy(value = false)
@Bean(name = "redisConnectionFactory")
@DependsOn(value = "lettucePool")
public RedisConnectionFactory redisConnectionFactory() {
    //Linux使用這種方式初始化工廠
    //return new LettuceConnectionFactory(new RedisSocketConfiguration("/var/run/redis.sock"));
    LettuceConnectionFactory factory = new LettuceConnectionFactory(lettucePool());
    //如果不使用連接池初始化工廠,則需要調(diào)用這個(gè)方法
    //factory.afterPropertiesSet();
    return factory;
}


/**
 * 設(shè)置redis操作模板
 *
 * @param redisConnectionFactory
 * @return
 */
@Bean(name = "redisTemplate")
@DependsOn(value = "redisConnectionFactory")
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory,
                                                   Jackson2JsonRedisSerializer jackson2JsonRedisSerializer,
                                                   StringRedisSerializer stringRedisSerializer) {
    RedisTemplate template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);

    //設(shè)置序列化方式
    
    template.setHashKeySerializer(jackson2JsonRedisSerializer);
    template.setHashValueSerializer(jackson2JsonRedisSerializer);
    template.setKeySerializer(jackson2JsonRedisSerializer);
    template.setValueSerializer(jackson2JsonRedisSerializer);
    
    template.setStringSerializer(stringRedisSerializer);

    return template;
}

}

設(shè)置序列化

public class SerializerConfig {

/**
 * 配置 jackson mapper
 * @return
 */
@Lazy(value = false)
@Bean(name = "jacksonMapper")
public ObjectMapper jacksonMapper(){
    ObjectMapper mapper=new ObjectMapper();
    //只針對(duì)非空的值進(jìn)行序列化
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

    // 去掉各種@JsonSerialize注解的解析
    //mapper.configure(MapperFeature.USE_ANNOTATIONS, false);

    // 將類型序列化到屬性json字符串中 有的文章說需要這個(gè)才能正確反序列化
    //mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);

    // 對(duì)于找不到匹配屬性的時(shí)候忽略報(bào)錯(cuò)
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    // 不包含任何屬性的bean也不報(bào)錯(cuò)
    mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

    return mapper;
}


/**
 * 關(guān)鍵
 * Jackson2JsonRedisSerializer 是泛型,需要指定類型
 * 這樣才能正確反序列化,不然會(huì)拋出 java.util.LinkedHashMap cannot be cast YOUR OBJECT 異常
 * @return
 */
@Lazy(value = false)
@Bean(name = "jackson2JsonRedisSerializer")
public Jackson2JsonRedisSerializer jackson2JsonRedisSerializer(){
    Jackson2JsonRedisSerializer jsonRedisSerializer=new Jackson2JsonRedisSerializer<>(Response.class);
    jsonRedisSerializer.setObjectMapper(jacksonMapper());
    return jsonRedisSerializer;
}


@Lazy(value =false)
@Bean (name = "stringRedisSerializer")
public StringRedisSerializer stringRedisSerializer(){
    return new StringRedisSerializer(StandardCharsets.UTF_8);
}

}

最后在需要的地方開啟注解緩存即可
@CacheConfig(cacheManager = "redisCache",cacheNames = {"bxe"})
@Cacheable

弄這個(gè)破玩意好幾天,尤其是spring data redis還挑lettuce的版本,我把git的源碼下載一遍自己編譯都報(bào)錯(cuò),最后才發(fā)現(xiàn)是版本問題。
第二個(gè)坑:RedisSerializer需要指定對(duì)象的數(shù)據(jù)類型,不然反序列化報(bào)錯(cuò)。
第三: segmentfault的編輯器非常不好用。

--------update
上面的配置有個(gè)缺陷,就是只能指定數(shù)據(jù)類型去緩存到redis。

其實(shí)還可以配置一個(gè)GenericJackson2JsonRedisSerializer

@Bean(name = "jsonRedisSerializer")
public GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer(){
    GenericJackson2JsonRedisSerializer jsonRedisSerializer=new GenericJackson2JsonRedisSerializer(“@class);
    return jsonRedisSerializer;
}

但我持久層是 Spring data JPA。
查詢分頁結(jié)果時(shí),會(huì)無法反序列化。
Could not read JSON: Cannot construct instance of `org.springframework.data.domain.PageImpl` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

搜了半天沒解決方案。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76108.html

相關(guān)文章

  • Spring筆記1——極簡入門教程

    摘要:創(chuàng)建工程將框架代碼包解壓后放到工作目錄。方便起見,本教程使用為例。添加創(chuàng)建一個(gè),負(fù)責(zé)響應(yīng)相關(guān)的業(yè)務(wù)請(qǐng)求。添加標(biāo)注在中,對(duì)輸入?yún)?shù)進(jìn)行校驗(yàn)通常使用標(biāo)注。在本教程,我們將實(shí)現(xiàn)的增和查的工作。創(chuàng)建用戶用戶名重啟并提交創(chuàng)建請(qǐng)求。 環(huán)境準(zhǔn)備 系統(tǒng):MacOS 開發(fā):IntelliJ IDEA 語言:Java8 其它:Mysql、Redis 腳手架代碼 Spring提供了一個(gè)創(chuàng)建項(xiàng)目腳手架的官...

    ChristmasBoy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<