package cn.cetc54.platform.base.controller.manage; import cn.cetc54.platform.core.common.redis.RedisTemplateHelper; import cn.cetc54.platform.core.common.utils.ResultUtil; import cn.cetc54.platform.core.common.vo.PageVo; import cn.cetc54.platform.core.common.vo.Result; import cn.cetc54.platform.base.vo.RedisInfo; import cn.cetc54.platform.base.vo.RedisVo; import cn.cetc54.platform.core.common.utils.PageUtil; 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.data.redis.core.StringRedisTemplate; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.*; import java.util.concurrent.TimeUnit; /** * @author */ @Slf4j @RestController @Api(description = "Redis缓存管理接口") @RequestMapping("/platform/redis") @Transactional public class RedisController { /** * 最大获取10万个键值 */ private static final int maxSize = 100000; @Autowired private StringRedisTemplate redisTemplate; @Autowired private RedisTemplateHelper redisTemplateHelper; @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 = redisTemplateHelper.keys(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, "", redisTemplate.getExpire(s, TimeUnit.SECONDS)); 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.opsForValue().get(e.getKey()); if(value.length()>150){ value = value.substring(0, 150) + "..."; } } catch (Exception exception){ value = "非字符格式数据"; } e.setValue(value); }); 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.opsForValue().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.opsForValue().set(key ,value); }else if(expireTime>0){ redisTemplate.opsForValue().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.delete(redisTemplateHelper.keys("*")); 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); } }