feat: echache调整未redis
parent
58d4f4c9b6
commit
b37441d8de
@ -0,0 +1,47 @@
|
||||
######################################################################
|
||||
# Build Tools
|
||||
|
||||
.gradle
|
||||
/build/
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
|
||||
######################################################################
|
||||
# IDE
|
||||
|
||||
### STS ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### JRebel ###
|
||||
rebel.xml
|
||||
|
||||
### NetBeans ###
|
||||
nbproject/private/
|
||||
build/*
|
||||
nbbuild/
|
||||
dist/
|
||||
nbdist/
|
||||
.nb-gradle/
|
||||
|
||||
######################################################################
|
||||
# Others
|
||||
*.log
|
||||
*.xml.versionsBackup
|
||||
*.swp
|
||||
|
||||
!*/build/*.java
|
||||
!*/build/*.html
|
||||
!*/build/*.xml
|
@ -1,120 +1,120 @@
|
||||
//package com.ruoyi.web.controller.monitor;
|
||||
//
|
||||
//import java.util.ArrayList;
|
||||
//import java.util.Collection;
|
||||
//import java.util.HashMap;
|
||||
//import java.util.List;
|
||||
//import java.util.Map;
|
||||
//import java.util.Properties;
|
||||
//import java.util.Set;
|
||||
//import org.springframework.beans.factory.annotation.Autowired;
|
||||
//import org.springframework.data.redis.core.RedisCallback;
|
||||
//import org.springframework.data.redis.core.RedisTemplate;
|
||||
//import org.springframework.security.access.prepost.PreAuthorize;
|
||||
//import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
//import org.springframework.web.bind.annotation.GetMapping;
|
||||
//import org.springframework.web.bind.annotation.PathVariable;
|
||||
//import org.springframework.web.bind.annotation.RequestMapping;
|
||||
//import org.springframework.web.bind.annotation.RestController;
|
||||
//import com.ruoyi.common.constant.CacheConstants;
|
||||
//import com.ruoyi.common.core.domain.AjaxResult;
|
||||
//import com.ruoyi.common.utils.StringUtils;
|
||||
//import com.ruoyi.system.domain.SysCache;
|
||||
//
|
||||
///**
|
||||
// * 缓存监控
|
||||
// *
|
||||
// * @author ruoyi
|
||||
// */
|
||||
//@RestController
|
||||
//@RequestMapping("/monitor/cache")
|
||||
//public class CacheController
|
||||
//{
|
||||
// @Autowired
|
||||
// private RedisTemplate<String, String> redisTemplate;
|
||||
//
|
||||
// private final static List<SysCache> caches = new ArrayList<SysCache>();
|
||||
// {
|
||||
// caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息"));
|
||||
// caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息"));
|
||||
// caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典"));
|
||||
// caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码"));
|
||||
// caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
|
||||
// caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
|
||||
// caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
|
||||
// }
|
||||
//
|
||||
// @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
// @GetMapping()
|
||||
// public AjaxResult getInfo() throws Exception
|
||||
// {
|
||||
// Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
|
||||
// Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
|
||||
// Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
|
||||
//
|
||||
// Map<String, Object> result = new HashMap<>(3);
|
||||
// result.put("info", info);
|
||||
// result.put("dbSize", dbSize);
|
||||
//
|
||||
// List<Map<String, String>> pieList = new ArrayList<>();
|
||||
// commandStats.stringPropertyNames().forEach(key -> {
|
||||
// Map<String, String> data = new HashMap<>(2);
|
||||
// String property = commandStats.getProperty(key);
|
||||
// data.put("name", StringUtils.removeStart(key, "cmdstat_"));
|
||||
// data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
|
||||
// pieList.add(data);
|
||||
// });
|
||||
// result.put("commandStats", pieList);
|
||||
// return AjaxResult.success(result);
|
||||
// }
|
||||
//
|
||||
// @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
// @GetMapping("/getNames")
|
||||
// public AjaxResult cache()
|
||||
// {
|
||||
// return AjaxResult.success(caches);
|
||||
// }
|
||||
//
|
||||
// @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
// @GetMapping("/getKeys/{cacheName}")
|
||||
// public AjaxResult getCacheKeys(@PathVariable String cacheName)
|
||||
// {
|
||||
// Set<String> cacheKeys = redisTemplate.keys(cacheName + "*");
|
||||
// return AjaxResult.success(cacheKeys);
|
||||
// }
|
||||
//
|
||||
// @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
// @GetMapping("/getValue/{cacheName}/{cacheKey}")
|
||||
// public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey)
|
||||
// {
|
||||
// String cacheValue = redisTemplate.opsForValue().get(cacheKey);
|
||||
// SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue);
|
||||
// return AjaxResult.success(sysCache);
|
||||
// }
|
||||
//
|
||||
// @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
// @DeleteMapping("/clearCacheName/{cacheName}")
|
||||
// public AjaxResult clearCacheName(@PathVariable String cacheName)
|
||||
// {
|
||||
// Collection<String> cacheKeys = redisTemplate.keys(cacheName + "*");
|
||||
// redisTemplate.delete(cacheKeys);
|
||||
// return AjaxResult.success();
|
||||
// }
|
||||
//
|
||||
// @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
// @DeleteMapping("/clearCacheKey/{cacheKey}")
|
||||
// public AjaxResult clearCacheKey(@PathVariable String cacheKey)
|
||||
// {
|
||||
// redisTemplate.delete(cacheKey);
|
||||
// return AjaxResult.success();
|
||||
// }
|
||||
//
|
||||
// @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
// @DeleteMapping("/clearCacheAll")
|
||||
// public AjaxResult clearCacheAll()
|
||||
// {
|
||||
// Collection<String> cacheKeys = redisTemplate.keys("*");
|
||||
// redisTemplate.delete(cacheKeys);
|
||||
// return AjaxResult.success();
|
||||
// }
|
||||
//}
|
||||
package com.ruoyi.web.controller.monitor;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.redis.core.RedisCallback;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import com.ruoyi.common.constant.CacheConstants;
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.system.domain.SysCache;
|
||||
|
||||
/**
|
||||
* 缓存监控
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/monitor/cache")
|
||||
public class CacheController
|
||||
{
|
||||
@Autowired
|
||||
private RedisTemplate<String, String> redisTemplate;
|
||||
|
||||
private final static List<SysCache> caches = new ArrayList<SysCache>();
|
||||
{
|
||||
caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息"));
|
||||
caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息"));
|
||||
caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典"));
|
||||
caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码"));
|
||||
caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
|
||||
caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
|
||||
caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
|
||||
}
|
||||
|
||||
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
@GetMapping()
|
||||
public AjaxResult getInfo() throws Exception
|
||||
{
|
||||
Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
|
||||
Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
|
||||
Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
|
||||
|
||||
Map<String, Object> result = new HashMap<>(3);
|
||||
result.put("info", info);
|
||||
result.put("dbSize", dbSize);
|
||||
|
||||
List<Map<String, String>> pieList = new ArrayList<>();
|
||||
commandStats.stringPropertyNames().forEach(key -> {
|
||||
Map<String, String> data = new HashMap<>(2);
|
||||
String property = commandStats.getProperty(key);
|
||||
data.put("name", StringUtils.removeStart(key, "cmdstat_"));
|
||||
data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
|
||||
pieList.add(data);
|
||||
});
|
||||
result.put("commandStats", pieList);
|
||||
return AjaxResult.success(result);
|
||||
}
|
||||
|
||||
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
@GetMapping("/getNames")
|
||||
public AjaxResult cache()
|
||||
{
|
||||
return AjaxResult.success(caches);
|
||||
}
|
||||
|
||||
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
@GetMapping("/getKeys/{cacheName}")
|
||||
public AjaxResult getCacheKeys(@PathVariable String cacheName)
|
||||
{
|
||||
Set<String> cacheKeys = redisTemplate.keys(cacheName + "*");
|
||||
return AjaxResult.success(cacheKeys);
|
||||
}
|
||||
|
||||
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
@GetMapping("/getValue/{cacheName}/{cacheKey}")
|
||||
public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey)
|
||||
{
|
||||
String cacheValue = redisTemplate.opsForValue().get(cacheKey);
|
||||
SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue);
|
||||
return AjaxResult.success(sysCache);
|
||||
}
|
||||
|
||||
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
@DeleteMapping("/clearCacheName/{cacheName}")
|
||||
public AjaxResult clearCacheName(@PathVariable String cacheName)
|
||||
{
|
||||
Collection<String> cacheKeys = redisTemplate.keys(cacheName + "*");
|
||||
redisTemplate.delete(cacheKeys);
|
||||
return AjaxResult.success();
|
||||
}
|
||||
|
||||
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
@DeleteMapping("/clearCacheKey/{cacheKey}")
|
||||
public AjaxResult clearCacheKey(@PathVariable String cacheKey)
|
||||
{
|
||||
redisTemplate.delete(cacheKey);
|
||||
return AjaxResult.success();
|
||||
}
|
||||
|
||||
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||
@DeleteMapping("/clearCacheAll")
|
||||
public AjaxResult clearCacheAll()
|
||||
{
|
||||
Collection<String> cacheKeys = redisTemplate.keys("*");
|
||||
redisTemplate.delete(cacheKeys);
|
||||
return AjaxResult.success();
|
||||
}
|
||||
}
|
||||
|
@ -1,48 +1,48 @@
|
||||
//package com.ruoyi.framework.config;
|
||||
//
|
||||
//import java.nio.charset.Charset;
|
||||
//import org.springframework.data.redis.serializer.RedisSerializer;
|
||||
//import org.springframework.data.redis.serializer.SerializationException;
|
||||
//import com.alibaba.fastjson2.JSON;
|
||||
//import com.alibaba.fastjson2.JSONReader;
|
||||
//import com.alibaba.fastjson2.JSONWriter;
|
||||
//
|
||||
///**
|
||||
// * Redis使用FastJson序列化
|
||||
// *
|
||||
// * @author ruoyi
|
||||
// */
|
||||
//public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T>
|
||||
//{
|
||||
// public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
|
||||
//
|
||||
// private Class<T> clazz;
|
||||
//
|
||||
// public FastJson2JsonRedisSerializer(Class<T> clazz)
|
||||
// {
|
||||
// super();
|
||||
// this.clazz = clazz;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public byte[] serialize(T t) throws SerializationException
|
||||
// {
|
||||
// if (t == null)
|
||||
// {
|
||||
// return new byte[0];
|
||||
// }
|
||||
// return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public T deserialize(byte[] bytes) throws SerializationException
|
||||
// {
|
||||
// if (bytes == null || bytes.length <= 0)
|
||||
// {
|
||||
// return null;
|
||||
// }
|
||||
// String str = new String(bytes, DEFAULT_CHARSET);
|
||||
//
|
||||
// return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType);
|
||||
// }
|
||||
//}
|
||||
package com.ruoyi.framework.config;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import org.springframework.data.redis.serializer.RedisSerializer;
|
||||
import org.springframework.data.redis.serializer.SerializationException;
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.alibaba.fastjson2.JSONReader;
|
||||
import com.alibaba.fastjson2.JSONWriter;
|
||||
|
||||
/**
|
||||
* Redis使用FastJson序列化
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T>
|
||||
{
|
||||
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
|
||||
|
||||
private Class<T> clazz;
|
||||
|
||||
public FastJson2JsonRedisSerializer(Class<T> clazz)
|
||||
{
|
||||
super();
|
||||
this.clazz = clazz;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] serialize(T t) throws SerializationException
|
||||
{
|
||||
if (t == null)
|
||||
{
|
||||
return new byte[0];
|
||||
}
|
||||
return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);
|
||||
}
|
||||
|
||||
@Override
|
||||
public T deserialize(byte[] bytes) throws SerializationException
|
||||
{
|
||||
if (bytes == null || bytes.length <= 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
String str = new String(bytes, DEFAULT_CHARSET);
|
||||
|
||||
return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType);
|
||||
}
|
||||
}
|
||||
|
@ -1,69 +1,69 @@
|
||||
//package com.ruoyi.framework.config;
|
||||
//
|
||||
//import org.springframework.cache.annotation.CachingConfigurerSupport;
|
||||
//import org.springframework.cache.annotation.EnableCaching;
|
||||
//import org.springframework.context.annotation.Bean;
|
||||
//import org.springframework.context.annotation.Configuration;
|
||||
//import org.springframework.data.redis.connection.RedisConnectionFactory;
|
||||
//import org.springframework.data.redis.core.RedisTemplate;
|
||||
//import org.springframework.data.redis.core.script.DefaultRedisScript;
|
||||
//import org.springframework.data.redis.serializer.StringRedisSerializer;
|
||||
//
|
||||
///**
|
||||
// * redis配置
|
||||
// *
|
||||
// * @author ruoyi
|
||||
// */
|
||||
//@Configuration
|
||||
//@EnableCaching
|
||||
//public class RedisConfig extends CachingConfigurerSupport
|
||||
//{
|
||||
// @Bean
|
||||
// @SuppressWarnings(value = { "unchecked", "rawtypes" })
|
||||
// public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
|
||||
// {
|
||||
// RedisTemplate<Object, Object> template = new RedisTemplate<>();
|
||||
// template.setConnectionFactory(connectionFactory);
|
||||
//
|
||||
// FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
|
||||
//
|
||||
// // 使用StringRedisSerializer来序列化和反序列化redis的key值
|
||||
// template.setKeySerializer(new StringRedisSerializer());
|
||||
// template.setValueSerializer(serializer);
|
||||
//
|
||||
// // Hash的key也采用StringRedisSerializer的序列化方式
|
||||
// template.setHashKeySerializer(new StringRedisSerializer());
|
||||
// template.setHashValueSerializer(serializer);
|
||||
//
|
||||
// template.afterPropertiesSet();
|
||||
// return template;
|
||||
// }
|
||||
//
|
||||
// @Bean
|
||||
// public DefaultRedisScript<Long> limitScript()
|
||||
// {
|
||||
// DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
|
||||
// redisScript.setScriptText(limitScriptText());
|
||||
// redisScript.setResultType(Long.class);
|
||||
// return redisScript;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 限流脚本
|
||||
// */
|
||||
// private String limitScriptText()
|
||||
// {
|
||||
// return "local key = KEYS[1]\n" +
|
||||
// "local count = tonumber(ARGV[1])\n" +
|
||||
// "local time = tonumber(ARGV[2])\n" +
|
||||
// "local current = redis.call('get', key);\n" +
|
||||
// "if current and tonumber(current) > count then\n" +
|
||||
// " return tonumber(current);\n" +
|
||||
// "end\n" +
|
||||
// "current = redis.call('incr', key)\n" +
|
||||
// "if tonumber(current) == 1 then\n" +
|
||||
// " redis.call('expire', key, time)\n" +
|
||||
// "end\n" +
|
||||
// "return tonumber(current);";
|
||||
// }
|
||||
//}
|
||||
package com.ruoyi.framework.config;
|
||||
|
||||
import org.springframework.cache.annotation.CachingConfigurerSupport;
|
||||
import org.springframework.cache.annotation.EnableCaching;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.redis.connection.RedisConnectionFactory;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.data.redis.core.script.DefaultRedisScript;
|
||||
import org.springframework.data.redis.serializer.StringRedisSerializer;
|
||||
|
||||
/**
|
||||
* redis配置
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
@Configuration
|
||||
@EnableCaching
|
||||
public class RedisConfig extends CachingConfigurerSupport
|
||||
{
|
||||
@Bean
|
||||
@SuppressWarnings(value = { "unchecked", "rawtypes" })
|
||||
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
|
||||
{
|
||||
RedisTemplate<Object, Object> template = new RedisTemplate<>();
|
||||
template.setConnectionFactory(connectionFactory);
|
||||
|
||||
FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
|
||||
|
||||
// 使用StringRedisSerializer来序列化和反序列化redis的key值
|
||||
template.setKeySerializer(new StringRedisSerializer());
|
||||
template.setValueSerializer(serializer);
|
||||
|
||||
// Hash的key也采用StringRedisSerializer的序列化方式
|
||||
template.setHashKeySerializer(new StringRedisSerializer());
|
||||
template.setHashValueSerializer(serializer);
|
||||
|
||||
template.afterPropertiesSet();
|
||||
return template;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public DefaultRedisScript<Long> limitScript()
|
||||
{
|
||||
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
|
||||
redisScript.setScriptText(limitScriptText());
|
||||
redisScript.setResultType(Long.class);
|
||||
return redisScript;
|
||||
}
|
||||
|
||||
/**
|
||||
* 限流脚本
|
||||
*/
|
||||
private String limitScriptText()
|
||||
{
|
||||
return "local key = KEYS[1]\n" +
|
||||
"local count = tonumber(ARGV[1])\n" +
|
||||
"local time = tonumber(ARGV[2])\n" +
|
||||
"local current = redis.call('get', key);\n" +
|
||||
"if current and tonumber(current) > count then\n" +
|
||||
" return tonumber(current);\n" +
|
||||
"end\n" +
|
||||
"current = redis.call('incr', key)\n" +
|
||||
"if tonumber(current) == 1 then\n" +
|
||||
" redis.call('expire', key, time)\n" +
|
||||
"end\n" +
|
||||
"return tonumber(current);";
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue