springboots2+lettuce 将List<T>、复杂json传入redis

本人需将查询结果处理拼接成jsonObject传入js,echarts生成图表
每个图表所需拼接返回的json数据格式不一样。
比如如下格式json 和List
存储数据格式

{
    
    
  "@class": "com.alibaba.fastjson.JSONObject",
  "result_data": [
    "java.util.ArrayList",
    [
      {
    
    
        "@class": "com.alibaba.fastjson.JSONObject",
        "title": "TOP5省份地区"
      },
      [
        "java.util.ArrayList",
        [
          "TOP5公司"
        ]
      ],
      [
        "java.util.ArrayList",
        [
          {
    
    
            "@class": "com.alibaba.fastjson.JSONObject",
            "max": 548015,
            "name": "上海市"
          },
          {
    
    
            "@class": "com.alibaba.fastjson.JSONObject",
            "max": 548015,
            "name": "浙江省"
          },
          {
    
    
            "@class": "com.alibaba.fastjson.JSONObject",
            "max": 548015,
            "name": "江苏省"
          }
        ]
      ],
      [
        "java.util.ArrayList",
        [248015,71583,51219,28074,17511]
      ]
    ]
  ]
}

List<T>
"[{\"sfdq\":\"上海市\",\"numbers\":248015},{\"sfdq\":\"浙江省\",\"numbers\":71583},{\"sfdq\":\"江苏省\",\"numbers\":51219},{\"sfdq\":\"广州市\",\"numbers\":28074},{\"sfdq\":\"北京市\",\"numbers\":17511}]"

本人使用springboot2+lettuce 连接redis

1. pom.xml文件增加 redis

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

2. 增加redis配置类



import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.*;
import org.springframework.cache.interceptor.KeyGenerator;

import javax.annotation.Resource;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class RedisTemplateConfig {
    
    


    @Configuration
    public class RedisConfig {
    
    

        @Resource
        private LettuceConnectionFactory lettuceConnectionFactory;
                private Logger logger= LoggerFactory.getLogger(RedisConfig.class);
        private Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //缓存生存时间

        private Duration timeToLive = Duration.ofDays(1);

        @Bean
        public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
    
    

            //redis缓存配置
            RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                    .entryTtl(this.timeToLive)
                    .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))
                    .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer()))
                    .disableCachingNullValues();
            Map<String, RedisCacheConfiguration> cacheConfigurationMap = new HashMap<>();
            cacheConfigurationMap.put("users", config);
            cacheConfigurationMap.put("default", config);
            RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory)
                    .cacheDefaults(config)
                    .transactionAware()
                    .withInitialCacheConfigurations(cacheConfigurationMap)
                    .build();
//            logger.debug("自定义RedisCacheManager加载完成");
            return redisCacheManager;
        }

        @Bean(name = "redisTemplate")
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    
    
            RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            redisTemplate.setKeySerializer(keySerializer());
            redisTemplate.setHashKeySerializer(keySerializer());
            redisTemplate.setValueSerializer(valueSerializer());
            redisTemplate.setHashValueSerializer(valueSerializer());
            logger.debug("自定义RedisTemplate加载完成");
            return redisTemplate;
        }

        private RedisSerializer<String> keySerializer() {
    
    
            return new StringRedisSerializer();
        }

        private RedisSerializer<Object> valueSerializer() {
    
    
            return new GenericJackson2JsonRedisSerializer();
        }

        @Bean
        public KeyGenerator myKeyGenerator() {
    
    
            return (target, method, params) -> {
    
    
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
    
    
                    sb.append(obj.toString());
                }
                return sb.toString();
            };

        }
    }
}

3. 自动装配redisTemplate

@Controller
public class XXXController {
    
    
    @Autowired
    private RedisTemplate redisTemplate;

}

4. 将数据存、取redis

对应方法内调用redusTemplate方法

//k-v
//存
List<ProvinceData> provinceDatas = mysql查询结果生成的List<T>;
redisTemplate.opsForValue().set("provinceTop5", JSON.toJSON(provinceDatas).toString());
//取
String result = redisTemplate.opsForValue().get("provinceTop5").toString();
List<ProvinceData> provinceTop5 = JSON.parseArray(result, ProvinceData.class);
//------------------------------------------------------------------------------------------------
//hash
//存
redisTemplate.opsForHash().put("mv", "sumofyesterday", sumofyesterday);
//取
String rateofpredict = redisTemplate.opsForHash().get("mv", "sumofyesterday").toString();

猜你喜欢

转载自blog.csdn.net/weixin_41772761/article/details/121360007