redis实践demo(序列化与反序列化)

1.导入依赖

2.redisconfig编写

2.1 cacheManager

@SuppressWarnings("rawtypes")
    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {

        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        String env = settings.getEnvironment();
        if ("dev".equals(env) || "test".equals(env) || "pre".equals(env)) {
            cacheManager.setDefaultExpiration(10);
        } else {
            cacheManager.setDefaultExpiration(1800);
            cacheManager.setExpires(ImmutableMap.of("wechatMiniProgram", 2 * 60 * 60L));
            cacheManager.setExpires(ImmutableMap.of("xxxAdapterCache", 1800L));
            cacheManager.setExpires(ImmutableMap.of("xxxServiceImplCache", 2 * 60 * 60L));
            cacheManager.setExpires(ImmutableMap.of("xxxxAdapterCache", 1800L));
            cacheManager.setExpires(ImmutableMap.of("xxxxSearchService", 1800L)); //是否合理???
        }
        cacheManager.setUsePrefix(true);
        cacheManager.setCachePrefix(new CachePrefix(PREFIX, "_"));
        return cacheManager;
    }

2.2 自定义RedisTemplate<String, Object> objectRedisTemplate(RedisConnectionFactory factory)

@SuppressWarnings({ "rawtypes", "unchecked" })
    @Bean
    public RedisTemplate<String, Object> objectRedisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        template.setKeySerializer(new StringRedisSerializer());

        template.setValueSerializer(new FastJsonRedisSerializer<Object>(Object.class));
        //template.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
        return template;
    }

3.使用

    @Autowired
    private RedisTemplate<String, Object> objectRedisTemplate;


@Override
    //@Cacheable(key = "'sections_'+ #filter.getCompanyId()+'_'+#filter.getCityId()+'_'+#filter.getSectionIds()", condition = "#filter.getCompanyId() != null && #filter.getCityId() != null && #filter.getSectionIds() != null",value="EstateSearchService#180#60",unless = "#result == null")   //#${select.cache.timeout:1000}
    public SearchResponse<Result> searchByFilter(FilterRequest filter, Integer type) {

        String key="sections_"+ filter.getCompanyId()+"_"+filter.getCityId()+"_"+filter.getSectionIds();
        boolean hasKey = objectRedisTemplate.hasKey(key);
        if(hasKey){

            SearchResponse<Result> res=new SearchResponse<Result>();
            //反序列化成对象
            JSONObject obj=(JSONObject)objectRedisTemplate.opsForValue().get(key); //com.alibaba.fastjson.JSONObject
            JSONArray jsonArray = obj.getJSONArray("records");
            Long total=obj.getLong("total");
            Long recommendTotal=obj.getLong("recommendTotal");
            List<Result> li= Lists.newArrayList();
            for(int i=0;i<jsonArray.size();i++){
                li.add(jsonArray.getObject(i,Result.class));
            }
            res.setRecommendTotal(recommendTotal);
            res.setRecords(li);
            res.setTotal(total);
            return res;
        }

        long startTime = System.currentTimeMillis();
        logger.warn("搜索请求开始: {}",startTime);
        //搜索
        SearchResponse<Result> hSearchResponse = searchByFilter(filter);
        List<Result> hList = hSearchResponse.getRecords();
        hSearchResponse.setRecommendTotal(new Long(hList.size()));
        startTime = System.currentTimeMillis();
        logger.warn("房源搜索请求结束: {}",startTime);

        objectRedisTemplate.opsForValue().set(key,hSearchResponse);
        this.objectRedisTemplate.expire(key,1000,TimeUnit.SECONDS); //过期时间

        return hSearchResponse;
    }

注意:带泛型,不能直接从redis取出的JSONObject对象直接转成bean对象,需要有确定的类型,可以先取出再拼装;

原创文章 75 获赞 28 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_33999844/article/details/85339831