天津建设银行官方网站电商设计网站模板
news/
2025/9/23 7:13:38/
文章来源:
天津建设银行官方网站,电商设计网站模板,怎么设立网站赚广告费,公司网站开发费摊销Redis设置hash#xff0c;为不同的field设置不同的过期时间 一、背景需求二、具体要求三、代码实现 一、背景需求
最近做了一个小需求#xff0c;由于系统对接#xff0c;导致我们的系统在高峰的时候CPU飙升#xff0c;所以需要在高峰的时候保护系统进程不受影响。 而且还… Redis设置hash为不同的field设置不同的过期时间 一、背景需求二、具体要求三、代码实现 一、背景需求
最近做了一个小需求由于系统对接导致我们的系统在高峰的时候CPU飙升所以需要在高峰的时候保护系统进程不受影响。 而且还需要我们知道当前对接的数据总量并且可以实时释放如果释放失败了还需要定时释放减少系统卡顿的同时不能对第三方产生影响。
此处肯定有人想到令牌桶算法或者redission。 SpringBoot基于guava集成令牌桶算法https://blog.csdn.net/qq_38254635/article/details/126398730 SpringBoot集成Redissonhttps://blog.csdn.net/qq_38254635/article/details/126398716 集成的虽好但我们用的场景单一集成还需要引入jar导致部署包变大所以我们需要手动搞一个。
二、具体要求
1、可以知道当前存在的总量 2、可实时对每个变量进行调整 3、变量的关闭失败后有自修复机制
三、代码实现
了解redisson的应该知道可以参考其做一个简易版。
package com;import com.alibaba.fastjson.JSONObject;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.TimeUnit;public class Test {Resourceprivate StringRedisTemplate redisTemplate;private final static Integer SWITCH_COUNT 3;public static final String BUSINESS business:;public static final String CHECK check;public static final String BUSINESS_CHECK BUSINESS CHECK;public Result doLink(String strJson) {if(!getCheck(strJson)) return Result.error(当前调用超上限请稍后重试);return Result.success();}private boolean getCheck(String code){MapObject, Object objectMap redisTemplate.opsForHash().entries(BUSINESS_CHECK);//如果为空则视为第一次使用直接放行if(null objectMap || objectMap.size() 0) {this.setKey(code);return true;}//清洗数据清理过期redisInteger count 0;//当前有效总量for(Map.EntryObject, Object entry : objectMap.entrySet()){String user entry.getKey().toString();if(StringUtils.isEmpty(redisTemplate.opsForValue().get(BUSINESS_CHECK _ user))) {redisTemplate.opsForHash().delete(BUSINESS_CHECK, user);continue;}count;}//校验是否超过上限if(count SWITCH_COUNT) return false;this.setKey(code);return true;}private void setKey(String code){redisTemplate.opsForHash().put(BUSINESS_CHECK, code, JSONObject.toJSONString(code));redisTemplate.opsForValue().set(BUSINESS_CHECK _ code, code,1, TimeUnit.MINUTES);}//清理当前调用线程redisprivate void after(String code){redisTemplate.opsForHash().delete(BUSINESS_CHECK, code);redisTemplate.delete(code);}}仅提供一个思路 大致思路redis存一个hash把hash中的field当做key再存一个有效期的key。 当线程结束时手动回收hash中的field及对应的key。 考虑回收会存在失败的情况所以在使用的时候需做一遍数据清洗。
此方式仅适用于count较小时使用允许调用次数较多时数据清洗会很消耗性能。
整理不易点个赞吧☺☺☺
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911708.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!