From f701baaf04f0adcd11df1785229eaecbc2a46508 Mon Sep 17 00:00:00 2001 From: limqhz Date: Wed, 4 May 2022 02:45:31 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90redis=20&=20task?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 + .../java/com/quinn/common/QuinnConstant.java | 2 + .../com/quinn/controller/BlogController.java | 2 - .../quinn/controller/QuestionController.java | 2 - .../quinn/controller/SourceController.java | 3 +- .../quinn/service/impl/SourceServiceImpl.java | 21 + .../java/com/quinn/task/UpdateViewTask.java | 45 ++ src/main/java/com/quinn/utils/RedisUtils.java | 705 ++++++++++++++++++ src/main/resources/application.properties | 20 + src/main/resources/templates/source/list.html | 2 +- 10 files changed, 802 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/quinn/task/UpdateViewTask.java create mode 100644 src/main/java/com/quinn/utils/RedisUtils.java diff --git a/pom.xml b/pom.xml index dbffe41..041f0a1 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,12 @@ spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-data-redis + + org.thymeleaf.extras thymeleaf-extras-springsecurity5 diff --git a/src/main/java/com/quinn/common/QuinnConstant.java b/src/main/java/com/quinn/common/QuinnConstant.java index 8793500..4631093 100644 --- a/src/main/java/com/quinn/common/QuinnConstant.java +++ b/src/main/java/com/quinn/common/QuinnConstant.java @@ -6,4 +6,6 @@ public interface QuinnConstant { String GUN = "The emperor's new clothes"; + String SOURCE_KEY = "SOURCE_KEY_"; + } diff --git a/src/main/java/com/quinn/controller/BlogController.java b/src/main/java/com/quinn/controller/BlogController.java index 3321af1..03111af 100644 --- a/src/main/java/com/quinn/controller/BlogController.java +++ b/src/main/java/com/quinn/controller/BlogController.java @@ -117,11 +117,9 @@ public class BlogController { @GetMapping("/blog/read/{bid}") public String read(@PathVariable("bid") String bid,Model model){ Blog blog = blogService.getOne(new QueryWrapper().eq("bid", bid)); - // todo: redis缓存. 防止阅读重复 blog.setViews(blog.getViews()+1); blogService.updateById(blog); model.addAttribute("blog",blog); - // todo: 查询评论 List commentList = commentService.list(new QueryWrapper().eq("topic_id", bid).orderByDesc("gmt_create")); model.addAttribute("commentList",commentList); return "blog/read"; diff --git a/src/main/java/com/quinn/controller/QuestionController.java b/src/main/java/com/quinn/controller/QuestionController.java index 8266815..ab9577c 100644 --- a/src/main/java/com/quinn/controller/QuestionController.java +++ b/src/main/java/com/quinn/controller/QuestionController.java @@ -127,11 +127,9 @@ public class QuestionController { @GetMapping("/question/read/{qid}") public String read(@PathVariable("qid") String qid,Model model){ Question question = questionService.getOne(new QueryWrapper().eq("qid", qid)); - // todo: redis缓存. 防止阅读重复 question.setViews(question.getViews()+1); questionService.updateById(question); model.addAttribute("question",question); - // todo: 查询评论. List commentList = commentService.list(new QueryWrapper().eq("topic_id", qid).orderByDesc("gmt_create")); model.addAttribute("commentList",commentList); return "question/read"; diff --git a/src/main/java/com/quinn/controller/SourceController.java b/src/main/java/com/quinn/controller/SourceController.java index 5679e46..71efe97 100644 --- a/src/main/java/com/quinn/controller/SourceController.java +++ b/src/main/java/com/quinn/controller/SourceController.java @@ -10,6 +10,7 @@ import com.quinn.service.SourceCategoryService; import com.quinn.service.SourceCommentService; import com.quinn.service.SourceService; import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -129,7 +130,7 @@ public class SourceController { * @throws IOException */ @GetMapping("/source/download/{sid}") - public void read(HttpServletResponse response, @PathVariable("sid") String sid) throws IOException { + public void download(HttpServletResponse response, @PathVariable("sid") String sid) throws IOException { Source source = sourceService.getOne(new QueryWrapper().eq("id", sid)); //通知浏览器以附件形式下载 response.setHeader("Content-Disposition", diff --git a/src/main/java/com/quinn/service/impl/SourceServiceImpl.java b/src/main/java/com/quinn/service/impl/SourceServiceImpl.java index 171d452..224d708 100644 --- a/src/main/java/com/quinn/service/impl/SourceServiceImpl.java +++ b/src/main/java/com/quinn/service/impl/SourceServiceImpl.java @@ -5,6 +5,7 @@ import com.quinn.mapper.SourceMapper; import com.quinn.service.SourceService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.quinn.utils.OSSClientUtil; +import com.quinn.utils.RedisUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -26,10 +27,13 @@ public class SourceServiceImpl extends ServiceImpl impleme @Resource OSSClientUtil ossClientUtil; + @Resource + RedisUtils redisUtils; @Override public void downloadSource(ServletOutputStream outputStream, Source source) throws IOException { String sourceLink = source.getSourceLink(); + addDownLoadRecord(source); // 读取文件内容。 BufferedInputStream in = new BufferedInputStream(ossClientUtil.downloadFile(sourceLink)); BufferedOutputStream out = new BufferedOutputStream(outputStream); @@ -46,4 +50,21 @@ public class SourceServiceImpl extends ServiceImpl impleme in.close(); } } + + /** + * 更新页码 + * @param source + */ + private void addDownLoadRecord(Source source) { +// Integer downLoadTime = (Integer) redisUtils.get(QuinnConstant.SOURCE_KEY + source.getId()); +// int downTimes = 0; +// if (StringUtils.isEmpty(downLoadTime)){ +// downTimes = source.getDownRecord() + 1; +// }else { +// downTimes = downLoadTime + 1; +// } +// redisUtils.set(QuinnConstant.SOURCE_KEY + source.getId(),downTimes); + source.setDownRecord(source.getDownRecord() + 1); + updateById(source); + } } diff --git a/src/main/java/com/quinn/task/UpdateViewTask.java b/src/main/java/com/quinn/task/UpdateViewTask.java new file mode 100644 index 0000000..ccdcdca --- /dev/null +++ b/src/main/java/com/quinn/task/UpdateViewTask.java @@ -0,0 +1,45 @@ +package com.quinn.task; + +import com.quinn.common.QuinnConstant; +import com.quinn.pojo.Source; +import com.quinn.service.SourceService; +import com.quinn.utils.RedisUtils; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.List; + +/** + * + * @author limqsh + */ +//@Component +public class UpdateViewTask { + + @Resource + SourceService sourceService; + + @Resource + RedisUtils redisUtils; + + /** + * 每小时执行一次 + */ +// @Scheduled(cron = "0 0 */1 * * ?") + public void execute(){ + List list = sourceService.list(null); + if (!CollectionUtils.isEmpty(list)){ + list.forEach(x->{ + String downTimes = (String) redisUtils.get(QuinnConstant.SOURCE_KEY + x.getId()); + if (!StringUtils.isEmpty(downTimes)){ + x.setDownRecord(Integer.parseInt(downTimes)); + sourceService.updateById(x); + } + }); + } + } + +} diff --git a/src/main/java/com/quinn/utils/RedisUtils.java b/src/main/java/com/quinn/utils/RedisUtils.java new file mode 100644 index 0000000..93fb165 --- /dev/null +++ b/src/main/java/com/quinn/utils/RedisUtils.java @@ -0,0 +1,705 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.quinn.utils; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.*; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * @author / + */ +@Component +public class RedisUtils { + private static final Logger log = LoggerFactory.getLogger(RedisUtils.class); + private RedisTemplate redisTemplate; + + public RedisUtils(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + */ + public boolean expire(String key, long time) { + try { + if (time > 0) { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + return true; + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @param timeUnit 单位 + */ + public boolean expire(String key, long time, TimeUnit timeUnit) { + try { + if (time > 0) { + redisTemplate.expire(key, time, timeUnit); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + return true; + } + + /** + * 根据 key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(Object key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 查找匹配key + * + * @param pattern key + * @return / + */ + public List scan(String pattern) { + ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); + RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(); + while (cursor.hasNext()) { + result.add(new String(cursor.next())); + } + try { + RedisConnectionUtils.releaseConnection(rc, factory); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return result; + } + + /** + * 分页查询 key + * + * @param patternKey key + * @param page 页码 + * @param size 每页数目 + * @return / + */ + public List findKeysForPage(String patternKey, int page, int size) { + ScanOptions options = ScanOptions.scanOptions().match(patternKey).build(); + RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); + RedisConnection rc = Objects.requireNonNull(factory).getConnection(); + Cursor cursor = rc.scan(options); + List result = new ArrayList<>(size); + int tmpIndex = 0; + int fromIndex = page * size; + int toIndex = page * size + size; + while (cursor.hasNext()) { + if (tmpIndex >= fromIndex && tmpIndex < toIndex) { + result.add(new String(cursor.next())); + tmpIndex++; + continue; + } + // 获取到满足条件的数据后,就可以退出了 + if (tmpIndex >= toIndex) { + break; + } + tmpIndex++; + cursor.next(); + } + try { + RedisConnectionUtils.releaseConnection(rc, factory); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return result; + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 删除缓存 + * + * @param keys 可以传一个值 或多个 + */ + public void del(String... keys) { + if (keys != null && keys.length > 0) { + if (keys.length == 1) { + boolean result = redisTemplate.delete(keys[0]); + log.debug("--------------------------------------------"); + log.debug(new StringBuilder("删除缓存:").append(keys[0]).append(",结果:").append(result).toString()); + log.debug("--------------------------------------------"); + } else { + Set keySet = new HashSet<>(); + for (String key : keys) { + keySet.addAll(redisTemplate.keys(key)); + } + long count = redisTemplate.delete(keySet); + log.debug("--------------------------------------------"); + log.debug("成功删除缓存:" + keySet.toString()); + log.debug("缓存删除数量:" + count + "个"); + log.debug("--------------------------------------------"); + } + } + } + + // ============================String============================= + + /** + * 普通缓存获取 + * + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 批量获取 + * + * @param keys + * @return + */ + public List multiGet(List keys) { + List list = redisTemplate.opsForValue().multiGet(Sets.newHashSet(keys)); + List resultList = Lists.newArrayList(); + Optional.ofNullable(list).ifPresent(e-> list.forEach(ele-> Optional.ofNullable(ele).ifPresent(resultList::add))); + return resultList; + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间 + * @param timeUnit 类型 + * @return true成功 false 失败 + */ + public boolean set(String key, Object value, long time, TimeUnit timeUnit) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, timeUnit); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + // ================================Map================================= + + /** + * HashGet + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * hash递增 如果不存在,就会创建一个 并把新增后的值返回 + * + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + * @return + */ + public double hincr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, by); + } + + /** + * hash递减 + * + * @param key 键 + * @param item 项 + * @param by 要减少记(小于0) + * @return + */ + public double hdecr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, -by); + } + + // ============================set============================= + + /** + * 根据key获取Set中的所有值 + * + * @param key 键 + * @return + */ + public Set sGet(String key) { + try { + return redisTemplate.opsForSet().members(key); + } catch (Exception e) { + log.error(e.getMessage(), e); + return null; + } + } + + /** + * 根据value从一个set中查询,是否存在 + * + * @param key 键 + * @param value 值 + * @return true 存在 false不存在 + */ + public boolean sHasKey(String key, Object value) { + try { + return redisTemplate.opsForSet().isMember(key, value); + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 将数据放入set缓存 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSet(String key, Object... values) { + try { + return redisTemplate.opsForSet().add(key, values); + } catch (Exception e) { + log.error(e.getMessage(), e); + return 0; + } + } + + /** + * 将set数据放入缓存 + * + * @param key 键 + * @param time 时间(秒) + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSetAndTime(String key, long time, Object... values) { + try { + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) { + expire(key, time); + } + return count; + } catch (Exception e) { + log.error(e.getMessage(), e); + return 0; + } + } + + /** + * 获取set缓存的长度 + * + * @param key 键 + * @return + */ + public long sGetSetSize(String key) { + try { + return redisTemplate.opsForSet().size(key); + } catch (Exception e) { + log.error(e.getMessage(), e); + return 0; + } + } + + /** + * 移除值为value的 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + public long setRemove(String key, Object... values) { + try { + Long count = redisTemplate.opsForSet().remove(key, values); + return count; + } catch (Exception e) { + log.error(e.getMessage(), e); + return 0; + } + } + + // ===============================list================================= + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + log.error(e.getMessage(), e); + return null; + } + } + + /** + * 获取list缓存的长度 + * + * @param key 键 + * @return + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + log.error(e.getMessage(), e); + return 0; + } + } + + /** + * 通过索引 获取list中的值 + * + * @param key 键 + * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 + * @return + */ + public Object lGetIndex(String key, long index) { + try { + return redisTemplate.opsForList().index(key, index); + } catch (Exception e) { + log.error(e.getMessage(), e); + return null; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, Object value) { + try { + redisTemplate.opsForList().rightPush(key, value); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, Object value, long time) { + try { + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 根据索引修改list中的某条数据 + * + * @param key 键 + * @param index 索引 + * @param value 值 + * @return / + */ + public boolean lUpdateIndex(String key, long index, Object value) { + try { + redisTemplate.opsForList().set(key, index, value); + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } + + /** + * 移除N个值为value + * + * @param key 键 + * @param count 移除多少个 + * @param value 值 + * @return 移除的个数 + */ + public long lRemove(String key, long count, Object value) { + try { + return redisTemplate.opsForList().remove(key, count, value); + } catch (Exception e) { + log.error(e.getMessage(), e); + return 0; + } + } + + /** + * @param prefix 前缀 + * @param ids id + */ + public void delByKeys(String prefix, Set ids) { + Set keys = new HashSet<>(); + for (Long id : ids) { + keys.addAll(redisTemplate.keys(new StringBuffer(prefix).append(id).toString())); + } + long count = redisTemplate.delete(keys); + // 此处提示可自行删除 + log.debug("--------------------------------------------"); + log.debug("成功删除缓存:" + keys.toString()); + log.debug("缓存删除数量:" + count + "个"); + log.debug("--------------------------------------------"); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 22a9875..f38e8cb 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -6,3 +6,23 @@ oss.protocol=http oss.name=smartvenue oss.endPoint=http://oss-cn-beijing.aliyuncs.com oss.url=https://smartvenue.oss-cn-beijing.aliyuncs.com/ + +#redis配置 +#Redis服务器地址 +spring.redis.host=127.0.0.1 +#Redis服务器连接端口 +spring.redis.port=6379 +#Redis数据库索引(默认为0) +spring.redis.database=0 +#Redis数据库密码 +spring.redis.password= +#连接池最大连接数(使用负值表示没有限制) +spring.redis.jedis.pool.max-active=50 +#连接池最大阻塞等待时间(使用负值表示没有限制) +spring.redis.jedis.pool.max-wait=3000 +#连接池中的最大空闲连接 +spring.redis.jedis.pool.max-idle=20 +#连接池中的最小空闲连接 +spring.redis.jedis.pool.min-idle=2 +#连接超时时间(毫秒) +spring.redis.timeout=5000 diff --git a/src/main/resources/templates/source/list.html b/src/main/resources/templates/source/list.html index 9e35c80..d384aed 100644 --- a/src/main/resources/templates/source/list.html +++ b/src/main/resources/templates/source/list.html @@ -99,7 +99,7 @@