diff --git a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/controller/RedisController.java b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/controller/RedisController.java new file mode 100644 index 000000000..b00593e06 --- /dev/null +++ b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/controller/RedisController.java @@ -0,0 +1,42 @@ +package com.pig4cloud.pigx.monitor.controller; + +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.monitor.service.RedisService; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author lengleng + * @date 2019-05-08 + *

+ * redis 数据 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/redis") +public class RedisController { + private final RedisService redisService; + + /** + * 查询redis信息 + * + * @return + */ + @GetMapping("/info") + public R memory() { + return R.builder().data(redisService.getInfo()).build(); + } + + /** + * 执行用户输入命令 + * + * @param command 命令 + * @return + */ + @GetMapping("/exec") + public R exec(String command) { + return redisService.exec(command); + } +} diff --git a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/service/RedisService.java b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/service/RedisService.java new file mode 100644 index 000000000..86feda384 --- /dev/null +++ b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/service/RedisService.java @@ -0,0 +1,28 @@ +package com.pig4cloud.pigx.monitor.service; + +import com.pig4cloud.pigx.common.core.util.R; + +import java.util.Map; + +/** + * @author lengleng + * @date 2019-05-08 + *

+ * redis 监控 + */ +public interface RedisService { + /** + * 获取内存信息 + * + * @return + */ + Map getInfo(); + + /** + * 执行运行命令 + * + * @param command + * @return + */ + R exec(String command); +} diff --git a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/service/impl/RedisServiceImpl.java b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/service/impl/RedisServiceImpl.java new file mode 100644 index 000000000..eddc1506b --- /dev/null +++ b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/service/impl/RedisServiceImpl.java @@ -0,0 +1,88 @@ +package com.pig4cloud.pigx.monitor.service.impl; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.monitor.service.RedisService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * @author lengleng + * @date 2019-05-08 + */ +@Slf4j +@Service +@AllArgsConstructor +public class RedisServiceImpl implements RedisService { + private RedisTemplate redisTemplate; + + /** + * 获取内存信息 + * + * @return + */ + @Override + public Map getInfo() { + Properties info = (Properties) redisTemplate.execute((RedisCallback) redisConnection -> redisConnection.info()); + Properties commandStats = (Properties) redisTemplate.execute((RedisCallback) redisConnection -> redisConnection.info("commandstats")); + Object dbSize = redisTemplate.execute((RedisCallback) redisConnection -> redisConnection.dbSize()); + + Map result = new HashMap<>(4); + result.put("info", info); + result.put("dbSize", dbSize); + result.put("time", DateUtil.format(new Date(), DatePattern.NORM_TIME_PATTERN)); + + List> pieList = new ArrayList<>(); + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(4); + String property = commandStats.getProperty(key); + data.put("name", StrUtil.removePrefix(key, "cmdstat_")); + data.put("value", StrUtil.subBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + result.put("commandStats", pieList); + return result; + } + + /** + * 执行运行命令 + * + * @param input 用户输入 + * @return + */ + @Override + public R exec(String input) { + try { + Object result = redisTemplate.execute((RedisCallback) connection -> { + String[] arrs = input.split(StrUtil.SPACE); + if (arrs.length == 1) { + return connection.execute(arrs[0]); + } + + String[] args = ArrayUtil.sub(arrs, 1, arrs.length); + byte[][] bytes = new byte[args.length][]; + for (int i = 0; i < args.length; i++) { + bytes[i] = StrUtil.bytes(args[i], CharsetUtil.UTF_8); + } + return connection.execute(arrs[0], bytes); + }); + return R.builder() + .msg("success") + .data(StrUtil.str(result, CharsetUtil.UTF_8)).build(); + } catch (Exception e) { + log.error("REDIS 命令执行失败", e); + return R.builder() + .msg("error") + .data(e.getMessage()).build(); + } + } +} diff --git a/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/service/impl/RedisServiceImplTest.java b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/service/impl/RedisServiceImplTest.java new file mode 100644 index 000000000..3981b770f --- /dev/null +++ b/pigx-visual/pigx-monitor/src/main/java/com/pig4cloud/pigx/monitor/service/impl/RedisServiceImplTest.java @@ -0,0 +1,15 @@ +package com.pig4cloud.pigx.monitor.service.impl; + +import org.junit.Test; + +/** + * @author lengleng + * @date 2019-05-09 + */ +public class RedisServiceImplTest { + + @Test + public void exec() { + + } +} \ No newline at end of file