pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-admin/src/main/resources/application-dev.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-admin/src/main/resources/application-prod.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
pom.xml
@@ -31,6 +31,7 @@ <feign.version>2.2.6.RELEASE</feign.version> <feign-okhttp.version>11.0</feign-okhttp.version> <spring-boot-admin.version>2.3.1</spring-boot-admin.version> <redisson.version>3.15.2</redisson.version> </properties> <!-- ä¾èµå£°æ --> @@ -180,6 +181,13 @@ <version>${ruoyi-vue-plus.version}</version> </dependency> <!--redisson--> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>${redisson.version}</version> </dependency> </dependencies> </dependencyManagement> ruoyi-admin/src/main/resources/application-dev.yml
@@ -67,13 +67,38 @@ password: # è¿æ¥è¶ æ¶æ¶é´ timeout: 10s lettuce: pool: # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ min-idle: 0 # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ max-idle: 8 # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° max-active: 8 # #è¿æ¥æ± æå¤§é»å¡çå¾ æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ max-wait: -1ms # æ¯å¦å¼å¯ssl ssl: false --- # redisson 客æ·ç«¯é ç½® redisson: # çº¿ç¨æ± æ°é threads: 16 # Nettyçº¿ç¨æ± æ°é nettyThreads: 32 # ä¼ è¾æ¨¡å¼ transportMode: "NIO" # åèç¹é ç½® singleServerConfig: # 客æ·ç«¯åç§° clientName: ${ruoyi-vue-plus.name} # æå°ç©ºé²è¿æ¥æ° connectionMinimumIdleSize: 32 # è¿æ¥æ± å¤§å° connectionPoolSize: 64 # è¿æ¥ç©ºé²è¶ æ¶ï¼åä½ï¼æ¯«ç§ idleConnectionTimeout: 10000 # å½ä»¤çå¾ è¶ æ¶ï¼åä½ï¼æ¯«ç§ timeout: 3000 # 妿å°è¯å¨æ¤éå¶ä¹å åéæåï¼åå¼å§å¯ç¨ timeout 计æ¶ã retryAttempts: 3 # å½ä»¤éè¯åéæ¶é´é´éï¼åä½ï¼æ¯«ç§ retryInterval: 1500 # åå¸å订é è¿æ¥çæå°ç©ºé²è¿æ¥æ° subscriptionConnectionMinimumIdleSize: 1 # åå¸å订é è¿æ¥æ± å¤§å° subscriptionConnectionPoolSize: 50 # åä¸ªè¿æ¥æå¤§è®¢é æ°é subscriptionsPerConnection: 5 # DNSçæµæ¶é´é´éï¼åä½ï¼æ¯«ç§ dnsMonitoringInterval: 5000 ruoyi-admin/src/main/resources/application-prod.yml
@@ -67,13 +67,38 @@ password: # è¿æ¥è¶ æ¶æ¶é´ timeout: 10s lettuce: pool: # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ min-idle: 0 # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ max-idle: 8 # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° max-active: 8 # #è¿æ¥æ± æå¤§é»å¡çå¾ æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ max-wait: -1ms # æ¯å¦å¼å¯ssl ssl: false --- # redisson 客æ·ç«¯é ç½® redisson: # çº¿ç¨æ± æ°é threads: 16 # Nettyçº¿ç¨æ± æ°é nettyThreads: 32 # ä¼ è¾æ¨¡å¼ transportMode: "NIO" # åèç¹é ç½® singleServerConfig: # 客æ·ç«¯åç§° clientName: ${ruoyi-vue-plus.name} # æå°ç©ºé²è¿æ¥æ° connectionMinimumIdleSize: 32 # è¿æ¥æ± å¤§å° connectionPoolSize: 64 # è¿æ¥ç©ºé²è¶ æ¶ï¼åä½ï¼æ¯«ç§ idleConnectionTimeout: 10000 # å½ä»¤çå¾ è¶ æ¶ï¼åä½ï¼æ¯«ç§ timeout: 3000 # 妿å°è¯å¨æ¤éå¶ä¹å åéæåï¼åå¼å§å¯ç¨ timeout 计æ¶ã retryAttempts: 3 # å½ä»¤éè¯åéæ¶é´é´éï¼åä½ï¼æ¯«ç§ retryInterval: 1500 # åå¸å订é è¿æ¥çæå°ç©ºé²è¿æ¥æ° subscriptionConnectionMinimumIdleSize: 1 # åå¸å订é è¿æ¥æ± å¤§å° subscriptionConnectionPoolSize: 50 # åä¸ªè¿æ¥æå¤§è®¢é æ°é subscriptionsPerConnection: 5 # DNSçæµæ¶é´é´éï¼åä½ï¼æ¯«ç§ dnsMonitoringInterval: 5000 ruoyi-common/pom.xml
@@ -151,6 +151,12 @@ <artifactId>spring-boot-configuration-processor</artifactId> </dependency> <!--redisson--> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> </dependency> </dependencies> </project> ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
@@ -1,234 +1,219 @@ package com.ruoyi.common.core.redis; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import com.google.common.collect.Lists; import org.redisson.api.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundSetOperations; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import java.util.*; import java.util.concurrent.TimeUnit; /** * spring redis å·¥å ·ç±» * * @author ruoyi * @author shenxinquan **/ @SuppressWarnings(value = { "unchecked", "rawtypes" }) @SuppressWarnings(value = {"unchecked", "rawtypes"}) @Component public class RedisCache { @Autowired public RedisTemplate redisTemplate; public class RedisCache { /** * ç¼ååºæ¬ç对象ï¼IntegerãStringãå®ä½ç±»ç * * @param key ç¼åçé®å¼ * @param value ç¼åçå¼ */ public <T> void setCacheObject(final String key, final T value) { redisTemplate.opsForValue().set(key, value); } @Autowired private RedissonClient redissonClient; /** * ç¼ååºæ¬ç对象ï¼IntegerãStringãå®ä½ç±»ç * * @param key ç¼åçé®å¼ * @param value ç¼åçå¼ * @param timeout æ¶é´ * @param timeUnit æ¶é´é¢ç²åº¦ */ public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) { redisTemplate.opsForValue().set(key, value, timeout, timeUnit); } /** * ç¼ååºæ¬ç对象ï¼IntegerãStringãå®ä½ç±»ç * * @param key ç¼åçé®å¼ * @param value ç¼åçå¼ */ public <T> void setCacheObject(final String key, final T value) { redissonClient.getBucket(key).set(value); } /** * è®¾ç½®æææ¶é´ * * @param key Redisé® * @param timeout è¶ æ¶æ¶é´ * @return true=设置æåï¼false=设置失败 */ public boolean expire(final String key, final long timeout) { return expire(key, timeout, TimeUnit.SECONDS); } /** * ç¼ååºæ¬ç对象ï¼IntegerãStringãå®ä½ç±»ç * * @param key ç¼åçé®å¼ * @param value ç¼åçå¼ * @param timeout æ¶é´ * @param timeUnit æ¶é´é¢ç²åº¦ */ public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) { RBucket<T> result = redissonClient.getBucket(key); result.set(value); result.expire(timeout, timeUnit); } /** * è®¾ç½®æææ¶é´ * * @param key Redisé® * @param timeout è¶ æ¶æ¶é´ * @param unit æ¶é´åä½ * @return true=设置æåï¼false=设置失败 */ public boolean expire(final String key, final long timeout, final TimeUnit unit) { return redisTemplate.expire(key, timeout, unit); } /** * è®¾ç½®æææ¶é´ * * @param key Redisé® * @param timeout è¶ æ¶æ¶é´ * @return true=设置æåï¼false=设置失败 */ public boolean expire(final String key, final long timeout) { return expire(key, timeout, TimeUnit.SECONDS); } /** * è·å¾ç¼åçåºæ¬å¯¹è±¡ã * * @param key ç¼åé®å¼ * @return ç¼åé®å¼å¯¹åºçæ°æ® */ public <T> T getCacheObject(final String key) { ValueOperations<String, T> operation = redisTemplate.opsForValue(); return operation.get(key); } /** * è®¾ç½®æææ¶é´ * * @param key Redisé® * @param timeout è¶ æ¶æ¶é´ * @param unit æ¶é´åä½ * @return true=设置æåï¼false=设置失败 */ public boolean expire(final String key, final long timeout, final TimeUnit unit) { RBucket rBucket = redissonClient.getBucket(key); return rBucket.expire(timeout, unit); } /** * å é¤å个对象 * * @param key */ public boolean deleteObject(final String key) { return redisTemplate.delete(key); } /** * è·å¾ç¼åçåºæ¬å¯¹è±¡ã * * @param key ç¼åé®å¼ * @return ç¼åé®å¼å¯¹åºçæ°æ® */ public <T> T getCacheObject(final String key) { RBucket<T> rBucket = redissonClient.getBucket(key); return rBucket.get(); } /** * å é¤éå对象 * * @param collection å¤ä¸ªå¯¹è±¡ * @return */ public long deleteObject(final Collection collection) { return redisTemplate.delete(collection); } /** * å é¤å个对象 * * @param key */ public boolean deleteObject(final String key) { return redissonClient.getBucket(key).delete(); } /** * ç¼åListæ°æ® * * @param key ç¼åçé®å¼ * @param dataList å¾ ç¼åçListæ°æ® * @return ç¼åç对象 */ public <T> long setCacheList(final String key, final List<T> dataList) { Long count = redisTemplate.opsForList().rightPushAll(key, dataList); return count == null ? 0 : count; } /* */ /** * è·å¾ç¼åçlist对象 * * @param key ç¼åçé®å¼ * @return ç¼åé®å¼å¯¹åºçæ°æ® */ public <T> List<T> getCacheList(final String key) { return redisTemplate.opsForList().range(key, 0, -1); } /** * å é¤éå对象 * * @param collection å¤ä¸ªå¯¹è±¡ * @return */ public long deleteObject(final Collection collection) { return redissonClient.getKeys().delete(Arrays.toString(collection.toArray())); } /** * ç¼åSet * * @param key ç¼åé®å¼ * @param dataSet ç¼åçæ°æ® * @return ç¼åæ°æ®ç对象 */ public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) { BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key); Iterator<T> it = dataSet.iterator(); while (it.hasNext()) { setOperation.add(it.next()); } return setOperation; } /** * ç¼åListæ°æ® * * @param key ç¼åçé®å¼ * @param dataList å¾ ç¼åçListæ°æ® * @return ç¼åç对象 */ public <T> boolean setCacheList(final String key, final List<T> dataList) { RList<T> rList = redissonClient.getList(key); return rList.addAll(dataList); } /** * è·å¾ç¼åçset * * @param key * @return */ public <T> Set<T> getCacheSet(final String key) { return redisTemplate.opsForSet().members(key); } /** * è·å¾ç¼åçlist对象 * * @param key ç¼åçé®å¼ * @return ç¼åé®å¼å¯¹åºçæ°æ® */ public <T> List<T> getCacheList(final String key) { RList<T> rList = redissonClient.getList(key); return rList.readAll(); } /** * ç¼åMap * * @param key * @param dataMap */ public <T> void setCacheMap(final String key, final Map<String, T> dataMap) { if (dataMap != null) { redisTemplate.opsForHash().putAll(key, dataMap); } } /** * ç¼åSet * * @param key ç¼åé®å¼ * @param dataSet ç¼åçæ°æ® * @return ç¼åæ°æ®ç对象 */ public <T> boolean setCacheSet(final String key, final Set<T> dataSet) { RSet<T> rSet = redissonClient.getSet(key); return rSet.addAll(dataSet); } /** * è·å¾ç¼åçMap * * @param key * @return */ public <T> Map<String, T> getCacheMap(final String key) { return redisTemplate.opsForHash().entries(key); } /** * è·å¾ç¼åçset * * @param key * @return */ public <T> Set<T> getCacheSet(final String key) { RSet<T> rSet = redissonClient.getSet(key); return rSet.readAll(); } /** * å¾Hashä¸åå ¥æ°æ® * * @param key Redisé® * @param hKey Hashé® * @param value å¼ */ public <T> void setCacheMapValue(final String key, final String hKey, final T value) { redisTemplate.opsForHash().put(key, hKey, value); } /** * ç¼åMap * * @param key * @param dataMap */ public <T> void setCacheMap(final String key, final Map<String, T> dataMap) { if (dataMap != null) { RMap<String, T> rMap = redissonClient.getMap(key); rMap.putAll(dataMap); } } /** * è·åHashä¸çæ°æ® * * @param key Redisé® * @param hKey Hashé® * @return Hashä¸ç对象 */ public <T> T getCacheMapValue(final String key, final String hKey) { HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash(); return opsForHash.get(key, hKey); } /** * è·å¾ç¼åçMap * * @param key * @return */ public <T> Map<String, T> getCacheMap(final String key) { RMap<String, T> rMap = redissonClient.getMap(key); return rMap.getAll(rMap.keySet()); } /** * è·åå¤ä¸ªHashä¸çæ°æ® * * @param key Redisé® * @param hKeys Hashé®éå * @return Hash对象éå */ public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) { return redisTemplate.opsForHash().multiGet(key, hKeys); } /** * å¾Hashä¸åå ¥æ°æ® * * @param key Redisé® * @param hKey Hashé® * @param value å¼ */ public <T> void setCacheMapValue(final String key, final String hKey, final T value) { RMap<String, T> rMap = redissonClient.getMap(key); rMap.put(hKey, value); } /** * è·å¾ç¼åçåºæ¬å¯¹è±¡å表 * * @param pattern å符串åç¼ * @return 对象å表 */ public Collection<String> keys(final String pattern) { return redisTemplate.keys(pattern); } /** * è·åHashä¸çæ°æ® * * @param key Redisé® * @param hKey Hashé® * @return Hashä¸ç对象 */ public <T> T getCacheMapValue(final String key, final String hKey) { RMap<String, T> rMap = redissonClient.getMap(key); return rMap.get(hKey); } /** * è·åå¤ä¸ªHashä¸çæ°æ® * * @param key Redisé® * @param hKeys Hashé®éå * @return Hash对象éå */ public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) { RListMultimap rListMultimap = redissonClient.getListMultimap(key); return rListMultimap.getAll(hKeys); } /** * è·å¾ç¼åçåºæ¬å¯¹è±¡å表 * * @param pattern å符串åç¼ * @return 对象å表 */ public Collection<String> keys(final String pattern) { Iterable<String> iterable = redissonClient.getKeys().getKeysByPattern(pattern); return Lists.newArrayList(iterable); } } ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java
@@ -1,42 +1,69 @@ package com.ruoyi.framework.config; import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; import com.ruoyi.framework.config.properties.RedissonProperties; import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.codec.JsonJacksonCodec; import org.redisson.config.Config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; 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.serializer.StringRedisSerializer; import java.io.IOException; /** * redisé ç½® * * @author ruoyi * @author Lion Li */ @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); public class RedisConfig extends CachingConfigurerSupport { GenericFastJsonRedisSerializer serializer = new GenericFastJsonRedisSerializer(); StringRedisSerializer keySerializer = new StringRedisSerializer(); private static final String REDIS_PROTOCOL_PREFIX = "redis://"; private static final String REDISS_PROTOCOL_PREFIX = "rediss://"; // 使ç¨StringRedisSerializeræ¥åºåååååºååredisçkeyå¼ template.setKeySerializer(keySerializer); template.setValueSerializer(serializer); @Autowired private RedisProperties redisProperties; // Hashçkeyä¹éç¨StringRedisSerializerçåºååæ¹å¼ template.setHashKeySerializer(keySerializer); template.setHashValueSerializer(serializer); @Autowired private RedissonProperties redissonProperties; template.afterPropertiesSet(); return template; } @Bean(destroyMethod = "shutdown") @ConditionalOnMissingBean(RedissonClient.class) public RedissonClient redisson() throws IOException { String prefix = REDIS_PROTOCOL_PREFIX; if (redisProperties.isSsl()) { prefix = REDISS_PROTOCOL_PREFIX; } Config config = new Config(); config.setThreads(redissonProperties.getThreads()) .setNettyThreads(redissonProperties.getNettyThreads()) .setCodec(JsonJacksonCodec.INSTANCE) .setTransportMode(redissonProperties.getTransportMode()); RedissonProperties.SingleServerConfig singleServerConfig = redissonProperties.getSingleServerConfig(); // 使ç¨åæºæ¨¡å¼ config.useSingleServer() .setAddress(prefix + redisProperties.getHost() + ":" + redisProperties.getPort()) .setConnectTimeout(((Long) redisProperties.getTimeout().toMillis()).intValue()) .setDatabase(redisProperties.getDatabase()) .setPassword(redisProperties.getPassword()) .setTimeout(singleServerConfig.getTimeout()) .setRetryAttempts(singleServerConfig.getRetryAttempts()) .setRetryInterval(singleServerConfig.getRetryInterval()) .setSubscriptionsPerConnection(singleServerConfig.getSubscriptionsPerConnection()) .setClientName(singleServerConfig.getClientName()) .setIdleConnectionTimeout(singleServerConfig.getIdleConnectionTimeout()) .setSubscriptionConnectionMinimumIdleSize(singleServerConfig.getSubscriptionConnectionMinimumIdleSize()) .setSubscriptionConnectionPoolSize(singleServerConfig.getSubscriptionConnectionPoolSize()) .setConnectionMinimumIdleSize(singleServerConfig.getConnectionMinimumIdleSize()) .setConnectionPoolSize(singleServerConfig.getConnectionPoolSize()) .setDnsMonitoringInterval(singleServerConfig.getDnsMonitoringInterval()); return Redisson.create(config); } } ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,101 @@ package com.ruoyi.framework.config.properties; import lombok.Data; import lombok.NoArgsConstructor; import org.redisson.client.codec.Codec; import org.redisson.config.TransportMode; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * Redisson é ç½®å±æ§ * * @author Lion Li */ @Data @Component @ConfigurationProperties(prefix = "redisson") public class RedissonProperties { /** * çº¿ç¨æ± æ°é,é»è®¤å¼ = å½åå¤çæ ¸æ°é * 2 */ private int threads; /** * Nettyçº¿ç¨æ± æ°é,é»è®¤å¼ = å½åå¤çæ ¸æ°é * 2 */ private int nettyThreads; /** * ä¼ è¾æ¨¡å¼ */ private TransportMode transportMode; /** * åæºæå¡é ç½® */ private SingleServerConfig singleServerConfig; @Data @NoArgsConstructor public static class SingleServerConfig { /** * 客æ·ç«¯åç§° */ private String clientName; /** * æå°ç©ºé²è¿æ¥æ° */ private int connectionMinimumIdleSize; /** * è¿æ¥æ± å¤§å° */ private int connectionPoolSize; /** * è¿æ¥ç©ºé²è¶ æ¶ï¼åä½ï¼æ¯«ç§ */ private int idleConnectionTimeout; /** * å½ä»¤çå¾ è¶ æ¶ï¼åä½ï¼æ¯«ç§ */ private int timeout; /** * 妿å°è¯å¨æ¤éå¶ä¹å åéæåï¼åå¼å§å¯ç¨ timeout 计æ¶ã */ private int retryAttempts; /** * å½ä»¤éè¯åéæ¶é´é´éï¼åä½ï¼æ¯«ç§ */ private int retryInterval; /** * åå¸å订é è¿æ¥çæå°ç©ºé²è¿æ¥æ° */ private int subscriptionConnectionMinimumIdleSize; /** * åå¸å订é è¿æ¥æ± å¤§å° */ private int subscriptionConnectionPoolSize; /** * åä¸ªè¿æ¥æå¤§è®¢é æ°é */ private int subscriptionsPerConnection; /** * DNSçæµæ¶é´é´éï¼åä½ï¼æ¯«ç§ */ private int dnsMonitoringInterval; } }