zouyu
2 天以前 b02ace7aa9a5e046d533cf80afa8ec14c40fe133
直流电阻:解析mqtt订阅的数据保存到redis
已修改4个文件
已添加3个文件
740 ■■■■■ 文件已修改
cnas-device/src/main/java/com/ruoyi/device/constant/DCResistanceMqttConstants.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/vo/DCResistanceMqttVO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin-ztns/src/main/resources/application-druid.yml 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtil.java 631 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/constant/DCResistanceMqttConstants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.device.constant;
/**
 * ç›´æµç”µé˜»mqtt淑君属性【dataStream】的标识常量
 */
public class DCResistanceMqttConstants {
    public final static String  NSDQCS_DQCS_SN = "NSDQCS.DQCS.SN";
    public final static String  NSDQCS_DQCS_DZZ = "NSDQCS.DQCS.DZZ";
    public final static String  NSDQCS_DQCS_64 = "NSDQCS.DQCS.64";
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
@@ -1,9 +1,15 @@
package com.ruoyi.device.mqtt;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.ruoyi.device.constant.DCResistanceMqttConstants;
import com.ruoyi.device.service.CollectBridgeService;
import com.ruoyi.device.vo.DCResistanceMqttVO;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
@@ -11,6 +17,9 @@
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@Component
@Slf4j
@@ -71,9 +80,11 @@
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        try {
            String parse = new String(message.getPayload());
            JSONObject jsonObject = JSONObject.parseObject(parse);
//            JSONObject jsonObject = JSONObject.parseObject(parse);
            // å¡«å……采集数据
            mqCallback.collectBridgeService.addBridgeValue(jsonObject);
//            mqCallback.collectBridgeService.addBridgeValue(jsonObject);
            //耐丝:直流电阻数据解析
            mqCallback.collectBridgeService.addBridgeValueByNS(parse);
        } catch (Exception e) {
            e.printStackTrace();
cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java
@@ -17,5 +17,7 @@
     * @param jsonObject
     */
    void addBridgeValue(JSONObject jsonObject);
    void addBridgeValueByNS(String jsonStr);
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
@@ -1,20 +1,29 @@
package com.ruoyi.device.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.RedisUtil;
import com.ruoyi.device.constant.DCResistanceMqttConstants;
import com.ruoyi.device.mapper.CollectBridgeMapper;
import com.ruoyi.device.pojo.CollectBridge;
import com.ruoyi.device.service.CollectBridgeService;
import com.ruoyi.device.vo.DCResistanceMqttVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * æ•°å­—电桥采集
@@ -97,6 +106,22 @@
        }
    }
    @Override
    public void addBridgeValueByNS(String jsonStr) {
        Map<String, Object> dataMap = JSONObject.parseObject(jsonStr, new TypeReference<Map<String, Object>>(){}.getType());
        if(CollectionUtil.isNotEmpty(dataMap) && Objects.nonNull(dataMap.get("data"))){
            List<DCResistanceMqttVO> dataList = JSONArray.parseObject(dataMap.get("data").toString(), new TypeReference<List<DCResistanceMqttVO>>(){}.getType());
            //过滤出包含实际电阻值的对象
            DCResistanceMqttVO dcResistanceMqttVO = dataList.stream().filter(f -> StringUtils.equals(f.getDataStream(), DCResistanceMqttConstants.NSDQCS_DQCS_DZZ)).findFirst().orElse(null);
            if(Objects.nonNull(dcResistanceMqttVO)){
                List<DCResistanceMqttVO.DataPoint> dataPoints = dcResistanceMqttVO.getDataPoints();
                BigDecimal value = CollectionUtil.isNotEmpty(dataPoints)?dataPoints.get(0).getValue():BigDecimal.ZERO;
                //保存实际电阻值到redis
                RedisUtil.set(DCResistanceMqttConstants.NSDQCS_DQCS_DZZ,value.doubleValue());
            }
        }
    }
    public static boolean isWithinTenMinutes(LocalDateTime dateTime1, LocalDateTime dateTime2) {
        Duration duration = Duration.between(dateTime1, dateTime2);
        long minutesDifference = Math.abs(duration.toMinutes());
cnas-device/src/main/java/com/ruoyi/device/vo/DCResistanceMqttVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.device.vo;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
 * ç›´æµç”µé˜»ï¼šè§£æžmqtt数据响应对象
 */
@Data
public class DCResistanceMqttVO implements Serializable {
    /**
     * æ•°æ®ç±»åž‹æ ‡è¯†
     */
    private String dataStream;
    /**
     * æ•°æ®èŠ‚ç‚¹å¯¹è±¡
     */
    private List<DataPoint> dataPoints;
    @Data
    public class DataPoint {
        /**
         * æ—¶é—´æˆ³å­—符串
         */
        private String time;
        /**
         * å®žé™…值
         */
        private BigDecimal value;
    }
}
ruoyi-admin-ztns/src/main/resources/application-druid.yml
@@ -8,7 +8,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://localhost:3306/center-lims-ztns?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://localhost:3307/center-lims-ztns?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: 123456
      # ä»Žåº“数据源
@@ -72,6 +72,7 @@
    database: 1
    #    # å¯†ç 
    #    password: root2022!
    password: 123456
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
    lettuce:
@@ -152,7 +153,7 @@
  examiningUrl: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=21993616-9966-4fe4-81b0-68e99a40c964
ifs:
  contract: ZTZB
  contract: ZTNS
  contract-key-get: 4ttDeLKNsZuhstjtROMcRE1USNFXKdFYE7lQ2p1m5Bo=
  contract-key-post: 4ttDeLKNsZuhstjtROMcRE1USNFXKdFYE7lQ2p1m5Bo=
  custorder: http://192.168.20.47/PurchService.ashx?
@@ -162,12 +163,12 @@
# å¤‡æ³¨ 18083密码:zttZTT123!@
mqtt:
  url: tcp://mqtt-ztt.zttiot.com:1883 # æœåС噍ip
  username: forwarder # MQTT-服务端-用户名,后期会修改为用户登录名
  password: ZTlink12345 # MQTT-服务端-密码,,后期会修改为用户登录密码
  username: 2455220 # MQTT-服务端-用户名,后期会修改为用户登录名
  password: 108300 # MQTT-服务端-密码,,后期会修改为用户登录密码
  timeout: 100 # è¶…æ—¶æ—¶é—´ ï¼ˆå•位:秒)
  keepalive: 60 # å¿ƒè·³ ï¼ˆå•位:秒)
  qos: 1 # å¿ƒè·³åŒ…级别
  completion-timeout: 3000 # è¿žæŽ¥è¶…时时间(单位:秒)
  clientId: javaPublish # clientId
  subscribe: /ztt/v3/2443521/publish # è®¢é˜…主题
  client: false # å¦‚果开发需要启动测试,需要改为false不然会一直报错
  clientId: ztns # clientId
  subscribe: /ztt/v3/2455220/publish # è®¢é˜…主题
  client: true # å¦‚果开发需要启动测试,需要改为false不然会一直报错
ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,631 @@
package com.ruoyi.common.utils;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Component
public class RedisUtil {
    private static RedisTemplate<String, Object> redisTemplate;
    public static RedisTemplate<String, Object> getRedisTemplate() {
        return redisTemplate;
    }
    @Autowired
    private RedisUtil(RedisConnectionFactory redisConnectionFactory){
        // redisTemplate模板初始化
        redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // å°†å¯¹è±¡åºåˆ—化
        ObjectMapper om=new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
                ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        // String的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // json序列化配置
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer<>(Object.class);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        //key采用String的序列化方式
        redisTemplate.setKeySerializer(stringRedisSerializer);
        //hash的key也采用String çš„序列化方式
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        //value的序列化方式采用jackson的方式
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
//        //hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
    }
    // =============================common============================
    /**
     * æŒ‡å®šç¼“存失效时间
     * @param key  é”®
     * @param time æ—¶é—´(秒)
     */
    public static boolean expire(String key, long time) {
        try {
            if (time > 0) {
                redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * æ ¹æ®key èŽ·å–è¿‡æœŸæ—¶é—´
     * @param key é”® ä¸èƒ½ä¸ºnull
     * @return æ—¶é—´(秒) è¿”回0代表为永久有效
     */
    public static long getExpire(String key) {
        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
    }
    /**
     * åˆ¤æ–­key是否存在
     * @param key é”®
     * @return true å­˜åœ¨ false不存在
     */
    public static boolean hasKey(String key) {
        try {
            return redisTemplate.hasKey(key);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * åˆ é™¤ç¼“å­˜
     * @param key å¯ä»¥ä¼ ä¸€ä¸ªå€¼ æˆ–多个
     */
//    @SuppressWarnings("unchecked")
    public static void del(String... key) {
        if (key != null && key.length > 0) {
            if (key.length == 1) {
                redisTemplate.delete(key[0]);
            } else {
                redisTemplate.delete(Arrays.asList(key));
//                redisTemplate.delete(CollectionUtils.arrayToList(key));
            }
        }
    }
    /**
     * æ¨¡ç³ŠåŒ¹é…åˆ é™¤å¤šä¸ªç¼“å­˜
     * @param key å¯ä»¥ä¼ ä¸€ä¸ªå€¼ æˆ–多个
     */
    public static void delsLike(String key) {
        Set<String> keys = redisTemplate.keys(key);
        redisTemplate.delete(keys);
    }
    /**
     * èŽ·å–å¹¶åˆ é™¤ç¼“å­˜
     * @param key é”®
     * @return å€¼
     */
    public static Object getAndDelete(String key) {
        try{
            return key == null ? null : get(key);
        }finally {
            del(key);
        }
    }
    // ============================String=============================
    /**
     * æ™®é€šç¼“存获取
     * @param key é”®
     * @return å€¼
     */
    public static Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }
    /**
     * æ™®é€šç¼“存放入
     * @param key   é”®
     * @param value å€¼
     * @return true成功 false失败
     */
    public static boolean set(String key, Object value) {
        try {
            redisTemplate.opsForValue().set(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * æ™®é€šç¼“存放入并设置时间
     * @param key   é”®
     * @param value å€¼
     * @param time  æ—¶é—´(秒) time要大于0 å¦‚æžœtime小于等于0 å°†è®¾ç½®æ— é™æœŸ
     * @return true成功 false å¤±è´¥
     */
    public static boolean set(String key, Object value, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForValue().set(key, value, time, TimeUnit.MINUTES);
            } else {
                // åªä¿®æ”¹å‚数不修改ttl
                redisTemplate.opsForValue().set(key, value, 0);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * é€’增
     * @param key   é”®
     * @param delta è¦å¢žåР几(大于0)
     */
    public static long incr(String key, long delta) {
        if (delta < 0) {
            throw new RuntimeException("递增因子必须大于0");
        }
        return redisTemplate.opsForValue().increment(key, delta);
    }
    /**
     * é€’减
     * @param key   é”®
     * @param delta è¦å‡å°‘几(小于0)
     */
    public static long decr(String key, long delta) {
        if (delta < 0) {
            throw new RuntimeException("递减因子必须大于0");
        }
        return redisTemplate.opsForValue().increment(key, -delta);
    }
    // ================================Map=================================
    /**
     * HashGet
     * @param key  é”® ä¸èƒ½ä¸ºnull
     * @param item é¡¹ ä¸èƒ½ä¸ºnull
     */
    public static Object hget(String key, String item) {
        return redisTemplate.opsForHash().get(key, item);
    }
    /**
     * èŽ·å–hashKey对应的所有键值
     * @param key é”®
     * @return å¯¹åº”的多个键值
     */
    public static Map<Object, Object> hmget(String key) {
        return redisTemplate.opsForHash().entries(key);
    }
    /**
     * HashSet
     * @param key é”®
     * @param map å¯¹åº”多个键值
     */
    public static boolean hmset(String key, Map<String, Object> map) {
        try {
            redisTemplate.opsForHash().putAll(key, map);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * HashSet å¹¶è®¾ç½®æ—¶é—´
     * @param key  é”®
     * @param map  å¯¹åº”多个键值
     * @param time æ—¶é—´(秒)
     * @return true成功 false失败
     */
    public static boolean hmset(String key, Map<String, Object> map, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForHash().putAll(key, map);
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * å‘一张hash表中放入数据,如果不存在将创建
     *
     * @param key   é”®
     * @param item  é¡¹
     * @param value å€¼
     * @return true æˆåŠŸ false失败
     */
    public static boolean hset(String key, String item, Object value) {
        try {
            redisTemplate.opsForHash().put(key, item, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * å‘一张hash表中放入数据,如果不存在将创建
     *
     * @param key   é”®
     * @param item  é¡¹
     * @param value å€¼
     * @param time  æ—¶é—´(秒) æ³¨æ„:如果已存在的hash表有时间,这里将会替换原有的时间
     * @return true æˆåŠŸ false失败
     */
    public static boolean hset(String key, String item, Object value, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForHash().put(key, item, value);
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * åˆ é™¤hash表中的值
     *
     * @param key  é”® ä¸èƒ½ä¸ºnull
     * @param item é¡¹ å¯ä»¥ä½¿å¤šä¸ª ä¸èƒ½ä¸ºnull
     */
    public static void hdel(String key, Object... item) {
        redisTemplate.opsForHash().delete(key, item);
    }
    /**
     * åˆ¤æ–­hash表中是否有该项的值
     *
     * @param key  é”® ä¸èƒ½ä¸ºnull
     * @param item é¡¹ ä¸èƒ½ä¸ºnull
     * @return true å­˜åœ¨ false不存在
     */
    public static boolean hHasKey(String key, String item) {
        return redisTemplate.opsForHash().hasKey(key, item);
    }
    /**
     * hash递增 å¦‚果不存在,就会创建一个 å¹¶æŠŠæ–°å¢žåŽçš„值返回
     *
     * @param key  é”®
     * @param item é¡¹
     * @param by   è¦å¢žåР几(大于0)
     */
    public static double hincr(String key, String item, double by) {
        return redisTemplate.opsForHash().increment(key, item, by);
    }
    /**
     * hash递减
     *
     * @param key  é”®
     * @param item é¡¹
     * @param by   è¦å‡å°‘è®°(小于0)
     */
    public static double hdecr(String key, String item, double by) {
        return redisTemplate.opsForHash().increment(key, item, -by);
    }
    // ============================set=============================
    /**
     * æ ¹æ®key获取Set中的所有值
     * @param key é”®
     */
    public static Set<Object> sGet(String key) {
        try {
            return redisTemplate.opsForSet().members(key);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * æ ¹æ®value从一个set中查询,是否存在
     *
     * @param key   é”®
     * @param value å€¼
     * @return true å­˜åœ¨ false不存在
     */
    public static boolean sHasKey(String key, Object value) {
        try {
            return redisTemplate.opsForSet().isMember(key, value);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * å°†æ•°æ®æ”¾å…¥set缓存
     *
     * @param key    é”®
     * @param values å€¼ å¯ä»¥æ˜¯å¤šä¸ª
     * @return æˆåŠŸä¸ªæ•°
     */
    public static long sSet(String key, Object... values) {
        try {
            return redisTemplate.opsForSet().add(key, values);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    /**
     * å°†set数据放入缓存
     *
     * @param key    é”®
     * @param time   æ—¶é—´(秒)
     * @param values å€¼ å¯ä»¥æ˜¯å¤šä¸ª
     * @return æˆåŠŸä¸ªæ•°
     */
    public static long sSetAndTime(String key, long time, Object... values) {
        try {
            Long count = (long)values.length;
            if (time > 0) {
                count = redisTemplate.opsForSet().add(key, values);
                expire(key, time);
            }
            return count;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    /**
     * èŽ·å–set缓存的长度
     *
     * @param key é”®
     */
    public static long sGetSetSize(String key) {
        try {
            return redisTemplate.opsForSet().size(key);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    /**
     * ç§»é™¤å€¼ä¸ºvalue的
     *
     * @param key    é”®
     * @param values å€¼ å¯ä»¥æ˜¯å¤šä¸ª
     * @return ç§»é™¤çš„个数
     */
    public static long setRemove(String key, Object... values) {
        try {
            return redisTemplate.opsForSet().remove(key, values);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    // ===============================list=================================
    /**
     * èŽ·å–list缓存的内容
     *
     * @param key   é”®
     * @param start å¼€å§‹
     * @param end   ç»“束 0 åˆ° -1代表所有值
     */
    public static List<Object> lGet(String key, long start, long end) {
        try {
            return redisTemplate.opsForList().range(key, start, end);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * èŽ·å–list缓存的长度
     *
     * @param key é”®
     */
    public static long lGetListSize(String key) {
        try {
            return redisTemplate.opsForList().size(key);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    /**
     * é€šè¿‡ç´¢å¼• èŽ·å–list中的值
     *
     * @param key   é”®
     * @param index ç´¢å¼• index>=0时, 0 è¡¨å¤´ï¼Œ1 ç¬¬äºŒä¸ªå…ƒç´ ï¼Œä¾æ¬¡ç±»æŽ¨ï¼›index<0时,-1,表尾,-2倒数第二个元素,依次类推
     */
    public static Object lGetIndex(String key, long index) {
        try {
            return redisTemplate.opsForList().index(key, index);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * å°†list放入缓存
     *
     * @param key   é”®
     * @param value å€¼
     */
    public static boolean lSet(String key, Object value) {
        try {
            redisTemplate.opsForList().rightPush(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * å°†list放入缓存
     * @param key   é”®
     * @param value å€¼
     * @param time  æ—¶é—´(秒)
     */
    public static boolean lSet(String key, Object value, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForList().rightPush(key, value);
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * å°†list放入缓存
     *
     * @param key   é”®
     * @param value å€¼
     * @return true å­˜æ”¾æˆåŠŸ false存放失败
     */
    public static boolean lSet(String key, List<Object> value) {
        try {
            redisTemplate.opsForList().rightPushAll(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * å°†list放入缓存
     *
     * @param key   é”®
     * @param value å€¼
     * @param time  æ—¶é—´(秒)
     * @return true å­˜æ”¾æˆåŠŸ false存放失败
     */
    public static boolean lSet(String key, List<Object> value, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForList().rightPushAll(key, value);
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * æ ¹æ®ç´¢å¼•修改list中的某条数据
     *
     * @param key   é”®
     * @param index ç´¢å¼•
     * @param value å€¼
     * @return true å­˜æ”¾æˆåŠŸ false存放失败
     */
    public static boolean lUpdateIndex(String key, long index, Object value) {
        try {
            redisTemplate.opsForList().set(key, index, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * ç§»é™¤N个值为value
     *
     * @param key   é”®
     * @param count ç§»é™¤å¤šå°‘个
     * @param value å€¼
     * @return ç§»é™¤çš„个数
     */
    public static long lRemove(String key, long count, Object value) {
        try {
            return redisTemplate.opsForList().remove(key, count, value);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
}