package cn.exrick.xboot.base.controller.manage; import cn.exrick.xboot.base.vo.RedisInfo; import cn.exrick.xboot.base.vo.RedisVo; import cn.exrick.xboot.core.common.redis.RedisTemplateHelper; import cn.exrick.xboot.core.common.utils.PageUtil; import cn.exrick.xboot.core.common.utils.ResultUtil; import cn.exrick.xboot.core.common.vo.PageVo; import cn.exrick.xboot.core.common.vo.Result; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.*; import java.util.concurrent.TimeUnit; /** * @author Exrickx */ @Slf4j @RestController @Api(tags = "Redis缓存管理接口") @RequestMapping("/xboot/redis") @Transactional public class RedisController { /** * 最大获取10万个键值 */ private static final int maxSize = 100000; @Autowired private RedisTemplateHelper redisTemplate; @RequestMapping(value = "/getAllByPage", method = RequestMethod.GET) @ApiOperation(value = "分页获取全部") public Result> getAllByPage(@RequestParam(required = false) String key, PageVo pageVo) { List list = new ArrayList<>(); if (StrUtil.isNotBlank(key)) { key = "*" + key + "*"; } else { key = "*"; } Set keys = redisTemplate.scan(key); int size = keys.size(); // 限制10万个 if (size > maxSize) { size = maxSize; } int i = 0; for (String s : keys) { if (i > size) { break; } RedisVo redisVo = new RedisVo(s, "", null); list.add(redisVo); i++; } Page page = new PageImpl(PageUtil.listToPage(pageVo, list), PageUtil.initPage(pageVo), size); page.getContent().forEach(e -> { String value = ""; try { value = redisTemplate.get(e.getKey()); if (value.length() > 150) { value = value.substring(0, 150) + "..."; } } catch (Exception exception) { value = "非字符格式数据"; } e.setValue(value); e.setExpireTime(redisTemplate.getExpire(e.getKey(), TimeUnit.SECONDS)); }); return new ResultUtil>().setData(page); } @RequestMapping(value = "/getByKey/{key}", method = RequestMethod.GET) @ApiOperation(value = "通过key获取") public Result getByKey(@PathVariable String key) { Map map = new HashMap<>(); String value = redisTemplate.get(key); Long expireTime = redisTemplate.getExpire(key, TimeUnit.SECONDS); map.put("value", value); map.put("expireTime", expireTime); return ResultUtil.data(map); } @RequestMapping(value = "/save", method = RequestMethod.POST) @ApiOperation(value = "添加或编辑") public Result save(@RequestParam String key, @RequestParam String value, @RequestParam Long expireTime) { if (expireTime < 0) { redisTemplate.set(key, value); } else if (expireTime > 0) { redisTemplate.set(key, value, expireTime, TimeUnit.SECONDS); } return ResultUtil.success("保存成功"); } @RequestMapping(value = "/delByKeys", method = RequestMethod.POST) @ApiOperation(value = "批量删除") public Result delByKeys(@RequestParam String[] keys) { for (String key : keys) { redisTemplate.delete(key); } return ResultUtil.success("删除成功"); } @RequestMapping(value = "/delAll", method = RequestMethod.POST) @ApiOperation(value = "全部删除") public Result delAll() { redisTemplate.deleteByPattern("*"); return ResultUtil.success("删除成功"); } @RequestMapping(value = "/getKeySize", method = RequestMethod.GET) @ApiOperation(value = "获取实时key大小") public Result getKeySize() { Map map = new HashMap<>(16); map.put("keySize", redisTemplate.getConnectionFactory().getConnection().dbSize()); map.put("time", DateUtil.format(new Date(), "HH:mm:ss")); return ResultUtil.data(map); } @RequestMapping(value = "/getMemory", method = RequestMethod.GET) @ApiOperation(value = "获取实时内存大小") public Result getMemory() { Map map = new HashMap<>(16); Properties memory = redisTemplate.getConnectionFactory().getConnection().info("memory"); map.put("memory", memory.get("used_memory")); map.put("time", DateUtil.format(new Date(), "HH:mm:ss")); return ResultUtil.data(map); } @RequestMapping(value = "/info", method = RequestMethod.GET) @ApiOperation(value = "获取Redis信息") public Result info() { List infoList = new ArrayList<>(); Properties properties = redisTemplate.getConnectionFactory().getConnection().info(); Set keys = properties.keySet(); for (Object key : keys) { String value = properties.get(key).toString(); RedisInfo redisInfo = new RedisInfo(); redisInfo.setKey(key.toString()); redisInfo.setValue(value); infoList.add(redisInfo); } return ResultUtil.data(infoList); } }