package com.ltkj.framework.config; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; 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.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.data.redis.serializer.StringRedisSerializer; import redis.clients.jedis.JedisPoolConfig; import java.io.*; import java.util.Properties; /** * redis配置 * * @author ltkj */ @Configuration @EnableCaching @Slf4j public class RedisConfig extends CachingConfigurerSupport { @Value ("${config.properties}") private String url; @Value ("${config.path}") private String path; @Bean @SuppressWarnings(value = {"unchecked", "rawtypes"}) public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate 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 JedisPoolConfig jedisPoolConfig() { JedisPoolConfig config = new JedisPoolConfig(); // 设置JedisPoolConfig的相关参数,例如最大连接数、最大空闲时间等 // config.setMinIdle(0); // config.setMaxIdle(8); // config.setMaxTotal(8); // config.setMaxWaitMillis(-1); // config.setTestOnBorrow(true); // config.setTestOnReturn(true); return config; } @Bean public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig) { JedisConnectionFactory factory = new JedisConnectionFactory(); // 从文件中读取配置信息 try { FileInputStream fis = null; Properties props = new Properties(); try { fis = new FileInputStream(url); } catch (FileNotFoundException e) { log.info("配置文件找不到 系统正在创建!"); File f = new File(path); if(!f.exists()){ f.mkdirs(); } File file = new File(url); try { FileWriter fileWriter = new FileWriter(file); fileWriter.write("ip = 你的主数据库连接ip地址\n"); fileWriter.write("prot = 你的主数据库连接端口\n"); fileWriter.write("name = 你的主数据库连接名称\n"); fileWriter.write("username = 你的主数据库连接用户名\n"); fileWriter.write("password = 你的主数据库连接密码\n"); fileWriter.write("hisenabled = 是否开启 his 从库数据库连接 (从数据源开关/默认关闭 fales)\n"); fileWriter.write("\n"); fileWriter.write("hisip = 你的 his 数据库连接ip地址\n"); fileWriter.write("hisprot = 你的 his 数据库连接端口\n"); fileWriter.write("hisname = 你的 his 数据库连接名称\n"); fileWriter.write("hisusername = 你的 his 数据库连接用户名\n"); fileWriter.write("hispassword = 你的 his 数据库连接密码\n"); fileWriter.write("\n"); fileWriter.write("pacsenabled = 是否开启pacs从库数据库连接 (从数据源开关/默认关闭 fales)\n"); fileWriter.write("pacsip = 你的pacs数据库连接ip地址\n"); fileWriter.write("pacsprot = 你的pacs数据库连接端口\n"); fileWriter.write("pacsname = 你的pacs数据库连接名称\n"); fileWriter.write("pacsusername = 你的pacs数据库连接用户名\n"); fileWriter.write("pacspassword = 你的pacs数据库连接密码\n"); fileWriter.write("\n"); fileWriter.write("lisenabled = 是否开启 lis 从库数据库连接 (从数据源开关/默认关闭 fales)\n"); fileWriter.write("lisip = 你的 lis 数据库连接ip地址\n"); fileWriter.write("lisprot = 你的 lis 数据库连接端口\n"); fileWriter.write("lisname = 你的 lis 数据库连接名称\n"); fileWriter.write("lisusername = 你的 lis 数据库连接用户名\n"); fileWriter.write("lispassword = 你的 lis 数据库连接密码\n"); fileWriter.write("redisIp = 你的redisIp地址\n"); fileWriter.write("redisProt = 你的redis端口\n"); fileWriter.write("redisIpDatabase = 你的redis链接库\n"); fileWriter.write("redisPassword = 你的redis密码\n"); fileWriter.write("\n"); fileWriter.close(); log.info("配置文件创建成功!"); } catch (IOException ioException) { log.info("配置文件创建失败 请联系管理员手动创建!"); ioException.printStackTrace(); } e.printStackTrace(); } props.load(fis); fis.close(); // 获取属性值并赋值 factory.setPoolConfig(jedisPoolConfig); // 设置Redis服务器的地址和端口号 factory.setHostName(props.getProperty("redisIp")); factory.setPort(Integer.parseInt(props.getProperty("redisProt"))); // 如果需要密码验证,设置密码 factory.setPassword(props.getProperty("redisPassword")); // 设置其他参数,如数据库索引等 factory.setDatabase(Integer.parseInt(props.getProperty("redisIpDatabase"))); // 最后,初始化连接 factory.afterPropertiesSet(); log.info("redis连接成功!!!"); } catch (IOException e) { log.info("redis连接失败 请联系管理员!"); e.printStackTrace(); } return factory; } @Bean public DefaultRedisScript limitScript() { DefaultRedisScript 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);"; } }